1. 추상화를 통한 복잡성 극복
📍 추상화의 목적
- 단순화
- 복잡도를 다루기 위해 추상화한다
📍 추상화의 정의
- 어떤 양상, 세부 사항, 구조를 좀더 명확하게 이해하기 위해 특정 절차나 물체를 의도적으로 생략하거나 감춤으로써 복잡도를 극복하는 방법
📍 추상화 방법 2가지
1. 구체적인 사물들 간의 공통점은 취하고 차이점은 버리는 일반화
2. 중요한 부분을 강조하기 위해 불필요한 세부사항을 제거
- 객체지향에서는 객체라는 추상화를 통해 현실의 복잡성을 극복한다
2. 객체지향과 추상화
📍 앨리스의 추상화 예시
- 하트 여왕, 스페이드 정원사, 클로버 병사 등을 모두 트럼프 객체로 단순화
(토끼는 트럼프로 추상화 불가)
- 트럼프로 단순화할 수 있는 이유는, 위의 모든 인물들이 트럼프의 일반적인 외형과 행동방식을 지녔기 때문
인스턴스(instance)
- 객체에 어떤 개념을 적용하는 것이 가능해서 그 개념 그룹의 일원이 될 때, 객체를 그 개념(그룹)의 인스턴스라고 함
- 대부분의 객체들은 몇 가지 개념의 인스턴스일 것임
3. 타입
📍 타입은 개념이다
타입
- 공통점을 기반으로 객체들을 묶기 위한 틀
- 현실 세계의 '개념'을 컴퓨터 공학 세계에서 '타입'이라는 용어로 대체하여 사용
📍 데이터 타입
타입 시스템이 생겨난 계기
- 애플리케이션이 커질 수록 메모리 주소값을 직접 다루는 것이 힘들어져서, 데이터 용도에 따라 데이터의 목적을 분류하기 위헤 데이터 타입(자료형)이 만들어짐
타입 시스템의 목적
- 메모리 안의 모든 데이터가 비트열(2진수)로 보임으로써 야기되는 혼란을 방지
- 데이터가 잘못 사용되지 않도록 제약사항을 부여(숫자형을 써야 할 때, boolean형을 쓰면 안되므로)
타입 시스템의 2가지 특성
- 어떤 데이터에 어떤 연산자를 적용할 수 있느냐가 그 데이터의 타입을 결정
- 타입에 속한 데이터를 메모리에 어떻게 표현하는지는 외부로부터 철저히 감춰진다
📍 객체와 타입
객체는 데이터(상태를 표현하기 위한)인가? (No)
- 객체는 행동에 따라 변하는 상태를 가지지만, 데이터는 아니다
- 그 이유는 객체에서 중요한 것은 상태가 아니라 행동이기 때문이다
(상태는 행동의 결과로 초래된 부수효과를 쉽게 표현하기 위해 도입한 추상적인 개념에 불과)
객체의 타입
- 어떤 객체가 어떤 타입에 속하는지를 결정하는 것은 상태가 아닌 객체가 수행하는 행동이다
- 행동을 책임으로 표현할 수 있고, 책임은 메시지 수신을 의미한다
- 다형성에 의하면 동일한 요청에 대해 각각 다른 방식으로 응답할 수 있다, 하지만 메시지는 동일해야 하므로, 다형적인 객체들은 동일한 타입에 속하게 된다 (매개변수와 반환 타입이 같기 때문에)
- 객체의 내부적 표현은 외부로부터 철저하게 감춰진다 (객체의 타입은 객체의 내부 표현과 아무 상관 없음)
캡슐화
- 객체지향 설계 시 데이터의 내부 표현 방식과 무관하게 행동만 고려하면 되므로 외부에 행동만 제공하고 데이터는 행동 뒤로 감춘다
- 데이터가 객체 인터페이스를 오염시키는 순간, 유연하지 못한 설계를 갖게 된다
4. 타입의 계층
📍 계층
- 객체지향에서 일반화/특수화 관계를 결정하는 것도 객체의 행동이다(상태X)
예시) 일반화/특수화 계층
- 트럼프: 납작 엎드릴 수 있다(일반화)
- 트럼프 인간: 납작 엎드릴 수도 있고(일반화), 걸을 때마다 몸이 종이처럼 펄럭일 수 있다(특수화)
📍 슈퍼타입과 서브타입
- 일반적인 타입 -> 슈퍼타입
- 좀 더 특수한 타입 -> 서브타입
일반화/특수화 관계 표기법
5. 정적 모델
📍 타입의 목적
- 인간의 인지능력으로 객체의 동적인 변화를 캐치할 수 없어서
- 시간에 따른 객체의 상태 변경이라는 복잡성을 단순화해준다
📍 그래서 결국 타입은 추상화다
- 불필요한 상태 변화라는 요소를 제거하고 철저하게 정적인 관점에서 객체를 묘사할 수 있음
📍 동적 모델과 정적 모델
객체의 스냅샷
- 스냅샷: 객체가 특정 시점에 구체적으로 어떤 상태를 가지는지 확인
- 객체지향 모델링을 위한 표준 언어인 UML에서 스냅샷을 객체 다이어그램이라고 부름
- 동적 모델: 객체가 살아 움직이는 동안 상태가 어떻게 변하고 어떻게 행동하는지 초점(객체 관점)
정적 모델(타입 모델)
- 객체가 속한 타입의 정적인 모습을 표현(객체를 추상화한 타입관점)
- 동적으로 변하는 객체의 상태에는 관심 없음
객체지향 애플리케이션에서는 동적 모델 및 정적 모델을 적절히 혼용해야 한다
📍 클래스
- 객체지향 프로그래밍 언어에서 정적 모델은 클래스로 구현된다
클래스와 타입은 다르다
- 타입: 객체를 분류하기 위한 개념
- 클래스: 타입을 구현할 수 있는 메커니즘 중 하나
- 예) JavaScript같은 프로토타입 기반 언어에서는 클래스 불필요(단지 syntactic sugar)
클래스는 타입의 구현 이외에 코드를 재사용하는 용도로도 사용됨