본문 바로가기

오브젝트10

오브젝트 13 - 서브클래싱과 서브타이핑 오브젝트 13 - 서브클래싱과 서브타이핑 상속의 첫번째 용도는 타입 계층을 구현하는 것이다. 계층 안에서 부모 클래스는 일반적인 개념을 구현하고 자식 클래스는 특수한 개념을 구현한다. 상속의 두번째 용도는 코드 재사용이다. 간단한 선언만으로 부모 클래스의 코드를 재사용할 수 있다. 그러나 부모 클래스와 자식 클래스가 강결합 된다. 상속의 사용의 목표는 코드 재사용이 아닌 타입 계층을 구현하는 것이어야한다. 13.1 타입 13.1.1 개념 관점의 타입 개념 관점에서 타입이란 우리가 인지하는 세상의 사물의 종류를 의미한다. 어떤 대상이 타입으로 분류될 때 그 대상을 타입의 인스턴스라고 부른다. 일반적으로 타입의 인스턴스를 객체라고 부른다. 13.1.2 프로그래밍 언어 관점의 타입 프로그래밍 언어 관점에서 타.. 2024. 4. 9.
오브젝트 10 - 상속과 코드 재사용 오브젝트 10 - 상속과 코드 재사용 10.1 상속과 중복 코드 10.1.1 DRY 원칙 (Don't Repeat Yourself) 중복 코드를 제거해야하는 가장 큰 이유는, 중복 코드는 변경을 방해한다. 중복 여부를 판단하는 기준은 변경이다. 요구사항이 변경됐을 때 두 코드를 함께 수정해야 한다면 이 코드는 중복이다. 신뢰할 수 있고 수정하기 쉬운 소프트웨어를 만드는 효과적인 방법 중 하나는 중복을 제거하는 것이다. 10.1.2 중복과 변경 중복코드 살펴보기 일반 요금제와 심야 할인 요금제가 필요하다. public class Phone { private Money amount; private Duration seconds; private List calls = new Arraylist(); public.. 2024. 3. 26.
오브젝트 09 - 유연한 설계 오브젝트 09 - 유연한 설계 9.4 의존성 역전 원칙 9.4.1 추상화와 의존성 역전 public class Movie { private AmountDiscountPolicy discountPolicy; } 상위 수준 클래스인 Movie가 하위 수준 클래스인 AmountDiscountPolicy에 의존하고 있다. 상위 수준의 클래스가 하위 수준의 클래스에 의존하면 하위 수준의 변경에 의해 상위 수준 클래스가 영향을 받는다. 의존성 방향은 상위에서 하위로 흘러야 한다. 위와 같은 코드는 클래스의 결합도가 높아지고 재사용성과 유연성이 저해된다. Movie와 AmountDiscountPolicy 모두 추상화에 의존하도록 수정해 문제를 해결할 수 있다. 하위 클래스 변경이 상위 클래스에 영향을 주는 것을 방지.. 2024. 3. 25.
오브젝트 07 - 객체 분해 오브젝트 07 - 객체 분해 가장 일반적인 추상화 방법은 한 번에 다뤄야 하는 문제의 크기를 줄이는 것이다. 사람들은 한 번에 해결하기 어려운 커다란 문제에 맞닥뜨릴 경우 해결 가능한 작은 문제로 나누는 경향이 있다. 이렇게 나눠진 문제들 역시 한 번에 해결하기 어려울 정도로 크다면 다시 더 작은 문제로 나눌 수 있다. 이처럼 큰 문제를 해결 가능한 작은 문제로 나누는 작업을 분해(decomposition)라고 부른다. 7.1 프로시저 추상화와 데이터 추상화 현대적인 프로그래밍 언어를 특징 짓는 중요한 두가지 추상화 메커니즘은 프로시저 추상화와 데이터 추상화다. 프로시저 추상화는 소프트웨어가 무엇을 해야 하는지를 추상화한다. 데이터 추상화는 소프트웨어가 무엇을 알아야 하는지를 추상화한다. 소프트웨어는 데.. 2024. 3. 5.
오브젝트 06 - 메시지와 인터페이스 06 오브젝트 - 메시지와 인터페이스 훌륭한 객체지향 코드를 얻기 위해서는 클래스가 아니라 객체를 지향해야 한다. 더 정확히는, 협력 안에서 객체가 수행하는 책임에 초점을 맞춰야 한다. 객체지향 애플리케이션의 가장 중요한 재료는 클래스가 아니라 객체들이 주고받는 메시지다. 6.1 협력과 메시지 6.1.1 클라이언트-서버 모델 협력은 어떤 객체가 다른 객체에게 무언가 요청할 때 시작된다. 객체가 다른 객체에게 접근할 수 있는 유일한 방법은 메시지를 전송하는 것뿐이다. 두 객체 사이의 협력 관계를 설명하기 위해 전통적으로 클라이언트-서버 모델이라는 메타포를 사용한다. 협력안에서 메시지를 전송하는 객체를 클라이언트, 메시지를 수신하는 객체를 서버라고 부른다. 객체는 협력에 참여하는 동안 클라이언트와 서버의 역.. 2024. 2. 26.
오브젝트 05 - 책임 할당하기 오브젝트 05 - 책임 할당하기 5.1 책임 주도 설계를 향해 5.1.1 협력이라는 문맥 안에서 책임을 결정하라 객체에게 할당된 책임이 협력에 어울리지 않는다면 그 책임은 나쁜 것이다. 객체의 입장에서는 책임이 조금 어색해 보이더라도 협력에 적합 하다면 그 책임은 좋은것이다. 협력을 시작하는 주체는 메시지 전송자이기 때문에 좋은 책임이란 메시지 전송자에게 적합한 책임을 의미한다. 메시지를 먼저 결정하면 메시지 수신자에 대한 정보가 없기 때문에 전송자의 관점에서 메시지 수신자가 깔끔하게 캡슐화된다. 5.2 책임 할당을 위한 GRASP 패턴 - 대중적으로 가장 널리 알려진 객체지향 패턴 5.2.1 도메인 개념에서 출발하기 설계를 시작하기 전 도메인에 대한 모습을 대략적으로 그려 보는것은 유용하다. 도메인 개.. 2024. 2. 20.
728x90
반응형