티스토리 뷰

728x90
반응형

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


  • 아래 클래스는 위치 정보를 가지는 Point 클래스이며, 멤버 변수의 접근제한자는 public으로 어디서든 접근할 수 있습니다. 그렇기 때문에 정보 은닉(캡슐화)을 할 수 없습니다.
public class Point {

    public double x;
    public double y;
}

 

데이터 캡슐화


  • 접근 제한자를 public -> private로 변경한 후 메서드를 통해 해당 필드에 접근할 수 있도록 변경합니다.
  • 이처럼 public 클래스에서 필드를 private로 선언한 뒤 getter/setter를 통해 캡슐화를 할 수 있습니다.
public 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 void setX(double x) {
        this.x = x;
    }

    public double getY() {
        return y;
    }

    public void setY(double y) {
        this.y = y;
    }
}

 

package-private 혹은 private 클래스로 데이터 캡슐화


  • 아래 예제는 private 중첩 클래스로서 ColorPoint 클래스에서는 Point 클래스에 접근이 가능하지만 ColorPoint 클래스 외부에서는 접근할 수 없습니다.
  • 클래스를 중첩시키는 방법은 클래스 선언면에서나 이를 사용하는 클라이언트 코드면에서나 접근자 방식보다 깔끔합니다.
  • 클래스를 중첩시키면 클라이언트 코드가 클래스 내부에 묶이기는 하지만 클라이언트도 어차피 이 클래스를 포함하는 패키지 안에서 동작하는 코드이므로 패키지 바깥 코드를 손대지 않고 데이터 표현방식을 변경할 수 있습니다.
  • private 중첩 클래스의 경우 수정 범위가 더 좁아져 이 클래스를 포함하는 외부 클래스까지 제한됩니다.
public class ColorPoint {

    @ToString
    private static class Point {
        public double x;
        public double y;
    }

    public Point getPoint() {
        Point point = new Point();
        point.x = 1.2;
        point.y = 1.5;

        return point;
    }
}

public class EffectiveJavaApplication {

    public static void main(String[] args) throws CloneNotSupportedException {
        ColorPoint colorPoint = new ColorPoint();
        System.out.println(colorPoint.getPoint()); // ColorPoint.Point(x=1.2, y=1.5)
    }
}

 

💡정리

  • public 클래스는 가변 필드를 노출해서는 안됩니다. 그렇다고 불변 필드라고해서 완전히 안심할 수는 없습니다.
  • package-private 클래스나 private 중첩 클래스에서는 필드를 노출하는게 좋을때도 있습니다.

 

 

참고자료)

https://velog.io/@alkwen0996/%EC%9D%B4%ED%8E%99%ED%8B%B0%EB%B8%8C-%EC%9E%90%EB%B0%94-%EC%95%84%EC%9D%B4%ED%85%9C16-public-%ED%81%B4%EB%9E%98%EC%8A%A4%EC%97%90%EC%84%9C%EB%8A%94-public-%ED%95%84%EB%93%9C%EA%B0%80-%EC%95%84%EB%8B%8C-%EC%A0%91%EA%B7%BC%EC%9E%90-%EB%A9%94%EC%84%9C%EB%93%9C%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%9D%BC

 

 

 

 

728x90
반응형