멤버에 대해서
정보 은닉, 혹은 캡슐화라고 하는 개념은 자바에서 중요하다. ( 물론 자바 뿐만이 아니겠지만 )
정보를 은닉하면
- 시스템 개발 속도가 높아진다. ( 여러 컴포넌트를 병렬로 개발할 수 있기 때문에 )
- 각 컴포넌트의 디버깅 속도가 빨라진다.
- 시스템 최적화가 더 쉽다.
- 소프트웨어의 재사용성이 높아진다.
- 단위 테스트를 진행하기 좋다.
멤버 ( 필드, 메서드, 중첩 클래스, 중첩 인터페이스 ) 에 부여할 수 있는 접근 수준은 네 가지다.
private class 는 상위 클래스에서만 접근이 가능하다.
protected 는 해당 패키지에서만 접근이 가능하고
public 은 모든 곳에서 접근할 수 있다.
클래스와 멤버에 대해서 effective java 에서 몇가지 가이드가 되어있다.
여기서 의아한 점은 다위 테스트의 진행이다. 테스트를 목적으로 클래스, 인터페이스의 멤버 접근 범위를 넓히려 할때가 있다. 만약 public 클래스의 private 멤버를 default ? ( package-private ) 까지 풀어주는 것은 허용할 수 있지만 그 이상은 안된다.
-> 테스트 코드를 테스트 대상과 같은 패키지에 두면 package-private 요소에 접근할 수 있기 때문이다.
public 클래스의 인스턴스 필드는 되도록 public 이 아니어야 한다.
-> 왜냐하면 필드가 가변 객체를 참조하거나, final 이 아닌 인스턴스 필드를 public 으로 선언하면 그 필드에 담을 값을 제한하는 힘이 없이지게 된다. 이 말은 immutable 하지 않다는 뜻이고 따라서 thread safe 하지 않게 된다.
우리가 흔히 클래스에 상수의 개념을 도입할때도 예를들어 보자
흔히 우리는 상수는 public static final 로 선언을 한다.
그러나 길이가 0 이 아닌 배열을 상수로 선언하게 되면 주의가 필요하다고 한다.
public static final Thing[] Values = {..};
이런 필드를 제공하게 된다면 클라이언트에서 그 배열의 내용을 수정할 수 있게 된다.
이를 해결하는 방법은 해당 상수를 은닉화 하고 ( private 로 ) Collections.unmodfiableList(Arrays.asList(..))를 하거나
values() {
PRIVATE_VALUES.clone();
}
과 같은 방법이 있다.
멤버에 대해서 알아봤다면
클래스는 어떨까 ?
public 클래스의 데이터 필드는 private 하게 선언되고 getter 와 setter 를 이요하는게 좋다.
immutable 하다는건 무엇을 뜻하는 것일까 ? 우리는 흔히 불변 클래스란 인스턴스의 내부 값을 수정할 수 없는 클래스를 말하는데
클래스를 불변으로 만들려면 다섯 가지 규칙을 따르면 된다.
1. 객체의 상태를 변경하는 메서드를 제공하지 않는다.
2. 클래스를 확장할 수 없도록 한다. -> 클래스에 final 을 붙인다.
3. 모든 필드를 final 로 선언한다.
4. 모든 필드를 private으로 선언한다.
5. 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다.
'개발 > java' 카테고리의 다른 글
자바 직렬화에 대한 생각정리 (0) | 2020.07.26 |
---|---|
객체의 생성 (0) | 2020.07.09 |
빌더로 생성자 대체하기 (0) | 2020.07.06 |
Iterator design pattern (0) | 2020.05.28 |
JPA 2차 캐시란 (0) | 2020.04.26 |
댓글