- 좋은 아키텍처를 만드는 일은 객체 지향 설계 원칙을 이해하고 응용하는 데서 출발
- 'OO(Object-Oriented)'에 대한 잘 못된 말
- "데이터와 함수의 조합"
- "실제 세계를 모델링하는 새로운 방법"
- 'OO'의 본질을 설명하기 위한 세 가지 개념
- 캡슐화
- 상속
- 다형성
캡슐화?
- 캡슐화를 언급하는 이유는 데이터와 함수를 쉽고 효과적으로 캡슐화하는 방법을 제공하기 때문
- 이를 통해 데이터와 함수가 응집력 있게 구성된 집단을 서로 구분 짓는 선을 그을 수 있다
- 구분선 바깥에서 데이터는 은닉되고, 일부 함수만이 외부에 노출
- 실제 OO 언어에서는 각각 클래스의 private 멤버 데이터와 public 멤버 함수로 표현
- 이는 OO에만 국한된 것이 아니라 C 언어에서도 완벽한 캡슐화가 가능
- C 프로그래머는 항상 위와 같은 방식을 활용했다
- 즉, 먼저 데이터 구조와 함수를 헤더 파일에 선언하고, 구현 파일에서 이들을 구현
- 프로그램 사용자는 구현 파일에 작성된 항목에 대해서는 어떠한 방법으로도 접근 X
- 이 후에 C++라는 형태로 OO가 등장했고, C가 제공하던 완전한 캡슐화가 깨지게 되었다
- 언어에 public, private, protected 키워드를 도입함으로 써 불완전한 캡슐화를 사실상 어느 정도 보완하기는 했다
- 하지만 이는 컴파일러가 헤더 파일에서 멤버 변수를 볼 수 있어야 했기 때문에 조치한 임시방편일 뿐
- Java와 C#은 헤더와 구현체를 분리하는 방식을 모두 버렸고, 이로 인해 캡슐화는 더욱 심하게 훼손되었다
- OO가 강력한 캡슐화에 의존한다는 정의는 받아들이기 힘들고, 실제로 많은 OO 언어가 캡슐화를 거의 강제하지 않는다
- OO 프로그래밍은 프로그래머가 충분히 올바르게 행동함으로써 캡슐화된 데이터를 우회해서 사용하지 않을 거라는 믿음을 기반으로 한다.
- 하지만 OO를 제공한다고 하는 언어들이 실제로는 C 언어에서의 완벽한 캡슐화를 약화시켜왔다는 것
상속?