객체지향의 사실과 오해
객체의 역할
- 여러 객체가 동일한 역할을 수행할 수 있음
- 역할은 대체 가능성을 가짐
- 각 객체는 책임을 수행하는 방법을 자율적으로 선택 가능
- 1객체가 동시에 여러 역할 수행 가능
- 객체는 애플리케이션의 기능을 구현하기 위해 존재
- 1기능조차 객체 하나로는 복잡하고 거대하기때문에 일반적으로 객체는 다른 객체와의 협력을 통해 기능 구현
- 결국 협력의 품질을 결정하는 것: 객체의 품질
객체의 조건
- 객체는 충분히 협력적이어야한다. 충분히: 다른 객체의 명령에 무조건 따르는게 아니라 어느정도 '자율성'을 가져야한다.
- 객체의 자율성은 객체의 내부와 외부를 명확히 구분하는 것으로부터 나온다. 객체의 사적인 부분은 스스로 관리하고 외부 접근을 차단해야하며, 객체의 외부에서는 접근이 허락된 수단을 통해서만 객체와 의사소통해야한다.
- 객체는 '상태(state)'와 '행동(behaviour)', '아이덴티티(식별자)'를 지닌다. 객체는 행동을 위해 필요한 상태를 포함하며(바리스타가 커피 제조방법을 알고있는 상태) 특정한 행동방법을 스스로 결정할 수 있어야한다 (자신이 아는 방법에 따라 커피 제조). 따라서 객체는 상태와 행위를 하나의 단위로 묶는 자율적인 존재다.
- 예전엔 데이터와 프로세스를 엄격히 구분했음. 객체지향에서는 데이터와 프로세스를 객체라는 하나의 틀 안에 함께 묶어 놓음으로써 객체의 자율성을 보장.
클래스가 객체지향 언어의 중요 구성요소이긴 하지만 자바스크립트같은 프로토타입 기반의 객체지향 언어에서는 클래스가 존재하지 않고 오직 객체만 존재한다. 상속 역시 클래스가 아닌 객체 간의 위임 메커니즘을 기반으로 한다.
- 객체의 프로퍼티: 객체의 상태를 구성하는 모든 특징. 프로퍼티는 단순한 값과 다른 객체를 참조하는 링크로 구분된다. (앨리스가 5리터의 음료를 가지고 있다- 링크)
- 객체의 행동(이어 상호작용)은 상태에 영향을 받는다. 객체의 행동(상호작용)은 상태를 변경시킨다.
캡슐화와 추상화
- 캡슐화: 객체가 외부에 노출하는 것은 행동뿐임. 상태는 객체가 알아서 변경하던가말던가 함 - 자율성을 높임
- 훌륭한 추상화의 예시: 원래 런던 지하철은 실제 물리적 지형 위에 역 간 거리 등을 사실적으로 묘사-> 오히려 이해가 어려워짐. 그래서 지하철 승객의 목적인 '어떤 역에서 출발하고 어떤 환승역을 거쳐야 가장 빠르게 목적지에 도착할수있는지'를 보여주도록 꼭 필요한 정보만 정확하게 표현, 사이의 연결성에만 집중 => 지하철 노선을 추상화.
- 추상화: 어떤 양상, 구조, 디테일을 더 명확하게 이해하고자 특정 절차나 물체를 의도적으로 생략해 복잡도를 극복하는 방법.
추상화의 종류
- 구체적인 사물간의 공통점은 취하고 차이점은 버리는 일반화
- 중요한 부분을 강조하고자 불필요한 디테일은 버리는 단순화.
개념과 분류
- 개념: 공통점을 기반으로 객체들을 묶는 그릇. E.g. 모ㅁ이 납작하고 두 손과 두발이 네모난 몸 모서리에 달린 객체는 트럼프라는 개념, 길거리를 빠르게 누비는 교통수단은 자동차라는 개념.
- 트럼프라는 개념 그룹의 일원: 하트 여왕, 하트 왕 등
- 개념으로 분류 가능.
개념의 구성 요소
- 심볼: 개념을 가리키는 이름, 명칭 / 트럼프
- 내연(intension): 개념의 완전한 정의. 내연의 의미를 이용해 객체가 개념에 속하는지 여부 확인 가능 / 몸이 납작하고 두손과 두발은 네모 귀퉁이에 달린 등장인물
- 외연(extension): 개념에 속하는 모든 객체의 집합(set)/ 정원사, 병사, 하트왕 등
예시
- 객체에 어떤 개념을 적용할 수 있어 개념 그룹의 일원이 되면 객체가 그 개념의 인스턴스
- 일반화, 특수화 관계: 특수한 타입은 일반적 타입이 하는 모든 행동을 동일하게 수행 + 더 많은 행동을 한다.
- E.g. 트럼프: 납작 엎드리기, 뒤집기 & 트럼프 인간: 납작 엎드리기, 뒤집기, 걷기(new!)
- 이때 더 일반적인 타입: Supertype, 특수한 타입: Subtype