📖/오브젝트

이 글은 오브젝트라는 책을 읽고 정리한 글입니다. 부록 C장에서는 정적인 코드가 동적인 협력을 이끄는 것이 아니라 동적인 협력을 기반으로 정적인 코드를 구현해야 한다는 사실을 설명합니다. 프로그래머가 객체지향 프로그램을 작성하기 위해서는 두 가지 모델을 동시에 마음 속에 그려야한다. 동적 모델(dynamic model) : 프로그램 실행 구조를 표현하는 움직이는 모델 정적 모델(static model) : 코드의 구조를 담는 고정된 모델 객체지향 세계에서 동적 모델은 객체와 협력으로 구성된다. 객체지향 세계에서 정적 모델은 타입과 관계로 구성된다. 타입은 객체를 분류하기 위한 틀로서 동일한 타입에 속하는 객체들이 수행할 수 있는 모든 행동들을 압축해서 표현한 것이다. 정적 모델은 동적 모델에 의해 주도돼..
이 글은 오브젝트라는 책을 읽고 정리한 글입니다. 부록 B장을 읽고 나면 상속이 아닌 다른 방법으로도 타입 계층을 구현할 수 있다는 사실을 알게 될 것입니다. 타입 계층은 동일한 메시지에 대한 행동 호환성을 전제로 하기 때문에 여기서 언급하는 모든 방법은 타입 계층을 구현하는 방법인 동시에 다형성을 구현하는 방법이기도 하다. 여기서 제시하는 방법을 이용해 타입과 타입 계층을 구현한다고 해서 서브타이핑 관계가 보장되는 것은 아니다. 클래스를 이용한 타입 계층 구현 타입은 객체의 퍼블릭 인터페이스를 가리키기 때문에 결과적으로 클래스는객체의 타입과 구현을 동시에 정의하는 것과 같다. 이것이 객체지향 언어에서 클래스를 사용자 정의 타입이라고 부르는 이유다. 클래스는 타입을 구현할 수 있는 다양한 방법 중 하나일..
이 글은 오브젝트라는 책을 읽고 정리한 글입니다. 부록 A장에서는 객체들이 협력을 위해 따라야 하는 약속을 계약의 관점에서 설명합니다. 인터페이스만으로는 객체의 행동에 관한 다양한 관점을 전달하기 어렵다는 것이다. 우리에게 필요한 것은 명령의 부수효과를 쉽고 명확하게 표현할 수 있는 커뮤니케이션 수단이 필요하며, 이때 계약에 의한 설계(Design By Contract, DBC) 가 주는 혜택으로 눈을 돌릴 때가 된 것이다. 협력과 계약 부수효과를 명시적으로 계약에 의한 설계를 사용하면 제약 조건을 명시적으로 표현하고 자동으로 문서화할 수 있을뿐만 아니라 실행을 통해 검증할 수 있다. 계약 계약의 세부적인 내용은 일반적으로 다음과 같은 특성을 가진다. 각 계약 당사자는 계약으로부터 이익(benefit) ..
이 글은 오브젝트라는 책을 읽고 정리한 글입니다. 15장에서는 설계를 재사용하는 디자인 패턴과 설계와 코드를 재사용하는 프레임워크에 관해 살펴봅니다. 디자인 패턴 소프트웨어 설계에서 반복적으로 발생하는 문제에 대해 적용할 수 있는 해결 방법이다. 설계를 재사용하기 위한 것이다. 다양한 변경을 다루기 위해 반복적으로 재사용할 수 있는 설계의 묶음이다. 특정한 변경을 일관성 있게 다룰 수 있는 협력 템플릿을 제공한다. 프레임워크 설계와 코드를 재사용하기 위한 것이다. 애플리케이션의 아키텍처를 구현 코드의 형태로 제공한다. 특정한 변경을 일관성 있게 다룰 수 있는 확장 가능한 코드 템플릿을 제공한다. 디자인 패턴과 프레임워크 모두 협력을 일관성 있게 만들기 위한 방법이다. 디자인 패턴과 설계 재사용 소프트웨터..
이 글은 오브젝트라는 책을 읽고 정리한 글입니다. 14장에서는 유사한 요구사항을 구현하기 위해 유사한 협력 패턴을 적용하면 시스템을 이애하기 쉽고 유연하게 만들 수 있다는 사실을 살펴봅니다. 객체지향 설계의 목표는 적절한 책임을 수행하는 객체들의 협력을 기반으로 결합도가 낮고 재사용 가능한 코드 구조를 창조하는 것이다. 객체들의 협력 구조가 서로 다른 경우에는 코드를 이해하기도 어렵고 코드 수정으로 인해 버그가 발생할 위험성도 높아진다. 유사한 요구사항을 계속 추가해야 하는 상황에서 각 협력이 서로 다른 패턴을 다를 경우에는 전체적인 설계의 일관성이 서서히 무너지게 된다. 객체지향 패러다임의 장점은 설계를 재사용할 수 있다는 것이다. 하지만 재사용은 공짜로 얻어지지 않는다. 재사용을 위해서는 객체 들의 ..
이 글은 오브젝트라는 책을 읽고 정리한 글입니다. 13장에서는 슈퍼타입과 서브타입의 개념을 설명하고 타입 계층을 만족시키기 위해 적용할 수 있는 설계 원칙을 설명합니다. 상속의 첫 번째 용도는 타입 계층을 구현하는 것이다. 타입 계층의 관점에서 부모 클래스는 자식 클래스의 일반화(generalization)이고 자식 클래스는 부모 클래스의 특수화(specialization)다. 상속의 두 번째 용도는 코드 재사용이다. 하지만 재사용을 위해 상속을 사용할 경우 부모 클래스와 자식 클래스가 강하게 결합되기 때문에 변경하기 어려운 코드를 얻게 될 확률이 높다. 상속을 사용하는 일차적인 목표는 코드 재사용이 아니라 타입 계층을 구현하는 것이어야 한다. 반면 타입 계층을 목표로 상속을 사용하면 다형적으로 동작하는..
이 글은 오브젝트라는 책을 읽고 정리한 글입니다. 12장에서는 객체지향의 핵심 메커니즘 중 하나라고 불리는 다형성에 관해 다룹니다. 상속의 목적은 코드 재사용이 아니다. 상속은 타입 계층을 구조화하기 위해 사용해야 한다. 타입 계층은 객체 지향 프로그래밍의 중요한 특성 중 하나인 다형성의 기반을 제공한다. 이번 장을 읽고 나면 다형성이 런타임에 메시지를 처리하기에 적합한 메서드를 동적으로 탐색하는 과정을 통해 구현 되며 상속이 이런 메서드를 찾기 위한 일종의 탐색 경로를 클래스 계층의 형태로 구현하기 위한 방법이라는 사실을 이해할 것이다. 다형성 다형성(Polymorphism) 이라는 단어는 ‘많은’을 의미하는 ‘poly’와 ‘형태’를 의미하는 ‘morph’의 합성어로 ‘많은 형태를 가질 수 있는 능력’..
이 글은 오브젝트라는 책을 읽고 정리한 글입니다. 11장에서는 코드를 재사용하기 위해 상속 대신 사용할 수 있는 기법인 합성을 소개합니다. 상속과 합성은 객체지향 프로그래밍에서 가장 널리 사용되는 코드 재사용 기법이다. 상속 관계는 is-a 관계라고 부르고 합성 관계는 has-a 관계라고 부른다. 상속은 부모 클래스 안에 구현된 코드 자체를 재사용 하지만 합성은 포함되는 객체의 퍼블릭 인터페이스를 재사용한다. 따라서 상속 대신 합성을 사용하면 구현에 대한 의존성을 인터페이스에 대한 의존성으로 변경할 수 있다. 다시 말해서 클래스 사이의 높은 결합도를 객체 사이의 낮은 결합도로 대체할 수 있는 것이다. 상속을 합성으로 변경하기 코드 재사용을 위해 상속을 남용 했을 때 직면할 수 있는 세 가지 문제점을 살펴..
이 글은 오브젝트라는 책을 읽고 정리한 글입니다. 10장에서는 객체지향의 대표적인 재사용 기법인 상속에 관해 다룹니다. 코드를 재사용하는 방법 전통적인 패러다임 : 코드를 복사한 후 수정 객체지향 패러다임 : 새로운 클래스 추가 상속 : 클래스를 재사용하기 위해 새로운 클래스를 추가하는 가장 대표적인 방법 합성 : 새로운 클래스의 인스턴스 안에 기존 클래스의 인스턴스를 포함시키는 방법 상속과 중복 코드 DRY 원칙 중복 코드는 변경을 방해한다. 이것이 중복 코드를 제거해야 하는 가장 큰 이유다. 중복 코드가 가지는 가장 큰 문제는 코드를 수정하는 데 필요한 노력을 몇 배로 증가 시킨다는 것이다. 중복 여부를 판단하는 기준은 변경이다. 요구사항이 변경 됐을 때 두 코드를 함께 수정해야 한다면 이 코드는 중..
이 글은 오브젝트라는 책을 읽고 정리한 글입니다. 9장에서는 8장에서 설명한 기법들을 원칙이라는 관점에서 정리합니다. 개방-폐쇄 원칙 소프트웨어 개체(클래스, 모듈, 함수 등등)는 확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다. 여기서 키워드는 '확장'과 '수정'이다. 이 둘은 순서대로 애플리케이션의 '동작'과 '코드'의 관점을 반영한다. 확장에 대해 열려 있다 : 애플리케이션의 요구사항이 변경될 때 이 변경에 맞게 새로운 '동작'을 추가해서 애플리케이션의 기능을 확장할 수 있다. 수정에 대해 닫혀 있다 : 기존의 '코드'를 수정하지 않고도 애플리케이션의 동작을 추가하거나 변경할 수 있다. 컴파일타임 의존성을 고정시키고 런타임 의존성을 변경하라 사실 개방-폐쇄 원칙은 런타임 의존성과 ..
왕밤빵절미
'📖/오브젝트' 카테고리의 글 목록