-
Notifications
You must be signed in to change notification settings - Fork 38
20201109
David Chung edited this page Nov 9, 2020
·
1 revision
- 적용할 수 있는 부분이 더 많은 것 같아서 재미있었다.
- 아이템 6개는 버거운 느낌...
- 스터디 시간을 월요일로 옮긴 건 좋은 거 같다.
- 한 번만 읽을 책은 아니기 때문에 아이템 하나 하나 정리하기 보다는 훑어보는 느낌으로 해봤다.
- 무슨 질문을 해야할지 모르겠다...
- 너무 어렵거나 조금 동떨어진 내용은 마킹을 해서 물어보자.
- 내용적으로는 매우 재밌었다.
- 접근 제어자는 클라이언트단 코드가 아닌 라이브러리에서 사용될 때 더 큰 의미를 갖게된다.
- 클래스의 멤버 (특히 가변 객체나 배열)에 대한 접근 제어를 최소화함으로서 캡슐화와 디커플링, 그리고 스레드 안전성을 보장할 수 있다.
- 테스트 코드가 소스 코드와 동일한 패키지 구조에 속해있는 이유가 접근제어자의 동작방식에 있다.
- 모듈 시스템의 도입에 대해서는 보수적으로 지켜보자.
- 객체의 필드의 접근 제어자를 private으로 설정하고 getter와 setter를 제공하는 것이 베스트 프랙티스가 된 이유가 무엇인지에 대해 생각해보자.
- public 클래스가 아닌 경우 (특히 불변 필드인 경우)에는 public하게 열어놓아도 무관하다!
- 불변객체는 상태의 일관성이 보장되기 때문에 본질적으로 스레스 안전성을 보장하며 또한 예상치 못한 상태 변화로 인해 생기는 버그 및 문제점들로부터 안전하다.
- 불변객체의 단점은 많은 객체 생성이 강요된다는 점인데 성능 최적화를 위해 동반 클래스를 활용하거나 (e.g. StringBuilder) 객체 외부적으로만 불변성을 유지하고 내부적으로는 lazy 생성, 캐싱 등을 활용해 성능을 향상시키는 방법 등이 있다.
- 객체는 가능하면 불변객체로 정의하고, 불가능한 경우 가변성을 최소화하고 재사용을 금지하는 것을 지향한다 (e.g. CountDownLatch).
- 상속은 캡슐화를 해친다! 하위 클래스는 원천적으로 상위 클래스의 구현에 의존적일 수 밖에 없다.
- 컴포지션이라는 개념은 단순하게, 넓게 보자면 객체가 다른 객체를 포함하는 개념이다.
- 아이템에서 제안하는 객체의 확장은 정확히 말하자면 컴포지션만이 아닌 wrapper class 패턴 / Decorator 패턴을 통해 구현하는 것이다.
- 아이템의 핵심은 wrapper class 패턴을 활용하여 객체를 확장하면 캡슐화를 해치지 않으면서도 더 유연한 객체를 만들 수 있다는 것이다.
- 상속 관계에 있을 때 상위 클래스의 생성자가 하위 클래스 생성사보다 먼저 실행된다. 그렇기 때문에 상위 클래스의 생성자에서는 오버라이드 될 수 있는 메소드를 호출하면 안 된다.
- 객체의 확장은 가능하면 상속이 아닌 wrapper class 패턴을 활용해서 구현하자.
- 상속을 해야하는 경우에는 그에 맞춰 설계하고 문서화를 철저히 해야한다.
- 인터페이스와 추상 클래스의 자세한 차이는 이 문서를 참고해보면 좋을 거 같다.
- 인터페이스의 독보적인 장점은 다중상속을 통해 유연하게 객체를 확장할 수 있다는 것이다.
- 골격 구현과 같이 공유 로직을 추가하고 싶은 경우에는 추상 클래스와 같이 활용하는 것이 코드 재사용성과 확장성을 높여준다.