우테코의 프리코스를 진행하면서 객체지향에 대해 관심이 생겼고 이를 더 공부해보고 싶어서 '오브젝트' 라는 책을 공부하기로 했습니다!
유연성을 억제하면 코드를 이해하고 디버깅하기는 쉬워지지만 재사용성과 확장 가능성은 낮아진다.
자식 클래스가 부모 클래스를 대신하는 것을 '업캐스팅' 이라고 한다.
하나의 객체에게 동일한 메시지를 전송하지만 실행될 메서드는 메시지를 수신하는 객체의 클래스가 무엇이냐에 따라 달라진다 -> 다형성
메시지에 응답하기위한 메서드가 컴파일 시점이 아닌 실행 시점에 결정된다.
예외 케이스를 최소화하고 일관성을 유지할 수 있는 방법을 선택한다.
-> 할인 정책을 구현하고 있다면 null임을 확인해서 할인값을 0으로 설정하는 것이 아닌 NoneDiscountPolicy 클래스를 구현한다.
트레이드오프 : 하나를 얻으면 하나를 잃는 관계
상속의 단점 : 캡슐화가 약화된다. 부모클래스를 변경하면 자식 클래스도 변경될 확률을 높인다.
다형성이 지연 바인딩이라는 메커니즘을 통해 구현된다
-> 실행후에 연관되는 객체가 정해지는 것
합성 : 재사용을 없애기 위해 상속을 사용하는 방법 보다는 합성, 즉 객체를 속성으로 가져와서 사용하는 것이 더 좋은 방법이라는 것
객체지향에서 가장 중요한 것은 역할, 책임, 협력
객체는 자신의 상태를 직접 관리하고 스스로 결정해서 메세지에 응답한다. 자율성!
객체가 참여하는 협력이 객체를 구성하는 행동(책임)과 상태(속성) 모두를 결정한다.
객체를 '하는 것' 과 '아는 것'의 두가지 범주로 세분화 해보기
하는 것!
객체를 생성하거나 계산을 수행하는 등의 스스로 하는 것
다른 객체의 행동을 시작시키는 것
다른 객체의 활동을 제어하고 조절하는 것
아는 것!
사적인 정보에 관해 아는 것
관련된 객체에 관해 아는 것
자신이 유도하거나 계산할 수 있는 것에 관해 아는 것
'책임'을 능숙하게 객체에게 할당하는 것은 객체지향 개발에서 가장 중요한 능력이다.
협력에 필요한 지식과 방법을 '가장 잘 알고있는 전문가에게 그 책임을 할당하는 것.'