아이템_15 클래스와 멤버의 접근 권한을 최소화하라
정보 은닉
- 다른 객체에게 자신의 정보를 숨기고 자신의 연산만을 통해 접근을 허용하는 것
- 여러 컴포넌트를 병렬로 개발 가능 (시스템 개발 속도 UP)
- 각 컴포넌트를 더 빨리 파악할 수 있고 교체 부담도 적음 (시스템 관리 비용 DOWN)
- 성능 최적화 도움
- 소프트웨어 재사용성 UP
// AS-IS
public class A{
private int a;
}
public class B{ // B가 A에서만 쓰이는 클래스라면?
private int b;
}
// TO-DO
public class A{
private int a;
private static class B{
private int b;
}
}
멤버 접근성의 제약
리스코프 치환 원칙에 의해 상위 클래스의 메소드를 재정의하는 경우, 그 접근 수준을 상위 클래스보다 좁게 설정할 수 없다.
이 규칙을 어기면 컴파일 오류가 발생한다.
(class가 interface를 구현하는 건 특별한 예외로, class의 메소드는 모두 public으로 선언해야 한다.)
public class A {
public void methodA() {
System.out.println("A!!");
}
}
public class B extends A {
@Override
private void methodA() {
System.out.println("B!!");
}
}
아이템_16 클래스와 멤버의 접근 권한을 최소화하라
class Point {
public int x;
public int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
- API를 수정하지 않고는 내부 표현을 바꿀 수 없음
- 불변식을 보장할 수 없음
- 외주에서 필드에 접근할 떄 부수 작업을 수행할 수 없음
아이템_17 변경 가능성을 최소화하라
불편 객체
- 인스턴스 내부의 값을 수정할 수 없는 객체
- 간직한 정보는 고정되어 객체가 파괴될 때 까지 달라지지 않아야한다.
- 자바 플랫폼 라이브러리에는 다음과 같은 불변 클래스가 있다 Ex) String,Integer,Double
final은 처음 초기화이후 불변인 상태를 만들어준다.
아이템_18 상속보다는 컴포지션을 사용하라
- 상속은 캡슐화를 깨트리게 되며, 상위 클래스에 의존적이여서 결합도가 높아진다
- 상위 클래스의 구현이 하위클래스에게 노출되기 때문에 자바이 원칙 중 하나인 캡슐화가 깨지게 됩니다.
- 상위클래스와 하위클래스의 관계가 컴파일 시점에 결정되어 구현에 의존하기 때문에 실행시점에 객체의 종류를 변경하는 것이 불가능하며 다형성과 같은 객체지향의 이점을 활용할 수 없다.
만약, 상위 클래스에 한 로직이 변경되었다고 가정하자. 하위 클래스가 재대로 동작을 한다는 보장이 과연 되는가?
하위 클래스에 변경이 전혀 없었지만 단순히 상위 클래스가 변경됨으로 인하여 하위 클래스가 오동작할 가능성이 충분히 있다.
상위 클래스에 의존하게 되어 종속적이고 변화에 유연하지 못한 상속보다는 조합을 한번 사용해보자.
하지만 조합이 상속보다 무조건 좋다는 것은 아니다.
상속이 적절하게 사용되면 조합보다 강력하고, 개발하기도 편한 부분도 있다.
상속을 적절하게 사용하기 위해서는 다음과 같은 최소 조건을 만족한 상태에서 사용하는 것을 추천한다.
-
- 확장을 고려하고 설계한 확실한 is - a 관계일
- API에 아무런 결합이 없는 경우, 결함이 있다면 하위 클래스까지 전파돼도 괜찮은 경우
이처럼 확실한 is - a 관계일 경우, 상위 클래스는 변할 일이 거의 없다.
향후 상속을 사용할 경우 확실한 is - a 관계인지 꼼꼼하게 고민해보고, 상위 클래스가 변화에 의해서 결함이 발생한 경우, 하위 클래스까지 영향이 가도 괜찮다는 결론이 생겼으면 상속을 사용해도 좋다.
정말 중요한 사실은 상속은 코드 재사용의 개념이 아니다.
상속은 반드시 확장이라는 관점에서 사용해야 한다는 것을 명심하자.
'JAVA' 카테고리의 다른 글
Effective java 정복기 3장 (0) | 2025.01.06 |
---|---|
ParallelStream은 무엇일까? (0) | 2024.12.01 |
스프링 첫요청이 처리되는데 오래 걸리는 이유 (0) | 2024.11.25 |