명목적 자료형 체계

명목적 또는 이름 기반 자료형 체계(nominal 혹은 nominative type system)은 자료형 체계의 주요 범주이다. 이 자료형 체계에서 자료형의 호환성과 등가성은 선언이나 자료형의 이름에 의해 명시적으로 결정된다. 노미널 체계는 두 자료형이 서로로 교체 가능한지, 혹은 하나가 다른 하나의 서브타입인지 확인하는 데 사용된다. 이는 구조적 자료형 체계와 대비를 이룬다. 구조적 체계의 경우, 자료형의 구조만 가지고 비교를 하며 명시적인 선언은 필요하지 않다.

명목적 타이핑 
명목적 타이핑에서 두 변수는 같은 이름의 자료형으로 선언된 경우에만 서로 호환된다. 예를 들어, C에서 서로 다른 이름의 struct 자료형은, 완전히 같은 멤버를 갖고 있더라도 서로 호환될 수 없다

하지만 C는 typedef를 이용해 이미 존재하는 자료형의 별칭을 선언할 수 있다. 이는 그저 문법적 요소일 뿐, 자료형 체크를 위해 별칭과 원래 이름을 구분하지는 못한다. 이 기능은 자료형 안전성에 문제를 끼칠 수 있다. 예를 들어, 하나의 int 자료형이 두 개의 의미적으로 다른 방식으로 사용되는 경우가 있다. 하스켈에서는 type을 이용해 C처럼 별칭을 선언할 수 있으며, newtype 선언을 통해 새로운, 구분되는, 존재하는 자료형의 동형사상을 만들 수 있다.

명목적 서브타이핑 
비슷하게, 명목적 서브타이핑에서 한 자료형은 다른 자료형의 서브타입이 되도록 명시적으로 선언된 경우에만 서브타입으로 인정된다. 명목적 자료형 언어들은 대체로 서브타입은 구조적인 호환성을 강조한다. (Eiffel은 호환성이 없는 서브타입 선언도 허용한다). 하지만 구조적으로 호환성이 있도록 만들어진 자료형이라도 서브타입이 되도록 선언되지 않았다면 서브타입으로 인정되지 않는다.

C++, C#, 자바, 오브젝티브-C, Delphi, Swift, Rust 모두 명목적 타이핑과 명목적 서브타이핑을 주로 사용한다.

Java나 C#과 같은 몇몇 명목적 서브타입 언어들은 클래스를 final 혹은 sealed로 선언하여 서브타입이 만들어지는 것을 막을 수 있다.

비교 
명목적 타이핑은 자료형 간의 예상치 못한 호환성이 생겨 자료형 안전성을 해치는 일을 방지할 수 있다. 하지만 유연성은 떨어진다. 예를 들어, 명목적 타이핑은 서브타입의 수정 없이 새로운 부모 자료형을 만드는 것을 허용하지 않는다.

같이 보기 
 구조적 자료형 체계(Structural type system)
 추상 자료형
 자료형 체계

노트 
 , section 19.3

각주

외부 링크 
 c2.com: Nominative and structural typing

자료형 체계