코드 재사용을 목적으로 상속을 사용하면 변경하기 어렵고 유연하지 못한 설계에 이를 확률이 높아진다. 상속의 목적은 코드 재사용이 아니다. 상속은 타입 계층을 구조화하기 위해 사용해야 한다. 상속을 이용해 자식 클래스를 추가하려 한다면 스스로에게 다음과 같이 질문해봐라. 상속을 사용하려는 목적이 단순히 코드를 재사용하기 위해서인가? 아니면 클라이언트 관점에서 인스턴스를 동일하게 행동하는 그룹으로 묶기 위해서인가? 이번 장에서는 상속의 관점에서 다형성이 구현되는 기술적인 메커니즘을 살펴보기로 한다. 이번 장을 읽고 나면 다형성이 런타임에 메시지를 처리하기 위해 적합한 메서드를 동적으로 탐색하는 과정을 통해 구현되며, 상속이 이런 메서드를 찾기 위한 일종의 탐색 경로를 클래스 계층 형태로 구현하기 위한 방법임..
✏️, 💡,❓ 해당 이모지는 저의 생각임을 나타냅니다. 상속과 합성은 객체지향 프로그래밍에서 가장 널리 사용되는 코드 재사용 기법이다.상속이 부모 클래스와 자식 클래스를 연결해서 부모 클래스의 코드를 재사용하는데, 합성은 전체를 표현하는 객체가 부분을 표현하는 객체를 포함해서 부분 객체의 코드를 재사용한다. 상속은 의존성이 컴파일타임에 해결되고 합성은 런타임에 해결된다. 상속은 is-a 관계이고, 합성은 has-a 관계이다. 합성은 포함되는 객체의 퍼블릭 인터페이스를 재사용한다. 따라서 상속 대신 합성을 사용하면 구현에 대한 의존성을 인터페이스에 대한 의존성으로 변경하면서 결합도를 낮춘다. 01 상속을 합성으로 변경하기상속을 했을 경우 세가지 문제가 발생한다.1) 불필요한 인터페이스 상속 문제자식 클..
✏️, 💡,❓ 해당 이모지는 저의 생각임을 나타냅니다. 객체지향 프로그래밍은 코드를 재사용하기 용이하다는 장점이 있다. 코드를 재사용하려는 동기 이면에는 중복된 코드를 제거하려는 욕망이 있다. 이번 장에서는 상속에 대해 알아본다. (전체 코드) 01 상속과 중복 코드중복 코드는 사람들의 마음속에 의심의 씨앗을 뿌린다. DRY 원칙프로그램의 본질은 비즈니스와 관련된 지식을 코드로 변환하는 것이다. 안타깝게도 이 지식은 항상 변하며 그에 맞춰 코드 역시 변경해야 한다.중복 코드는 코드를 수정하는 데 필요한 노력을 몇 배로 증가시킨다. 중복을 판단하는 기준은 변경이다. 요구사항이 변경됐을 때 두 코드를 함께 수정해야 한다면 이 코드는 중복이다. 신뢰할 수 있고 수정하기 쉬운 소프트웨어를 만드는 효과적인 ..
✏️, 💡,❓ 해당 이모지는 저의 생각임을 나타냅니다. 01 개방-폐쇄 원칙로버트 마틴은 변화에 유연하게 대응할 수 있는 설계를 위한 원칙 중 하나로 개방-폐쇄 원칙(Open-Clos Principle)을 고안했다.- 소프트웨어 개체(클래스, 모듈, 함수 등)은 확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다.- 확장에 열려있다: 요구사항이 변경될 때 새로운 동작을 추가해서 기능을 확장할 수 있다 / 수정에 닫혀있다: 기존 코드를 수정하지 않고도 애플리케이션 동작을 추가하거나 변경할 수 있다 컴파일타임 의존성을 고정시키고 런타임 의존성을 변경하라️의존성 관점에서 개방-폐쇄 원칙을 따르는 설계란 컴파일타임 의존성은 유지하면서 런타임 의존성의 가능성을 확장하고 수정할 수 있는 구조다. 추..
✏️, 💡,❓ 해당 이모지는 저의 생각임을 나타냅니다. 과도한 협력은 설계를 곤경에 빠트릴 수 있다. 협력은 객체가 다른 객체에 대해 알 것을 강요한다. 다른 객체와 협력하기 위해서는 그 객체가 존재한다는 사실을 알고 있어야 한다. 01 의존성 이해하기변경과 의존성협력할 때 두 객체 사이에 의존성이 존재하게 된다. 의존성은 1) 실행 시점과 2) 구현 시점에 서로 다른 의미를 가진다.1) 실행 시점: 의존하는 객체가 정상적으로 동작하기 위해서는 실행 시에 의존 대상 객체가 반드시 존재해야 한다.2) 구현 시점: 의존 대상 객체가 변경될 경우 의존하는 객체도 함께 변경된다. 의존성 전이의존성은 전이될 수 있다. 이전 'Screening'의 코드를 보았을 때 Screening이 Movie, LocalDat..
✏️, 💡,❓ 해당 이모지는 저의 생각임을 나타냅니다. 훌륭한 객체지향 코드를 위해선 클래스가 아니라 객체를 지향해야 한다. 좀 더 정확하게 말해선 객체가 수행하는 책임에 초점을 맞춰야 한다. 객체가 수신하는 메시지들이 객체의 퍼블릭 인터페이스를 구성한다.훌륭한 퍼블릭 인터페이스를 얻기 위해서 도움이 되는 설계 원칙과 기법이 필요하다. 이런 원칙과 기법을 살펴보는 것이 이번 장의 주제이다. 01 협력과 메시지메시지는 객체들이 협력하기 위해 사용할 수 있는 의사소통 수단이다. 메시지는 오퍼레이션명과 인자로 구성되며, 메시지 전송은 여기에 메시지 수신자를 추가한 것이다. 메시지를 수신했을 때 실제로 어떤 코드가 실행되는지는 메시지 수신자의 실제 타입이 무엇인가에 달려 있다.메시지를 수신했을 때 실제로 실행..