prgrms-web-devcourse / BE-Team-preArmand-Book-study

2 stars 2 forks source link

[아이템 17] 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다. #4

Closed epicblues closed 2 years ago

epicblues commented 2 years ago

page 106 첫 번째 문단

자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다. 클래스에 가변 객체를 참조하는 필드가 하나라도 있다면 클라이언트에서 그 객체의 참조를 얻을 수 없도록 해야 한다.

저는 이 문장을 아무 생각없이 getter를 추가하지 말자라는 뜻으로 해석했는데 다들 어떻게 생각하시나요? 구체적인 예를 들면, Lombok의 @Getter나 IDE에서 제공하는 getter 자동 완성과 같은 기능을 사용하기 전에 getter의 대상 필드가 참조 타입일 경우 getter를 사용하지 말라! 이런 식으로요!

그런데 저는 꼭 클라이언트가 참조 필드(예를 들어 컬렉션 등)를 사용하게 하고 싶으면 참조 필드의 복제본을 주는 방법 정도는 괜찮다고 생각하는데 이걸 getter로 하는 것은 이상할까요?

Leeyerimearth commented 2 years ago

저는 "접근할 수 없도록 한다"를 getter를 포함한 참조값을 얻을 수 있는 여러가지 방법 다 포함하여 접근하지 못하도록 해라 ! 라고 이해를 했습니다. 예를들면

  1. getter
  2. 필드를 private로 설정하지 않아서 직접 접근가능 한 것
  3. 메서드명이 getter는 아니지만 참조값을 리턴하는 것 이요.

복제본을 주는 방법을 책에서도 지향하는 것같은데, 개인적인 생각으로는 메서드명의 차이라고 생각합니다. 복제본 같은경우에 copy어쩌구 혹은 clone어쩌구와 같은 메서드명을 사용하지 않나요? 클라이언트쪽에서 받는값이 복제값이구나라는 것을 인지할 수 있지 않을까 생각합니다.

epicblues commented 2 years ago

아 그러네요. 복제본을 주는 것은 차라리 getter로 작성하기 보다는 copy나 clone 같은 메서드 명을 활용하는 것이 클라이언트 입장에서도 사용하기 편할 것 같습니다.