공부기록/객체지향 (21) 썸네일형 리스트형 12장. 다형성 상속은 타입 계층을 구조화하기 위해 사용해야 한다. 클라이언트 관점에서 인스턴스들을 동일하게 행동하는 그룹으로 묶어야 한다. 다형성 유니버셜 다형성 - 매개변수 다형성, 포함 다형성 임시 다형성 - 오버로딩 다형성, 강제 다형성 하나의 클래스안에 동일한 이름의 메서드가 존재하는 경우 - 오버로딩 다형성 강제 다형성 - + : 숫자면 덧셈, 문자열이 있으면 concat 매개변수 다형성 - 제네릭 프로그래밍 포함 다형성 - 수신한 객체의 타입에 따라 실제로 수행하는 행동이 달라지는 능력 - 일반적으로 객체지향에서 다형성이라 불리는 것 코드 재사용이 아닌 서브타입의 구현 - is-a ⇒ 포함 다형성에 대해 다룸 상속의 양면성 업캐스팅 동적 메서드 탐색 동적 바인딩 self 참조 super 참조 부모 클래스 타.. 오브젝트 11장 - 합성과 유연한 설계 합성을 이용하면 포함된 객체의 내부 구현이 변경되더라도 영향을 최소화할 수 있기 때문에 변경에 더 안정적인 코드를 얻을 수 있게 된다. 코드 작성 시점에 결정한 상속 관계는 변경이 불가능하지만 합성 관계는 실행 시점에 동적으로 변경할 수 있기 때문이다. 클래스 상속 - 화이트박스 재사용(상태를 알아야 하므로) 합성 - 블랙 박스 재사용(인터페이스를 통해서만 재사용) 상속을 합성으로 변경하기 불필요한 인터페이스 상속 문제 → 불필요한 인터페이스를 사용안해도 된다. 메서드 오버라이딩의 오작용 문제 → 포워딩을 사용하여 기존 인터페이스를 그대로 제공하면서, 구현에 결합없이 사용할 수 있다. 부모 클래스와 자식 클래스의 동시 수정문제 →합성으로 변경해도 해결되지는 않는다. 파급 효과를 캡슐화하여 그래도 더 낫다.. 오브젝트 10장 - 상속과 코드 재사용 전통적인 패러다임 → 코드를 재사용하는 방법은 코드를 복사한 후 수정하는 것 객체지향 패러다임 → 상속 또는 합성 10장에서는 상속, 11장에서는 합성에 대해 설명함 상속과 중복코드 중복코드 → 혼란야기 + 동료들을 의심하게 만든다 DRY 원칙 중복 코드는 변경을 방해한다. 중복 코드는 코드를 수정하는 데 필요한 노력을 몇 배로 증가시킨다. DRY원칙 = Don’t Repeat Yourself ⇒ 동일한 지식을 중복하지 마라 중복과 변경 책의 예제 코드 → 요구사항 변경으로 새로운 기능이 추가됨 → 상속으로 코드 중복을 줄임 상속을 위한 경고 1 → 자식 클래스의 메서드 안에서 super 참조를 이용해 부모 클래스의 메서드를 직접 호출할 경우 두 클래스는 강하게 결합된다. super 호출을 제거할 수 있.. 오브젝트 9장 - 유연한 설계 8장에서는 다양한 의존성 관리 기법들을 소개했음. 9장에서는 원칙이라는 관점에서 정리 개방-폐쇄 원칙 컴파일타임 의존성을 고정시키고 런타임 의존성을 변경하라 컴파일 타임 의존성 = 인터페이스나 추상 함수에 의존 런타임 의존성 = OCP로 가능성을 확장하고 수정할 수 있는 구조 추상화가 핵심이다 추상화에 의존하는 것 변경에 의한 파급효과를 최대한 피하기 위해서는 변하는 것과 변하지 않는 것이 무엇인지를 이해하고 이를 추상화의 목적으로 삼아야만 한다. 생성 사용 분리 객체에 대한 생성과 사용을 분리해야 한다. FACTORY 추가하기 객체 생성과 관련된 지식이 client에게 까지 새어나가기를 원하지 않는다. 객체 생성과 관련된 책임만 전담하는 별도의 객체 = FACTORY Client는 오직 사용과 관련된 .. 오브젝트 8장 - 의존성 관리하기 객체지향 설계의 핵심은 협력을 위해 필요한 의존성은 유지하면서도 변경을 방해하는 의존성은 제거하는 데 있다. 의존성 이해하기 변경과 의존성 의존성은 실행 시점과 구현 시점에 서로 다른 의미를 가진다. 구현 시점 → 인터페이스에 의존해야함 실행 시점 → 각각의 구현체에 의존해야함 (서로 다른게 유연하게 작성된 애플리케이션) 두 요소 사이의 의존성은 의존되는 요소가 변경될 때 의존하는 요소도 함께 변경될 수 있다는 것을 의미한다. 의존성 전이 의존성 - 의존하고 있는 대상의 변경에 영향을 받을 수 있는 가능성 직접 의존 - 직접 의존하는 것 간접 의존 - 한 단계 거치는 것, 해당 코드를 수정했을 때, 그것을 사용하는 코드들이 영향 받을 가능성이 있음 런타임 의존성과 컴파일타임 의존성 컴파일에는 인터페이스에.. 오브젝트 7장 - 객체 분해 문제 해결에 필요한 요소의 수가 단기 기억의 용량을 초과하는 순간 문제 해결 능력은 급격하게 떨어지고 만다. → 인지 과부하 큰 문제를 작은 문제로 나누는 것 ⇒ 분해 추상화를 더 큰 규모의 추상화로 압축시킴으로써 단기 기억의 한계를 초월할 수 있다. 프로시저의 추상화와 데이터 추상화 시스템을 분해하는 방법으로 둘 중 하나를 선택해야함 프로시저 추상화 → 기능 분해의 길, 알고리즘 분해 데이터 추상화 → 타입 추상화(추상 데이터 타입), 데이터를 중심으로 프로시저를 추상화(객체지향) 객체지향이 전통적인 기능 분해 방법에 비해 효과적이라고 하는 이유는 무엇일까? (전통적인 기능 분해 방법) → 객체지향 분해 방법에 이르는 좌절과 극복의 역사 프로시저 추상화와 기능분해 전통적인 기능 분해 방법은 하향식 접근.. Class Adapter vs Object Adapter class adapter는 이중상속(하나는 인터페이스)를 사용하는 어댑터이고, object adatper는 구성을 사용하는 어댑터이다. object adapter가 더 선호된다. 구성을 사용한다는 의미는 경우에 맞게 object adapter를 교체하여 adapter를 사용한다는 뜻이다. class adapter를 사용한다는 것은 이중상속을 사용한다는 것이고, A interface를 구현해야하는데, B class의 기능을 A interface의 함수로 실행하게 해서 adapter의 역할을 수행한다 오브젝트 6장 - 메시지와 인터페이스 책임은 메시지 기반( 아마도 다형성으로 서로 다른 객체가 같은 책임을 수행할 수 있을 것) 협력설명하기 위한 좋은 예시: 서버-클라이언트 모델 메시지는 결국 = 퍼블릭 인터페이스 좋은 인터페이스 = 최소한의 인터페이스와 추상적인 인터페이스 디미터의 법칙 = 낯선 자와 이야기하지 말아라. 인접한 이웃 하고만 말하라 부끄럼타는 코드 = 낮은 결합도 묻지 말고 시켜라 = 원칙을 따르면 밀접하게 연관된 정보와 행동을 함께 가지는 객체를 만들 수 있다. 의도를 드러내는 인터페이스 = 의도를 드러내는 선택자 디미터 법칙의 예외들 → 자료구조는 내부를 보여줘야 좋음. 설계는 트레이드 오프. 결합도와 응집도의 충돌 명령-쿼리 분리 원칙 프로시저 - 부수효과를 발생시킬 수 있지만, 반환값이 없다. 함수- 부수효과를 발생.. 오브젝트 5장 책임 할당하기 책임에 초점을 맞춰서 설계할 때 직면하는 가장 큰 어려움은 어떤 객체에게 어떤 책임을 할당할지를 결정하기가 쉽지 않다는 것. 다양한 책임할당방법이 존재. GRASP 패턴이 책임 할당의 어려움을 해결하기 위한 답을 제시해 줄 것이다. 객체에 책임을 할당하는 기본적인 원리를 살펴보자 책임 주도 설계를 향해 데이터보다는 행동을 결정 객체에게 중요한 것은 데이터가 아니라 외부에 제공하는 행동, 객체의 책임을 의미함. 데이터는 객체가 책임을 수행하는 데 필요한 재료를 제공할뿐이다. 데이터 중심의 질문 흐름 '이 객체가 포함해야 하는 데이터가 무엇인가' → '이 객체가 수행해야 하는 책임은 무엇인가' 객체 중심의 질문 흐름 '이 객체가 수행해야 하는 책임은 무엇인가' → '이 책임을 수행하는 데 필요한 데이터는 무.. 오브젝트 4장 - 설계 품질과 트레이드 오프 올바른 객체에게 올바른 책임을 할당하면서 낮은 결합도와 높은 응집도를 가진 구조를 창조하는 활동, 객체지향 설계의 핵심이 책임. 책임을 할당하는 작업이 응집도와 결합도 같은 설계 품질과 깊이 연관돼 있다는 것 변경 →비용 훌륭한 설계 → 변경에 드는 비용이 합리적인 선에서 되도록 적절한 비용 안에서쉽게 변경할 수 있는 설계는 응집도가 높고 서로 느슨하게 결합돼 있는 요소로 구성된다. 나쁜 설계와 좋은 설계를 비교하면서 살펴볼 때 효과가 좋다. 책임이 아닌 상태를 표현하는 데이터 중심의 설계를 살펴보고 객체지향적으로 설계한 구조와 어떤 차이점이 있는지 살펴본다. 상태를 분할의 중심축으로 삼는 방법 책임을 분할의 중식축으로 삼는 방법 책임에 맞추면 변경하기 쉽다. 책임은 인터페이스에 속한다. 상태를 객체 분.. 이전 1 2 3 다음