///
Search
💡

item 16. public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 In public classes, use accessor methods, not public fields

접근자와 변경자?

좌표 정보를 담은 Point 객체를 구현해보자. 아무 역할이 없이 값만 가지고 있는 객체이다.
// Degenerate classes like this should not be public! class Point { public double x; public double y; }
Java
복사
public 필드를 가지고 있는 Point객체
// Encapsulation of data by accessor methods and mutators class Point { private double x; private double y; public Point(double x, double y) { this.x = x; this.y = y; } public double getX() { return x; } public double getY() { return y; } public void setX(double x) { this.x = x; } public void setY(double y) { this.y = y; } }
Java
복사
접근자와 변경자를 가지고 있는 Point
위처럼 필드에 대한 getter를 접근자, setter를 변경자라 부른다. pulbic 필드는 데이터 필드에 직접 접근할 수 있어 캡슐화의 이점을 제공하지 못한다.(item 15)
1.
필드에 대한 불변식이 깨지게 된다.
2.
API를 변경해야만 표현 방식을 바꿀 수 있다.
3.
필드를 읽을 때 부수 작업을 수행할 수 없다.
접근자와 제어자를 활용하면 클래스 내부 표현을 자유롭게 바꿀 수 있는 유연성을 얻을 수 있다. public 클래스가 필드를 공개하면 이를 사용하는 클라이언트가 생겨날 것이므로 내부 표현 방식을 마음대로 바꿀 수 없게 된다.

예외 : package-private 혹은 private 중첩 클래스

클래스의 접근제어자가 private한 class 들은 예외이다. 데이터 필드를 노출해도 문제가 없다. 그 클래스가 표현하려는 추상 개념만 올바르게 표현해주면 된다. 클라이언트 코드가 클래스 내부 표현에 묶이기는 하지만, 변경 여파가 패키지 내부에만 제한되므로 합리적이다.

getter, setter는 옳은가

친구들과 무분별한 getter, setter는 사실상 캡슐화를 깨는 것과 동일하지 않는가 하는 이야기를 자주 나누곤 했다. get/set을 지양하고 의미있는 메서드를 만들어 호출하는 것이 객체지향적인 코드를 작성하기 위한 원칙으로 삼았었다.
그러나 public 필드보다 많은 이점을 가지고 있다는 걸 이 책을 통해 느꼈다.

용어정리

한글명
영어명
불변식
invariant
보조자
auxiliary
적당한
adequate
레이더 화면에 보이는 에코
clutter
접근자
accessor
변경자
mutator