티스토리 뷰
* 이펙티브 자바 2/E를 읽고 공부하기 위해 기록한 게시글입니다.
14. public 클래스 안에는 public 필드를 두지말고 접근자 메서드를 사용하라
데이터 필드를 외부에서 직접 조작할 수 있는 클래스는 캡슐화의 이점을 누릴 수 없다.
- API를 변경하지 않고서는 내부 표현을 변경할 수 없고, 불변식도 강제할 수 없고, 필드를 사용하는 순간에 어떤 동작이 실행되도록 만들 수도 없다.
-> private 필드와 public 접근자 메서드(getter)로 변경하라! (변경 가능 클래스라면 수정자 메서드(setter)도 같이..)
= 꼭 getter/setter 메서드가 아니더라도, 메서드를 통해서만 필드에 접근/변경이 가능하도록 만들어라!!
@Getter @Setter
public class Point {
private double x;
private double y;
public Point(double x, double y) {
this.x = x;
this.y = y;
}
}
선언된 패키지 밖에서도 사용가능한 클래스는 getter 메서드를 제공하라. 그래야 클래스 내부 표현을 자유롭게 수정할 수 있게 된다.
- public 클래스의 데이터 필드를 외부에 공개해버리면 그 내부표현을 변경할 수 없게된다. 변경 시 이미 작성된 클라이언트 코드를 깨뜨리게 되기 때문. (확장에는 열려있고 변경에는 닫혀있는 OCP 원칙 위반?)
* default 클래스나 private 중첩 내부 클래스(nested class)는 데이터 필드를 public으로 공개하더라도 괜찮다.
- private 중첩 클래스의 경우 그 클래스의 바깥 클래스 외부의 코드는 아무런 영향을 받지 않기 때문.
(결론)
public 클래스의 변경 가능 필드는 private로 선언해두고 메서드(getter/setter 등)를 통해서만 접근/변경이 가능하도록 만들자.
'JAVA' 카테고리의 다른 글
상속 전에 데코레이터 패턴을 고려해보자 (0) | 2022.07.23 |
---|---|
변경 가능성을 최소화하라 (0) | 2022.07.23 |
클래스와 멤버의 접근 권한을 최소화하자 (0) | 2022.07.22 |
자연적 순서가 있는 객체는 Comparable 구현 (0) | 2022.07.22 |
객체 복제가 필요하다면 복사 생성자/팩토리 (0) | 2022.07.21 |
댓글