3장 | 타입과 추상화
🔥 객체를 분류하는 기준은 타입이다.
🔥 타입을 나누는 기준은 객체가 수행하는 행동이다.
🔥 타입을 구현할 수 있는 방법 중 하나는 클래스다.
💻 추상화를 통한 복잡성 극복
추상화
- 복잡성을 이해하기 쉬운 수준으로 단순화하는 것이 목적
- 어떤 양상, 세부사항, 구조를 좀 더 명확하게 이해하기 위해 특정 절차나 물체를 의도적으로 생략하거나 감춤으로써 복잡도를 극복하는 방법
- 구체적인 사물들 간의 공통점은 취하고 차이점은 버리는 일반화를 통해 단순하게 만드는 것
- 중요한 부분을 강조하기 위해 불필요한 세부사항을 제거함으로써 단순하게 만드는 것
💻 객체지향과 추상화
- 개념(concept): 공통점을 기반으로 객체들을 묶기 위한 관념이나 아이디어
- 분류(classification): 개념을 이용해서 객체를 여러 그룹으로 나누는 것
- 인스턴스(instance): 어떤 개념을 적용하는 것이 가능해서 개념 그룹의 일원이 될 수 있는 객체
- 객체: 특정한 개념을 적용할 수 있는 구체적인 사물로, 개념이 객체에 적용됐을 때 객체를 개념의 인스턴스라고 함
개념의 세 가지 관점
- 심볼(symbol): 개념을 가리키는 간략한 이름이나 명칭
- 내연(intension): 개념의 완전한 정의를 나타내며 내연의 의미를 이용해 객체가 개념에 속하는지 여부를 알 수 있음
- 외연(extension): 개념에 속하는 모든 객체의 집합
객체를 분류하기 위한 틀
- 어떤 객체를 어떤 개념으로 분류할지가 객체지향의 품질을 결정한다.
- 객체를 적절한 개념에 따라 분류한 어플리케이션은 유지보수가 용이하고 변경에 용이하게 대처할 수 있다.
💻 타입
타입은 개념이다
- 타입은 공통점을 기반으로 객체들을 묶기 위한 틀로, 개념과 동일하다.
데이터 타입
- 데이터 타입은 메모리 안에 저장된 데이터의 종류를 분류하는 데 사용되는 메모리 집합에 관한 메타데이터다.
- 데이터에 대한 분류는 암시적으로 어떤 종류의 연산이 해당 데이터에 대해 수행될 수 있는지를 결정한다.
객체와 타입
- 객체를 타입에 따라 분류하고 그 타입에 이름을 붙이는 것은 결국 프로그램에서 사용할 새로운 데이터 타입을 선언하는 것과 같다.
행동이 우선이다
- 객체가 어떤 행동을 하느냐에 따라 객체의 타입이 결정된다.
- 객체의 타입은 객체의 내부 표현과는 아무런 상관이 없다.
- 즉, 객체의 내부 표현 방식이 다르더라도 어떤 객체들이 동일하게 행동한다면 동일한 타입에 속한다.
책임-주도 설계(Responsiblity-Driven Design): 객체가 외부에 제공해야 하는 책임을 먼저 결정하고, 그 책임을 수행하는 데 적합한 데이터를 나중에 결정한 후, 데이터를 책임을 수행하는 데 필요한 외부 인터페이스 뒤로 캡슐화해야 한다.
💻 타입의 계층
일반화/특수화 관계
- 한 타입이 다른 타입보다 더 특수하게 행동해야 하고, 반대로 한 타입은 다른 타입보다 더 일반적으로 행동해야 한다.
- 일반적인 타입이란, 특수한 타입이 가진 모든 행동들 중에서 일부 행동만을 가지는 타입이다.
- 특수한 타입이란, 일반적인 타입이 가진 모든 행동을 포함하지만 거기에 더해 자신만의 행동을 추가하는 타입이다.
슈퍼타입/서브타입
- 슈퍼타입(Supertype): 일반적인 타입
- 서브타입(Subtype): 더 특수한 타입
💻 정적 모델
타입의 목적
- 타입은 시간에 따라 동적으로 변하는 객체를 정적인 모습으로 다룰 수 있게 해준다.
결국 타입은 추상화다
- 객체의 동적을 특성을 타입을 통해 추상화할 수 있다.
- 타입은 시간에 따른 객체의 상태 변경이라는 복잡성을 단순화할 수 있는 효과적인 방법이다.
동적 모델과 정적 모델
- 동적 모델(dynamic model): 객체가 특정 시점에 구체적으로 어떤 상태를 가지는지 포착
- 정적 모델(static model): 객체가 속한 타입의 정적인 모습 표현
- 객체 관점의 동적 모델과 타입 관점의 정적 모델을 적절히 혼용해야 한다.
클래스
- 정적 모델, 즉 타입은 클래스를 이용해서 구현한다.
- 클래스와 타입은 동일한 개념이 아니다.
📝 느낀점
타입과 클래스는 같은 개념이라고 무의식적으로 생각하고 있었는데, 이번 장을 읽으면서 잘못된 생각을 깰 수 있었다. 클래스는 타입의 구현체일 뿐이고, 타입은 행동을 중심으로 생각해야 한다는 것을 배울 수 있었다.