공용체

같은 칸에 실수를 넣고 정수로 읽으면 무엇이 나올까?

공용체 타입

한 변수에 때마다 다른 타입

공용체(union)는 변수 하나가 실행 중 때에 따라 서로 다른 타입의 값을 담을 수 있는 타입입니다. 레코드는 필드마다 칸이 따로 있지만, 공용체는 같은 메모리 칸을 여러 타입이 함께 씁니다.

예시입니다. 지금은 정수를 넣고 나중에는 실수를 넣을 수 있습니다.

자유 공용체

넣은 타입과 다르게 읽으면

칸에 든 것은 비트일 뿐입니다. 실수로 넣은 비트를 정수로 읽으면 전혀 다른 수가 나옵니다. 지금 어떤 타입이 들었는지 언어가 검사하지 않는 공용체가 자유 공용체(free union)이고, C와 C++가 이 방식입니다.

32비트로 담았을 때의 예시 값입니다. 자유 공용체에서는 무엇을 넣었는지 프로그래머가 직접 챙겨야 합니다.

판별 공용체

표시를 붙여 두면 검사할 수 있습니다

값 옆에 지금 든 타입을 알려 주는 표시를 함께 두는 것이 판별 공용체(discriminated union)이고, 그 표시가 판별자(discriminant)입니다. 읽기 전에 판별자를 보면 되므로 타입 검사를 할 수 있습니다.

ML, Haskell, F#이 지원합니다. 타입 검사는 1강에서 본, 값의 종류가 맞는지 확인하는 일입니다.

공용체의 평가

아예 빼 버린 언어도 있습니다

자유 공용체는 타입 검사를 할 수 없어 안전하지 않습니다. 그래서 자바와 C#은 공용체를 아예 지원하지 않습니다. 언어 설계에서 안전성을 점점 더 중요하게 본다는 흐름을 보여 줍니다.

다음 편

값 대신 주소를 담는 타입으로 넘어갑니다

7편주소를 값으로 들고 다니면? 5강 목록