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

5장. 객체 지향 프로그래밍 p.37~51

새로 알게 된 부분

캡슐화

C언어에서는 완벽한 캡슐화가 가능하다. 자바는 캡슐화가 훼손되었다. 많은 OO언어가 캡슐화를 거의 강제하지 않는다.
OO 프로그래밍은 프로그래머가 충분히 올바르게 행동함으로써 캡슐화된 데이터를 우회해서 사용하지 않을 거라는 믿음을 기반으로 한다. (접근제한자로..)

=> 캡슐화는 OOP의 특징이 아니라는 말로 들린다. 오히려 캡슐화는 C언어에서는 강제되었던 것인가. 보통 우리가 OOP 특징하면 캡슐화를 떠올리는데… C언어에서는 완벽한 캡슐화가 가능하다는 것이 인상적이다.

(완벽한 캡슐화는 P.39에 나옴)

 

상속

**C언어에서도 상속은 가능하다. **
(정확히는 상속을 흉내내는 요령이 있는거고 상속만큼 편리한 방식이 아니다. 다중 상속을 구현하는 것은 매우 어려운 일이다.)

OO언어에서는 상속이 간단하다. 업캐스팅이 암묵적으로 이루어진다.

 

다형성

OO 언어는 다형성을 제공하지는 못했지만, 다형성을 좀 더 안전하고 더욱 편리하게 사용할 수 있게 해준다.
(1940년대 후반 폰노이만 아키텍처가 처음 구현된 이후 다형적 행위를 수행하기 위한 함수 포인터를 사용했음.)

함수 포인터는 위험하다.
why? 프로그래머가 포인터를 통해 모든 함수를 호출하는 관례를 지키지 않으면 버그가 발생하며 찾아내기 어렵기 때문.

OO 언어는 이러한 관례를 없애주며 실수할 위험 없음.

 

유닉스 입출력 장치

유닉스 운영체제는 입출력 장치들을 플러그인 형태로 만들었다. => 장치 독립적 => 플러그인 아키텍쳐 => 다형성과 비슷

   

궁금한 부분

캡슐화

구조적 프로그래밍 / 객체지향 프로그래밍 / 함수형 프로그래밍 중에서 캡슐화 특성을 가지는건 객체지향 프로그래밍 뿐인가?
C언어는 완벽한 캡슐화라고 하는데 객체지향은 아닌 것 같다는 생각이 든다. 이에 대한 답은 무엇일까..?

(참고로 책에서는 다음과 같이 말한다. “캡슐화에 대해서는 OO에 점수를 줄 수 없고, …” - p.43

다형성

OO는 제어흐름을 간접적으로 전환하는 규칙을 부과한다. <- 이게 머선말29??

   

인상적이었던 부분

제어흐름

전형적인 호출트리에서는 소스 코드 의존성의 방향은 반드시 제어흐름 을 따르게 된다.
하지만 OO 언어 소프트웨어는 소스 코드 의존성이 제어흐름의 방향과 일치되도록 제한되지 않는다.

=> 다형성으로 의존성이 역전된 경우 의존성은 제어흐름과 반대 방향이다.

 

DI 장점이 뭐냐

  1. 배포 독립성 (분리된 컴포넌트 / 배포가능 단위 로 컴파일 가능. => 독립적으로 배포 가능)
  2. 개발 독립성 (서로 다른 팀에서 각 모듈을 독립적으로 개발 가능)
  3. 변경 시 수정 범위 최소화 (책에는 없지만.. 이것도 맞을 듯)

   


캡슐화/상속/다형성은 OO언어에서 새롭게 추가된 개념이 아니다. OO란 다형성을 이용하여 전체 시스템의 모든 소스 코드 의존성에 대한 절대적인 제어 권한을 획득할 수 있는 능력