객체 지향의 모듈에서 중요한 특성을 뽑으라면 정보 은닉과 캡슐화가 있을 것입니다.
정보은닉은 모듈사이의 의존성을 낮추어 주어서 개별적으로 개발, 시험, 최적화한다는 특성에 목적을 두고 있습니다.
정보은닉과 캡슐화가 이루어진 모듈은 병렬적으로 개발할 수 있기 때문에 시스템 개발 속도가 올라가고
다른 모듈에 영향을 끼칠 걱정 없이 디버깅이 가능합니다.
이 외에도 유지보수의 용이성, 소프트웨어의 재사용 용이 등 여러가지 장점을 누리기 위해
정보은닉을 할 필요가 있습니다.
정보은닉의 핵심적인 원칙은 각 클래스와 멤버는 가능한 한 접근이 불가능 하도록 만들어야 한다는 점입니다.
자바는 네개의 접근 권한을 제공합니다.
private 클래스 내부에서만 접근이 가능합니다.
package-private 같은 패키지 내에서 접근이 가능합니다.
protected 선언된 클래스 및 하위 클래스에서 접근이 가능합니다.
public 어디서든 접근이 가능합니다.
코드의 쓰임새에 맞추돼 최대한 정보를 숨기는 것이 중요합니다.
코드와는 상관없이, API 등으로 배포할 때 한번 public으로 공개하면
그 이후에는 public 으로 돌리기 쉽지 않습니다. 이용자가 public을 참조하고 있을 가능성이 크니까요.
객체 필드(instance field)는 절대로 public으로 선언하면 안됩니다. 객체 필드를 public으로 선언하면
그 값이 수정이 가능하게 되서, 필드에 저장될 값을 제한할 수 없게됩니다.
당연히 다중 스레드에도 안전하지 못합니다.
스레드가 처리중인데 Student, Point 이렇게 프로그래머가 만든 참조 객체 안의 필드 값이 계속 바뀌면 데이터의 일관성이 유지될까요?
하지만 예외도 있습니다. 어떤 상수들이 결과물의 핵심적인 사항이 된다고 판단될 때 선언하는
public static final 필드를 사용해보신적이 있으실 겁니다.
이런 필드는 가끔 문자열로도 사용하기도 하는데요
이 필드도 반드시 기본 자료형 값을 가지거나, 변경이 불가능한 객체를 참조해야합니다. 변경이 가능하게 된다면
앞서 말한 단점들이 다 적용되게 되는거죠.
또한 길이가 0이 아닌 배열은 언제나 변경이 가능하므로, public static final 배열 필드를 두거나, 배열 필드를 반환하는 접근자를 정의해서는 안됩니다.
public static final Thing[] VALUES = { . . . }
// 이러면 안됩니다.
위의 코드는 아래처럼 list 반환을 통해 다른 객체로 만들어 활용하던가,
배열이 cloneable 을 구현하고 있음을 이용해 clone(); 메소드를 사용할 수도 있습니다.
private static final Thing[] PRIVATE_VALUES = { ... };
public static final List<Thing> VALUES=
Collections.unmodifiableList(Arrrays.asList(PRIVATE_VALUES));
private static final Thing[] PRIVATE_VALUES = { ... };
public static final Thing[] values(){
return PRIVATE_VALUES.clone();
}
'프로그래밍 > Java' 카테고리의 다른 글
디자인 패턴 - 데코레이터 패턴(Decorator Pattern) (0) | 2018.02.12 |
---|---|
자바 Exception 예외 (throwable, Error, Exception, RuntimeException) (0) | 2018.02.09 |
이펙티브 자바 규칙 12 - Comparable 구현을 고려하라 (0) | 2018.02.08 |