[Clean Architecture] 5장. 객체 지향 프로그래밍
|
introduction
- 좋은 아키텍처를 만드는 일은 객체 지향 설계 원칙을 이해하고 응용하는 데서 출발함
- OO 란 무엇일까?
캡슐화?
- OO 를 정의하는 요소 중 하나로 캡슐화를 언급
- 데이터와 함수를 쉽고 효과적으로 캡슐화하는 방법을 OO 언어가 제공하기 때문
- 하지만 이런 개념이 OO 에만 국한된 것은 아니다.
- 하지만, 점점 캡슐화가 깨지게 되었다.
- OO 가 강력한 캡슐화에 의존한다는 정의는 받아들이기 힘들다.
- 실제로 많은 OO 언어가 캡슐화를 거의 강제하지 않는다.
- OO 프로그래밍은 프로그래머가 충분히 올바르게 행동함으로써 캡슐화된 데이터를 우회해서 사용하지 않을 거라는 믿음을 기반으로 한다.
- 하지만 OO 를 제공한다고 주창한 언어들이 실제로는 C 언어에서 누렸던 완벽한 캡슐화를 약화시켜 온 것은 틀림없다.
상속?
- 상속만큼은 OO 언어가 확실히 제공했다.
- 하지만 상속이란 단순히 어떤 변수와 함수를 하나의 유효 범위로 묶어서 재정의하는 일에 불과함
- OO 가 출현하기 이전부터 프로그래머가 흔히 사용하던 기법
- OO 언어가 완전히 새로운 개념을 만들지는 못했지만, 데이터 구조에 가면을 씌우는 일을 상당히 편한 방식으로 제공했다고는 볼 수 있다.
- 상속에 대해서만 OO 에 0.5 점 정도
다형성?
- OO 언어가 있기 이전에 다형성을 표현할 수 있는 언어가 당연히 있었다.
- C 언어에서 함수를 가리키는 포인터를 응용한 것이 다형성이다.
- OO 가 새롭게 만든 것은 전혀 없다.
- 다만 OO 언어는 다형성을 제공하지는 못했지만, 다형성을 좀 더 안전하고 더욱 편리하게 사용할 수 있게 해줌
- 함수의 포인터를 직접 사용하여 다형적 행위를 만드는 이 방식에는 문제점이 있음
- 함수 포인터는 위험하다는 사실
- OO 언어는 이러한 관례를 없애주며, 따라서 실수할 위험이 없다.
- OO 언어를 사용하면 다형성은 대수롭지 않은 일이 된다.
- OO 는 제어흐름을 간접적으로 전환하는 규칙을 부과한다고 결론지을 수 있다.
다형성이 가진 힘
- 다형성이 뭐가 그렇게 좋은가?
- OO 의 등장으로 언제 어디서든 플러그인 아키텍처를 적용할 수 있게 되었다.
의존성 역전
- 기존 호출 트리
- 소스 코드 의존성의 방향은 반드시 제어흐름을 따르게 된다.
- 의존성 역전의 경우
- 소스 코드에서는 인터페이스를 통해 메서드를 호출
- 이 인터페이스는 런타임에는 존재하지 않음
- 하지만 인터페이스와 구현 클래스 사이의 소스 코드 의존성 (상속 관계) 이 제어 흐름과 반대인 점을 주목
- OO 언어가 다형성을 안전하고 편리하게 제공한다는 사실은 소스 코드 의존성을 어디에서든 역전시킬 수 있다는 뜻
- 소스 코드 의존성은 소스 코드 사이에 인터페이스를 추가함으로써 방향을 역전시킬 수 있다.
- 이러한 접근법을 사용한다면, OO 언어로 개발된 시스템을 다루는 소프트웨어 아키텍트는 시스템의 소스 코드 의존성 전부에 대해 방향을 결정할 수 있는 절대적인 권한을 갖는다.
- 이것이 OO 가 제공하는 힘
- 그리고 이것이 OO 가 지향하는 것
- 이 힘으로 무엇을 할 수 있을까?
- 컴포넌트가 개별적이며 독립적으로 배포 가능
- 시스템의 모듈을 독립적으로 배포할 수 있게 되면, 서로 다른 팀에서 각 모듈을 독립적으로 개발할 수 있음
결론
- 소프트웨어 아키텍처 관점에서 OO 란 무엇인가? 라는 질문의 정답은 명백하다.
- OO 란 다형성을 이용하여 전체 시스템의 모든 소스 코드 의존성에 대한 절대적인 제어 권한을 획득할 수 있는 능력