본문 바로가기

Daily/Dev Book Review9

[effective java] item 18 : 상속보다는 컴포지션을 사용하라 1. 구체클래스 상속의 위험성 다른 패키지의 구체 클래스를 상속하는 일은 위험하다 (인터페이스 상속말고, 구현 상속에서) 메서드 호출과 달리 상속은 캡슐화를 깨뜨린다. - 상위 클래스에 따라 하위클래스의 동작에 문제가 생기기 때문 (상위클래스의 릴리즈가 이뤄진다면?) '자기사용' : 자신의 다른 부분을 사용 > 내부 구현 방식이므로 오픈 api가 아니라 다름 릴리즈 변경, 삭제가능 하위 클래스가 깨지기 쉬운 이유 ㄱ. 상위 클래스의 메서드를 재정의 하여 하위클래스의 로직을 방어한다 (HashSet addAll() 예제) 상위클래스의 메서드 동작을 다시 구현하는게 어렵다. 시간도 더든다. 오류나 성능을 떨어뜨릴 수 있다. 하위클래스에서 접근 불가한 private 클래스를 써야하면 구현이 불가능하다. ㄴ. .. 2020. 2. 26.
[effective java] item 17 : 변경 가능성을 최소화하라 불변 클래스 : 그 인스턴스의 내부 값을 수정할 수 없는 클래스 예 ) String, Wrapper Class, BigInteger, BigDecimal - 설계 구현 사용이 쉽다. - 오류 여지가 적고 안전하다. 1. 불변 클래스 5가지 규칙 ㄱ. 객체의 상태를 변경하는 메서드(변경자)를 제공하지 않는다. (setter) ㄴ. 클래스를 확장할 수 없게 한다. (extend X) ㄷ. 모든 필드를 final로 선언한다 ㄹ. 모든 필드를 private으로 선언한다. [아이템 15] : 클래스와 멤버의 접근권한을 최소화하라 [아이템 16] : public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 ㅁ. 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다. - 객체 참조 X - ge.. 2020. 2. 20.
[effective java] item 16 : public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 1. 접근자와 변경자(mutator) 메서드를 활용해 데이터를 캡슐화 한다. ㄱ. public class @Getter @AllArgsConstructor public class Point{ private double x; private double y; } public class에서는 이 방식이 확실히 맞다. 접근자 제공으로 필드 공개를 안해서 클래스 내부를 마음대로 바꿀 수 있다. ㄴ. Package-private class || private 중첩 클래스 필드를 노출해도 문제가 없다. 클래스가 표현하려는 추상 개념만 올바르게 표현한다. 클라이언트 코드가 이 클래스 내부 표현에 묶이지만, 클라이언트도 어차피 이 클래스를 포함하는 패키지 안에서만 동작한다. 예제 코드 : https://github.co.. 2020. 2. 20.
[effective java] item 15 : 클래스와 멤버의 접근권한을 최소화하라 잘 설계된 컴포넌트 : 클래스 내부 데이터와 내부 구현정보를 외부 컴포넌트로부터 얼마나 잘 숨겼는가 오직 API를 통해서만 다른 컴포넌트와 소통한다. [정보은닉, 캡슐화] 1. 정보 은닉의 장점 ㄱ. 시스템 개발 속도를 높인다 - 여러 컴포넌트 병렬 개발 ㄴ. 시스템 관리 비용을 낮춘다 - 컴포넌트 교체 비용 하락 ㄷ. 성능 최적화에 도움이 된다 - 완성된 시스템을 프로파일리하고 최적화할 컴포넌트만 가능하다. [아이템 67 - 최적화는 신중히 하라] ㄹ. 소프트웨어 재사용성을 높인다 - 의존성이 낮은 컴포넌트라면 다른 환경에서도 유용 ㅁ. 큰 시스템을 제작하는 난이도를 낮춘다 - 개별 컴포넌트 동작 검증 2. 정보 은닉 기본원칙 모든 클래스와 멤버의 접근성을 가능한 한 좁힌다 (최대한 public을 지양.. 2020. 2. 20.