본문 바로가기
Language/Java

이펙티브 자바 - 클래스와 멤버 접근 권한

by ocwokocw 2021. 10. 19.

- 이 글은 Effective Java 를 기반으로 작성되었습니다.

- 개요

어떤 클래스가 잘 설계되었는지 판단할 수 있는 요소에는 여러 가지가 있지만, 그 중 하나는 구현 세부사항을 얼마나 잘 감추었는가이다. 이 규칙을 잘 지키면 각 모듈들끼리는 API 를 통해서만 의사소통하며 구현 세부사항은 각 모듈내부로 제한된다. 이것이 우리가 흔히 말하는 '정보은닉'과 '캡슐화'이다.


- 정보은닉

정보은닉은 모듈과 모듈사이의 의존성을 줄여주기때문에 중요하다. 모듈 사이의 의존성이 줄어들면 각각 개발, Test, 최적화, 변경을 손쉽게 할 수 있으며 대규모 시스템을 개발할때 위험(Risk)을 낮춰준다.

 

Java 에서 정보은닉을 구현하려면 클래스, 인터페이스 멤버들에 접근제어자를 사용해야 한다. 정보은닉을 위한 몇 가지 Tip 이 있지만 가장 중요한 대원칙은 정상동작을 보증한다는 전제하에 각 클래스와 멤버에 가능한 접근 불가능하도록 한다는것이다.


- 정보은닉을 위한 몇 가지 규칙들

중첩이 아닌 최상위 클래스와 인터페이스에는 public 과 package-private(default) 접근제어자를 이용할 수 있다. package-private 는 같은 패키지 내에서만 접근이 가능한 권한이다. 클래스를 관습적으로 public 으로 선언하는 경우가 많은데 사실 가능하다면 package-private 로 선언하는쪽으로 고려해야 한다. package-private 는 구현 세부사항이므로 변경해도 외부에 영향을 최대한 적게 미치는것을 보증해주기 때문이다.

 

package-private 로 선언된 클래스를 사용하는(참조하는) 클래스가 1개 뿐이라면 사용하는 클래스의 중첩 클래스로 변경가능한지 고려해보아야 한다. 같은 패키지내의 모든 클래스가 참조할 수 있는 접근권한에서 해당 클래스만 접근가능하도록 은닉할 수 있기 때문이다. 그렇지만 이 규칙보다 중요한건 public 클래스에 대한 접근권한을 package-private 로 줄이는것이 훨씬 중요하다.

 

public 클래스 멤버의 접근권한을 protected 로 선언하면 사용범위가 매우 넓어지므로 사용을 자제하는것이 좋다.

 

객체 필드는 절대로 public 으로 선언하면 안된다. 비-final, 변경가능 객체를 public 으로 하면 불변식을 강제할 수 없다. 또한 다중-스레드에서도 이슈가 있다. 이 규칙은 왠만하면 지키도록 하자.

 

클래스내의 상수의 경우 public static final 로 선언하여 공개할 수 있다. 보통의 경우 대문자와 언더스코어로 규칙으로 변수명을 선언한다.

 

0 이 아닌 배열의 경우 public static final 이나 필드 반환 접근자를 제공하면 안된다. 참조는 변경할 수 없을지 몰라도 배열의 내용은 변경가능하기 때문에 문제가 된다. 이를 해결하는 2 가지 방법이 있다. 첫번째는 public 을 private 로 변경하고 변경 불가 List(Collections.unmodifiableList) 를 반환하는것이다. 두번째는 public 을 private 로 변경하고 clone 하여 복사본을 반환하는 public 메소드를 추가한다.

댓글