[Clean Architecture 정리] 5장. 객체 지향 프로그래밍
객체 지향 프로그래밍
좋은 아키텍처를 만드는 것을 객체 지향 설계 원칙을 이해하고 응용하는 데서 출발한다.
객체 지향(OO, Object Oriented)이란?
객체 지향이란 무엇일까?
데이터와 함수의 조합? 현실 세계의 사물을 객체로 인식하고 그 객체로부터 특징을 뽑아와 프로그래밍 하는 것?
객체 지향을 설명하려면 '캡슐화(Encapsulation)', '상속(Inheritance)', '다형성(Polymorphism)'의 객체 지향의 본질 세 가지를 이해해야 한다.
캡슐화(Encapsulation)
캡슐화는 연관된 데이터와 함수를 클래스로 묶는 것으로 캡슐화를 통해 응집도(Cohesion)은 높이고 결합도(Coupling)은 낮출 수 있다.
OO언어는 데이터와 함수를 쉽고 효과적으로 캡슐화하는 방법을 제공한다.
대표적인 OO 언어(자바, c# 등)가 헤더와 구현체를 분리하는 방식을 버림으로써, 완전한 캡슐화는 불가능하지만 OOP는 프로그래머가 충분히 올바르게 행동함으로써 캡슐화된 데이터를 우회해서 사용하지 않을 거라는 믿음을 기반으로 한다.
상속(Inheritance)
상속이란 어떤 변수와 함수를 하나의 유효 범위로 묶어서 재정의하는 것이다.
OO 언어가 고안되기 이전부터 상속을 흉내내는 방법은 있었지만, 다중상속의 어려움, 타입의 강제 변환 등 문제점이 있었지만,
OO 언어는 상속과 관련해서 훨씬 편리한 기능을 제공한다.
다형성(Polymorphism)
다형성이란 서로 다른 클래스의 객체가 같은 입력을 받았을 때, 각자의 방식으로 동작하는 것이다.
다형성은 함수를 가리키는 포인터를 응용한 것이다.
폰 노이만 아키텍처가 구현된 이후 프로그래머는 다형적 행위를 수행하기 위해 함수 포인터를 사용했다.
하지만 함수 포인터를 직접 사용하는데는 위험이 동반되었고, 프로그래머는 심각한 버그를 피하기위해 수동으로 특정 관례를 따라야했다.
OO 언어는 이러한 관례를 제거하고 다형성을 안전하고 편리하게 사용할 수 있도록 제공한다.
이러한 이유로 OOP는 개요에서 설명했던 "제어흐름을 간접적으로 전환하는 규칙을 부과"한다고 말할 수 있다.
다형성이 가진 힘?
OO의 등장 이전, 대다수의 프로그래머는 함수를 가르키는 포인터를 사용하는 데에 따르는 위험성 등으로 인해 플러그인 아키텍처 등의 개념을 사용하지 않았다.
OO의 등장으로 보다 안전하고 편리한 다형성을 이용해 플러그인 아키텍처 등의 개념을 쉽게 적용할 수 있게 된다.
의존성 역전(Dependency Inversion)
다형성이 안전하고 편리하기 이전 전형적인 호출 트리는 "main -> 고수준 -> 저수준"의 순서로 호출된다.
제어흐름은 시스템의 행위에 따라 결정되고 소스 코드 의존성 또한 제어흐름에 따라 결정되었다.
다형성을 제공하는 OO 언어는 인터페이스를 사용해 소스코드의 의존성을 역전시킬 수 있게 된다
따라서, OO 언어로 개발된 아키텍트는 소스 코드 의존성 방향을 결정할 수 있는 절대적인 권한을 가지고 설정할 수 있다
의존성을 역전 시킴으로써, 각 컴포넌트를 개별적이며 독립적으로 배포 가능(배포 독립성, Independent Deployability)하도록 만들며 각 모듈은 서로 다른 팀에서 독립적으로 개발(개발 독립성, Independent Developability)할 수 있게 만든다.
객체 지향(OO, Object Oriented)
- 다형성을 이용해 전체 시스템의 모든 소스 코드 의존성에 대한 절대적인 제어 권한을 획득하는 능력이다.
- 고수준의 정책을 포함하는 모듈은 저수준의 세부사항을 포함하는 모듈에 대해 독립성을 보장한다.
- 저수준의 세부사항은 중요도가 낮은 플러그인 모듈로 만들 수 있고, 고수준 모듈과는 독립적으로 개발 및 배포할 수 있다
서적 : http://www.yes24.com/Product/Goods/77283734