공부기록/아키텍처

클린 아키텍처 5장 - 객체 지향 프로그래밍

DGL 2021. 7. 23. 22:24

좋은 아키텍처를 만드는 일은 ㅇㅇ설계 원칙을 이해하고 응용하는 데서 출발. 누군가는 데이터와 함수의 조합.

  1. 누군가는 "데이터와 함수의 조합", 1966년보다 훨씬 이전부터 프로그래머는 데이터 구조를 함수에 전달해 왔음
  2. "실제 세계를 모델링하는 새로운 방법", 이거는 이해하기 모호하다? 근데 맞는 말임 <객체지향의 사실과 오해>에서 보듯이 실제 세계와 유사하게 만드는 이유는, 가독성을 높혀서 코드를 이해하는데 매우 쉬워지게 만드는 목적

본질을 설명하기 위해, 세 가지 개념을 설명하자면, 캡슐화, 상속, 다형성이다. 이것에 대해 알아보자

캡슐화

일부 함수들만 밖에 노출되고, 나머지는 노출되지 않게 하는 것. 내부의 데이터 구조와 어떻게 구현되었는지에 대해서는 조금도 알지 못한다. C++에서는 완벽한 캡슐화가 깨지게 되었음, 헤더에 변수들을 선언해야해서 → 인스턴스의 크기를 알아야하기 때문에.public, private, protected 키워드로 캡슐화가 어느정도 보완이 되긴 했다. ㅇㅇ프로그래밍은 프로그래머가 충분히 올바르게 행동함으로써 캠슐화된 데이터를 우회해서 사용하지 않을 거라는 믿음. ㅇㅇ를 제공한다는 언어들은 C에서 제공한 완벽한 캡슐화를 약하게 했다?

상속?

ㅇㅇ언어가 더 나은 캡슐화는 제공하지 못했지만, 상속만큼은 확실히 제공. 하지만 상속이란 단순히 어떤 변수와 함수를 하나의 유효 범위로 묶어서 재정의하는 일에 불과함. ㅇㅇ언어가 있기 훨씬 이전에도 C프로그래머는 언어의 도움 없이 순수 이러한 방식으로 구현할 수 있었음. 예제에서 NamedPoint는 Point의 가면을 쓴 것처럼 사용될 수 있었음. point의 대응되는 멤버변수의 순서가 드래로 유지되기 때문. ㅇㅇ언어가 출현하기 이전부터 프로그래머가 흔히 사용하던 기법. c++에서는 실제로 이 방법을 사용하여 단일 상속을 구현함. 상속이라고 하기에는 어폐가 있는게, 상속이 훨씬 편하기 때문. 상속에 대해서는 0.5점 정도를 부여할 수 있다.

다형성?

STDIN, STDOUT 입력장치와 출력 장치는 다형적이다. 콘솔용 입출력 드라이버는, 5개의 함수(open,close, read, write, seek)을 구현해야한다. 포인터를 응용한 것이 다형성이라는 것. 다형적 행위를 수행하기 위해 함수를 가리키는 포인터를 사용해 왔다. 따라서 ㅇㅇ가 새롭게 만든 것은 전혀 없다. → 이 말이 완전히 옳은 말은 아니긴 하다. 다형성을 새롭게 제공하지는 못했지만, 안전하고 더욱 편리하게 사용할 수 있게 해준다. 함수 포인터는 위험하다는 사실 → 프로그래머가 관례를 수동으로 따르는 방식. 관례를 지켜야하는 사실을 망각하면 버그가 발생하고, 이러한 버그는 찾아내고 없애기가 지독하게 힘듬. ㅇㅇ 언어는 이러한 위험을 없애주며, 따라서 실수할 위험이 없음. ㅇㅇ언어를 사용하면 다형성은 대수롭지 않은 일이 되버린다. ㅇㅇ는 제어흐름을 간접적으로 전환하는 규칙을 부과한다고 결론지을 수 있다.

다형성이 가진 힘

새로운 입출력 장치를 사용하는 경우 → 그것을 변경하면됨, 프로그램의 소스코드는 입출력 장치의 소스코드를 의존하지 않기 때문. 유닉스 운영체제는 입출력 장치들을 플러그인 형태로 만들었는가? 프로그램이 장치 독립적이어야 한다는 사실을 이미 배웠기 때문.

의존성 역전

제어 흐름 → 다형성이 끼어들면 → 제어 흐름의 역전이 일어남 → 의존성 역전( 전형적인 호출 트리의 형태가 아님)

ㅇㅇ 언어로 개발된 시스템을 다루는 소프트웨어 아키텍트는 소스 코드 의존성 전부에 대해 방향을 결정할 수 있는 절대적인 권한을 갖는다. 소스 코드 의존성이 제어 흐름의 방향과 일치되도록 제한되지 않는다. 이것이 바로 ㅇㅇ가 제공하는 힘이다.

업무 규칙이 Ui와 DB를 의존하는 것이아니다. 업무규칙을 독립적으로 배포할 수 있고, 서로 다른 팀에서 각 모듈을 독립적으로 개발할 수 있다. 그리고 이것이 개발 독립성이다.

결론

다형성을 이용하여 전체 시스템의 모든 소스 코드 의존성에 대한 절대적인 제어 권한을 획득할 수 있는 능력. ㅇㅇ란 다형성을 이용하여 전체 시스템의 모든 소스 코드 의존성에 대한 절대적인 제어 권한을 획득할 수 있는 능력. 아키텍트는 플러그인 아키텍처를 구성할 수 있고, 모듈에 대해 독립성을 보장할 수 있다.