Type
타입은 개념(Concept)을 공학적인 용어로 대체한 것으로, 수학적 정의로는 값의 집합(Set)을 의미하며, 프로그래밍적 관점에서는 데이터를 사용하는 방법과 그에 따른 제약 사항을 정의하는 틀이다.
데이터 타입
섹션 제목: “데이터 타입”컴퓨터 메모리의 세계에는 타입이 없지만, 타입 시스템(Type System)은 무질서한 메모리 조각에 질서를 부여하고 의미를 입히기 위해 고안되었다.
- 타입의 역할
- 데이터가 비트열이 아닌, 애플리케이션 내에서 어떻게 사용되는지를 정의
- 데이터가 메모리에 실제로 어떻게 표현되는지(구현 세부 사항) 은닉
- 효과
- 개발자는 메모리 주소나 비트 연산이 아닌, 데이터의 의미와 목적에 집중
- 잘못된 연산(예: 문자열에 숫자를 곱하는 행위)을 방지하여 프로그램의 안정성 향상
객체와 타입
섹션 제목: “객체와 타입”객체지향에서 객체는 데이터가 아니라 행동(Behavior)을 중심으로 정의되는데, 객체의 타입 역시 데이터가 아닌 행동에 의해 결정된다.
- 행동 중심의 타입 결정
- 객체가 어떤 메시지를 수신하고 어떻게 반응(행동)하는지가 타입 결정
- 서로 다른 데이터를 가진 두 객체라도, 동일한 행동을 수행한다면 동일한 타입으로 분류
- 다형성(Polymorphism)의 기반
- 동일한 타입(역할)에 속한 객체는 내부 데이터 표현 방식이 다르더라도, 동일한 메시지를 처리 가능
- 캡슐화(Encapsulation)의 실현
- 외부에서는 객체의 행동(타입)만 알 뿐, 내부 데이터 표현 방식 은닉
- 행동만을 외부에 공개하고 데이터는 감추는 캡슐화의 원칙 실현
일반화/특수화(Generalization/Specialization)
섹션 제목: “일반화/특수화(Generalization/Specialization)”타입과 타입 사이에는 포함 관계가 성립할 수 있으며, 이를 일반화와 특수화 관계라고 한다.
- 일반적인 타입(Supertype)
- 더 포괄적인 의미를 가지며, 더 넓은 범위의 객체 집합을 포함
- 특수한 타입(Subtype)
- 일반적인 개념보다 범위가 더 좁고 구체적
- 슈퍼타입의 행동을 모두 포함하면서 자신만의 행동을 추가하거나 구체화
관계의 법칙과 상속
섹션 제목: “관계의 법칙과 상속”- 치환 가능성
- 서브타입의 모든 인스턴스는 슈퍼타입의 집합에 포함
- 슈퍼타입이 사용되는 모든 문맥에서 서브타입은 슈퍼타입을 대체 가능해야 함(리스코프 치환 원칙, LSP).
- 상속(Inheritance)
- 프로그래밍 언어에서 일반화/특수화 관계를 구현하는 대표적인 메커니즘
- 상속은 단순한 코드 재사용 도구가 아니라, 타입 계층을 구조화하는 도구가 주 목적
정적 모델과 동적 모델
섹션 제목: “정적 모델과 동적 모델”객체의 복잡성을 다루기 위해 우리는 시간을 제거하거나(정적), 시간을 포함하는(동적) 두 가지 모델링 방식을 혼용한다.
flowchart LR subgraph Static[Static Model] C[Class Diagram] D[Code / Text] E[Compile Time] end
subgraph Dynamic[Dynamic Model] F[Object Diagram] G[Snapshot / Memory] H[Runtime] end
Static -->|Instantiate| Dynamic Dynamic -->|Abstract| Static- 동적 모델(Dynamic Model)
- 어떤 객체의 스냅샷(Snapshot)
- 애플리케이션이 실행되는 특정 시점에 객체가 구체적으로 어떤 상태와 어떤 것과 연결되어 있는지를 보여줌
- 디버깅 시 변수 값을 확인하는 과정이 동적 모델을 관찰하는 행위
- 정적 모델(Static Model)
- 타입 다이어그램(Type Diagram) 개념
- 시간의 축을 제거하고, 객체가 가질 수 있는 모든 상태와 행동을 정의한 모델
- 객체의 실제 값은 포함하지 않으며, 객체가 어떤 메시지를 수신할 수 있는지와 어떻게 반응하는지를 정의
- 클래스(Class)를 작성하는 행위는 시스템을 정적인 모델로 정의하는 과정
클래스 vs 타입
섹션 제목: “클래스 vs 타입”- 타입(Type)
- 객체를 분류하기 위한 개념적 틀
- 무엇을 할 수 있는지에 집중
- 클래스(Class)
- 타입을 코드로 구현하기 위한 구현 메커니즘 중 하나
- 어떻게 구현하는지에 집중
- 관계
- 객체지향 프로그래밍 언어에서 클래스는 타입을 구현하는 가장 보편적인 방법
- 하나의 클래스가 여러 타입을 구현할 수도 있고(Interface 구현), 여러 클래스가 동일한 타입을 공유 가능
- 설계 시에는 클래스(구현)보다 타입(역할과 메시지)를 중심으로해야 유연한 설계 가능