'03.03.13 story JAVA이야기2010. 4. 1. 13:31
12:30 ~ 3:00 effective 자바
03:00 ~ 06:00 오라클
06:00 ~ 8:00 노래방
10:00 ~ 취침
가변성을 최소화하자
불변 클래스를 만들 때는 다음 다섯가지 규칙을 따르자.
1. 객체의 상태를 변경하는 그 어떤 메소드도 제공하지 않는다.
2. 상속(inheritance)을 할 수없도록 하자.
3. 모든 필드를 final로 지정한다.
4. 모든 필드를 private으로 지정한다.
5. 가변 컴포넌트의 직접적인 외부 접근을 막자.
메소드에서 피연산자를 변경하지 않고 함수를 적용한 결과를 반환하기 때문에 함수적 방법이라고 한다.
이와는 반대로 절ㅊ적 또는 명령적 방법이 있는데 이 경우는 메소드에서 피 연산자에 대한 처리를 수행하므로 피연산자의 값이 변경된다.
불변객체는 자유롭게 공유될 수 있다.
한가지 방법은 public static final 상수로 제공하는 것이다.
public static final Complex ZERO = new Complex(0,0);
public static ginal Complex ONE = new Complex(1,0);
이 클래스를 참조하는 객체들은 자유롭게 ZERO,ONE 변수를 사용할 수 있다. 변경은 불가.
static 팩토리를 사용하면 클라이언트가 새로운 인스턴스를 생성하는 대신 기존 인스턴스를 공유하게 되므로, 메모리의 빈번한 할당과 해지를 줄이고 가비지 컬렉션의 부담을 줄여준다.
인스턴스가 가변적이어야 할 타당한 이유가 없다면, 그 클래스는 불변 클래스가 되어야 한다
그러므로, 필드를 final로하지 않아야 될 이유가 없는 한 모든 필드를 final로 만든다.
가급적 상속보다는 컴포지션을 사용하자
여기서의 상속의 의미는 클래스간의 상속을 의미한다. 인터페이스 상속은 아님
메소드 호출과는 달리 상속은 캡슐화를 위배한다. 달리 말해, 올바른 동작을 위해 서브 클래스는 자신의 수퍼 클래스가 구현하는 상세 내역에 의존한다는 것이다. 의존의존!!
슈퍼 클래스의 구현 내역은 소프트웨어 배포판이 바뀌면서 변경될 수 있다. 그렇게 된다면 서브 클래스의 코드를 그냥 사용하더라도 제대로 동작하지 않을 수 있다.
클래스의 확장 대신 기존 클래스(상속에서 수퍼 클래스에 해당되는)의 인스턴스를 참조하는 private 필드를 새로운 클래스에 둔다. 이런식의 설계를 컴포지션이라 한다.
그 이유는 기존 클래스가 새 클래스의 컴포넌트로 포함되기 때문이다. 새 클래스의 각 인스턴스 메소드에서는 포함된 기존 클래스 인스턴스의 대응되는 메소드를 호출하여 결과를 반환할 수 있다. 이것을 포워딩이라 하고 새 클래스의 메소드를 포워딩 메소드라 한다. 이렇게 하면, 새 클래스는 기존 클래스의 내부 구현에 종속되지 않고 강건하게 될 것이다.
수퍼 클래스에 새로운 메소드를 추가하더라도 새 클래스에는 영향을 주지 않는다.
'JAVA이야기' 카테고리의 다른 글
'10.03.17 story (0) | 2010.04.01 |
---|---|
'10.03.16 story (0) | 2010.04.01 |
'10.03.15 story (0) | 2010.04.01 |
'03.03.14 story (0) | 2010.04.01 |
'03.03.12 story (0) | 2010.04.01 |