명목적 자료형 체계
1. 개요
명목적 자료형 체계는 두 변수의 자료형 이름이 동일하게 명시된 경우에만 호환된다고 판단하는 방식이다. C 언어의 struct 자료형처럼 멤버가 동일하더라도 이름이 다르면 호환되지 않는다. 명목적 서브타이핑은 한 자료형이 다른 자료형의 서브타입이 되기 위해 명시적으로 선언되어야 하며, C++, C#, 자바, 코틀린 등에서 사용된다. 명목적 자료형 체계는 자료형 안전성을 높이지만, 구조적 타이핑에 비해 유연성은 떨어진다.
-
자료형 체계 -
상속 (객체 지향 프로그래밍)
상속은 객체 지향 프로그래밍에서 클래스 간 관계를 설정하고 코드 재사용성을 높이는 핵심 메커니즘으로, 슈퍼클래스의 속성과 기능을 서브클래스가 이어받아 확장하며 차분 프로그래밍과 서브타이핑을 목적으로 사용되고, 메서드 오버라이딩을 통해 상속받은 기능을 변경하거나 확장할 수 있다. -
자료형 체계 -
의존형
의존형은 값에 타입이 의존하는 유형 시스템으로, 의존 곱 타입과 의존 쌍 타입 등의 형태를 가지며 프로그램의 안전성을 높이는 데 기여하고 Agda, Idris 등의 언어에서 활용된다.
2. 명목적 타이핑
명목적 타이핑에서 두 변수는 같은 이름의 자료형으로 선언된 경우에만 서로 호환된다. 예를 들어, C에서 서로 다른 이름의 `struct` 자료형은 완전히 같은 멤버를 갖고 있더라도 서로 호환될 수 없다.
하지만 C는 `typedef`를 이용해 이미 존재하는 자료형의 별칭을 선언할 수 있다. 이는 그저 문법적 요소일 뿐, 자료형 체크를 위해 별칭과 원래 이름을 구분하지는 않는다. 이 기능은 자료형 안전성에 문제를 일으킬 수 있다. 예를 들어, 하나의 `int` 자료형이 두 개의 의미적으로 다른 방식으로 사용되는 경우가 있다. 하스켈에서는 `type`을 이용해 C처럼 별칭을 선언할 수 있으며, `newtype` 선언을 통해 새로운, 구분되는, 존재하는 자료형의 동형사상을 만들 수 있다.
3. 명목적 서브타이핑
명목적 서브타이핑에서는 한 자료형이 다른 자료형의 서브타입이 되기 위해 명시적으로 선언되어야만 서브타입으로 인정된다. 명목적 자료형 언어들은 대체로 서브타입이 구조적 호환성을 갖도록 강제하지만, 에펠은 호환되지 않는 서브타입 선언도 허용한다. 구조적으로 호환되더라도 명시적으로 서브타입으로 선언되지 않은 자료형은 서브타입으로 인정되지 않는다.
C++, C#, 자바, 코틀린, 오브젝티브-C, Delphi, Swift, Julia, Rust는 주로 명목적 타이핑과 명목적 서브타이핑을 사용한다.
자바나 C#과 같은 일부 명목적 서브타입 언어에서는 `final` (자바) 또는 `sealed` (C#) 키워드를 사용하여 클래스에 대한 추가적인 서브타이핑을 막을 수 있다.