본문 바로가기

IT/오브젝트

ch.15 프레임워크와 코드 재사용 코드 재사용 대 설계 재사용 디자인패턴은 프로그래밍 언어에 독립적으로 재사용 가능한 설계 아이디어를 제공하는 것을 목적으로 한다. 따라서 언어에 종속적인 구현 코드를 정의하지 않기 때문에 프로그래밍 언어의 특성에 맞춰 가공해야 하고 매번 구현 코드를 재작성해야하는 단점이 있다. 재사용 관점에서 설계 재사용보다 더 좋은 방법은 코드 재사용이다. 컴포넌트를 조립해서 애플리케이션을 구축하는 방법을 추구해왔다. 해당 아이디어는 이상적이지만 실제로 작용하는 과정에서 현실적이지 않다라는 사실이 드러났다. 프레임워크란 추상 클래스나 인터페이스를 정의하고 인스턴스 사이의 상호작용을 통해 시스템 전체 혹은 일부를 구현해 놓은 재사용 가능한 설계. 또는 애플리케이션 개발자가 현재의 요구사항에 맞게 커스터마이징할 수 있는 ..
ch.13 서브클래싱과 서브타이핑 04. 리스코프 치환 원칙 한마디로 정리하면 서브타입은 그것의 기반 타입에 대해 대체 가능해야 한다. 즉 리스코프 치환 원칙에 따르면 자식 클래스가 부모클래스와 행동 호환성을 유지함으로써 부모 클래스를 대체할 수 있도록 구현된 상속 관계만을 서브타이핑이라고 불러야한다. 직사각형은 사각형이다. 하지만 직사각형은 정사각형이 아닐 수 있다. 사실 직사각형과 정사각형의 상속 관계는 리스코프 치환 원칙을 위반하는 고전적인 사례중 하나다. public class Rectangle { private int x, y, width, height; public Rectangle(int x, int y, int width, int height) { this.x = x; this.y = y; this.width = width..
ch 12. 다형성 04. 동적 메서드 탐색과 다형성 객체 지향 시스템은 다음 규칙에 따라 실행할 메서드를 선택한다. 메세지를 수신한 객체는 먼저 자신을 생성한 클래스에 적합한 메서드가 존재하는지 검사하고 존재하면 실행 메세드를 찾기 못했다면 부모 클래스에서 탐색, 이 과정은 적합한 메서드를 찾을때 까지 상속 계층을 따라 올라가며 계속된다. 상속 계층의 가장 최상위 클래스에도 메세드가 없다면 예외를 발생시키며 탐색을 중단한다. self 참조 객체가 메세지를 수신하면 컴파일러는 self 참조라는 임시 변수를 자동으로 생성한 후 메세지를 수신한 객체를 가리키도록 설정한다. 동적 메세드 탐색은 self가 가리키는 객체의 클래스에서 시작해서 상속 계층의 역방향으로 이뤄지며 메세드 탐색은 종료되는 순간 자동으로 소멸된다. 메세드 탐..
ch11. 합성과 유연한 설계 04. 믹스인 상속을 사용한다면 다른 클래스를 간편하게 재사용하고 점진적으로 확장할 수 있지만 부모 클래스와 자식 클래스와 강하게 결합되기 떄문에 수정과 확장에 취약한 설계를 낳게 된다. 믹스인은 객체를 생성할 때 코드 일부를 클래스 안에 섞어 넣어 재사용하는 기법을 가르키는 용어다. 합성이 실행 시점에 객체를 조합하는 재사용 방법이라면 믹스인은 컴파일 시점에 필요한 코드조각을 조합하는 재사용 방법 기본 정책 구현하기 abstract class BasicRatePolicy { def calculateFee(phone: Phone): Money = phone.calls.map(calculateCallFee(_)).reduce(_ + _) protected def calculateCallFee(call: C..
ch.10 상속과 코드 재사용 추상화에 의존하자. NightlyDiscountPhone의 가장 큰 문제점은 Phone에 강하게 결합돼 있다. 즉 Phone이 변경될 경우 함께 변경될 가능성이 높다. 이 문제를 해결하는 가장 일반적인 방법은 자식 클래스가 부모클래스의 구현이 아닌 추상화에 의존하도록 만드는 것이다. 상속을 도입할 때 따르는 두가지 원칙 두 메서드가 유사하게 보인다면 차이점을 메서드로 추출하라. 메서드 추출을 통해 두 메서드를 동일한 형태로 보이도록 만들 수 있다. 부모 클래스의 코드를 하위로 내리지 말고 자식 클래스의 코드를 상위로 올려라. 부모 클래스의 구체적인 메서드를 자식 클래스로 내리는 것보다 자식 클래스의 추상적인 메서드를 부모 클래스로 올리는 것이 재사용성과 응집도 측면에서 더 뛰어난 결과를 얻을 수 있다. ..
ch.09 유연한 설계 03. 의존성 주입 외부로 부터 독립적인 객체가 인스턴스를 생성한 후 이를 전달해서 의존성을 해결하는 방법을 의존성 주입이라고한다. 생성자 주입 : 객체를 생성하는 시점에 생성자를 통한 의존성 해결 setter 주입 : 객체 생성 후 setter 매서드를 통한 의존성 해결 메세드 주입 : 메서드 실행 시 인자를 이용한 의존성 해결 Movie movie = new Movie ("아바타", new 객체) 위와 같은 예시가 생성자 주입 movie.setName("아바타") 위와 같은 예시 setter 주입 movie.calculateDiscountAmount(screening, new AmountDiscountPolicy(....)) 위와 같은 예시가 메서드 주입 사실 위와 같은 메서드 의존성 주입의 한 종류..
DI(Dependency Injection) 와 IOC(inversion of control) 안녕하세요 남갯입니다 github.com/namget/object_study 오브젝트 5장 일단 오브젝트 스터디하는 내용의 과제로 오늘은 DI와 IOC를 알아보고 정리하는 시간을 가져보려고 합니다. DI 의존성 주입 의존성 주입이란? 소프트웨어 엔지니어링에서 의존성 주입(dependency injection)은 하나의 객체가 다른 객체의 의존성을 제공하는 테크닉이다. [위키 백과] 의존성 주입 ko.wikipedia.org/wiki/%EC%9D%98%EC%A1%B4%EC%84%B1_%EC%A3%BC%EC%9E%85 의존성 주입 - 위키백과, 우리 모두의 백과사전 위키백과, 우리 모두의 백과사전. 소프트웨어 엔지니어링에서 의존성 주입(dependency injection)은 하나의 객체가 다른 객체의 의존..
[오브젝트] 5장 책임 할당하기 안녕하세요 남갯입니다 오늘은 오브젝트 책임 할당하기 부분입니다. 일전에 봤던 코드들 4장에서 데이터 중심의 설계를 통해 작성한 코드가 있었습니다. 책임에 중점을 맞추지 않다보니 결합도가 올라가고 캡슐화가 잘 안되다보니 응집도도 내려가는 결과가 발생했습니다. 2장에서 책임 중심의 코드와 함께 4장에서 데이터 중심의 코드도 봤습니다. 이번에는 책임할당하기 편을 리뷰해보려고 합니다. 책임의 할당이란? 책임에 초점을 맞춰 설계할때 가장 큰 어려움은 어떤 객체에 어떤 책임을 할당할지 결정하기 어렵다는점입니다. 저도 객체지향.. 객체지향.. 어떤 책임을 할당할지 결정하기 쉽지 않았습니다. 책임의 할당과정은 트레이드 오프활동이다. GRASP 패턴 GRASP 패턴은 책임할당의 어려움을 해결하기 위한 답을 제시해줄것이다..