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

2021-12-17 23:33:21

#Java#Effective Java 3/E

다음과 같이 캡슐화되지 않은 class는 필드를 외부에서 직접 접근이 바로 가능하니 작성하지 않는 것이 좋다. (모듈간 독립성이 떨어짐)

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

외부에서 멤버필드 값을 조회,변경할떄는 getter , setter 방식을 사용한다.

public class Point {

    private double x;

    private double 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;
    }
}

public class라면 클래스 내부 표현 방식을 언제든지 바꿀 수 있는 유연성이 생긴다.

예를 들어 기존에 client가 필드를 직접 참조해서 사용하였을떄는 Point class의 내부 표현 방식을 바꾸기 어려울 것이다.

Point point = new Point();
doSomething(point.x);

private, default class라면 데이터 필드가 노출된다하더라도 문제가 없다. 그 class가 표현하고자 하는 추상 개념만 올바르게 표현해주면 된다. default class 인 경우 client도 같은 패키지에 있겠지만, 어차피 client도 해당 패키지안에서만 동작하는 class임으로 패키지 바깥과는 독립적이다. 따라서 패키지 바깥 쪽의 코드는 수정에는 닫혀있으면서 , 데이터 표현 방식의 변경에는 열려있다.

private 중첩 class의 경우에는 수정 범위가 더 좁아져서 이 class를 포함하는 외부class까지로 제한된다.

정리

public class는 가변 필드를 직접 노출해서는 안되고, 불변이라면 노출해도 덜 위험하지만 완전히 안전하지는 않다. default,private class에서는 필드를 노출하는 편이 나을떄도 있다.

프로필 이미지
@chani
바둑 좋아하는 개발자의 의미있는 학습 기록을 위한 공간입니다.

댓글

이 게시글에 대한 의견을 공유해주세요!

댓글