public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라(Effective Java).

Choizz·2023년 8월 16일
0

이펙티브 자바

목록 보기
12/13

이번 포스팅은 이펙티브 자바 아이템 중 "public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라"에 대한 내용입니다.

아래 코드처럼, 필드에 public 접근지시자를 사용하면 어떤 점이 좋지 않을지 생각해볼 기회가 됐으면 좋겠습니다!

class Point{
	public double x;
    public double y;
    
    //...
}

필드에 public 접근 지시자를 사용했을 경우 단점

캡슐화의 장점을 제공하지 못한다.

필드를 변경하려면 API를 변경해야 한다.

  • 만약 public 필드를 사용하는 API가 있다고 가정을 하면, 그 필드를 변경했을 경우 그것을 사용하는 API도 변경해햐 할 것입니다.
  • 유지 보수가 힘들어지게 됩니다.

필드에 접근할 때 부수 작업을 할 수 없다.

  • 예를 들어, x는 음수라면 예외를 던져야 하는 로직이 필요하다고 하면, x를 사용하는 클라이언트 코드의 메서드 마다 x가 음수가 음수인지 검증을 해줘야 할 것 입니다.
  • 언제든 x의 접근지시자가 public이기 때문에 어디서든 변경 가능성이 있기 때문입니다.

package-private 클래스 또는 private 중첩 클래스라면 데이터 필드를 노출해도 문제가 없습니다.

  • 왜냐하면, 사용하는 곳이 한정돼 있고, 외부에 공개가 되지 않기 때문입니다.
  • 그럼에도 public 필드를 사용하는 것은 지양해야한다고 생각합니다.

public 필드를 써야한다면 어떻게 써야 안전하게 쓸 수 있을까??

  • 만약, Point의 x, y 필드를 사용해야 한다고 가정하겠습니다.
  • x를 1, y를 2로 할당한 후 , calculate라는 메서드에 Point 객체를 파라미터로 받아 로직을 수행한 후 계산을 합니다.
  • 그 후에 x와 y를 출력했을 때, 처음에 할당한 1과 2가 출력을 보장하려면 calculate에서 x, y를 카피하여 사용해야 합니다.
public class Test{
	public static void main(String[] args){
		Point point = new Point();
        
        point.x = 1;
        point.y = 2;
        
        calculate(point);
        
        System.out.println(point.x);
        System.out.println(point.y);
    }
    
    public static void calculate(Point point){
    	Point localPoint = new Point();
        localPoint.x = point.x;
        localPoint.y = point.y;
        
        // localPoint를 사용하는 어떤 로직...
    }
}

정리

  • 필드는 public으로 설정하지 않고, private로 설정하여, 메서드로 접근하도록 하는 것이 좋을 것 같습니다.
  • 그래야 캡슐화와 은닉화를 활용하여 객체 지향적인 코드를 짤 수 있다고 생각합니다.

reference

profile
집중

1개의 댓글

comment-user-thumbnail
2023년 8월 16일

좋은 글 감사합니다.

답글 달기