공용체
같은 칸에 실수를 넣고 정수로 읽으면 무엇이 나올까?
공용체 타입
한 변수에 때마다 다른 타입
공용체(union)는 변수 하나가 실행 중 때에 따라 서로 다른 타입의 값을 담을 수 있는 타입입니다. 레코드는 필드마다 칸이 따로 있지만, 공용체는 같은 메모리 칸을 여러 타입이 함께 씁니다.
예시입니다. 지금은 정수를 넣고 나중에는 실수를 넣을 수 있습니다.
자유 공용체
넣은 타입과 다르게 읽으면
칸에 든 것은 비트일 뿐입니다. 실수로 넣은 비트를 정수로 읽으면 전혀 다른 수가 나옵니다. 지금 어떤 타입이 들었는지 언어가 검사하지 않는 공용체가 자유 공용체(free union)이고, C와 C++가 이 방식입니다.
32비트로 담았을 때의 예시 값입니다. 자유 공용체에서는 무엇을 넣었는지 프로그래머가 직접 챙겨야 합니다.
판별 공용체
표시를 붙여 두면 검사할 수 있습니다
값 옆에 지금 든 타입을 알려 주는 표시를 함께 두는 것이 판별 공용체(discriminated union)이고, 그 표시가 판별자(discriminant)입니다. 읽기 전에 판별자를 보면 되므로 타입 검사를 할 수 있습니다.
ML, Haskell, F#이 지원합니다. 타입 검사는 1강에서 본, 값의 종류가 맞는지 확인하는 일입니다.
공용체의 평가
아예 빼 버린 언어도 있습니다
자유 공용체는 타입 검사를 할 수 없어 안전하지 않습니다. 그래서 자바와 C#은 공용체를 아예 지원하지 않습니다. 언어 설계에서 안전성을 점점 더 중요하게 본다는 흐름을 보여 줍니다.
다음 편