더북(TheBook)

11.3.3 튜플 타입 간 변환

튜플 리터럴 변환에 대한 요령을 이해했다면 암시적 혹은 명시적 튜플 타입 변환은 비교적 간단하게 이해할 수 있다. 표현식에 대해서는 걱정할 필요가 없으며 그저 타입 간의 변환만을 생각하면 된다. 튜플 내의 모든 요소가 그 각각에 대응되는 대상 타입으로 암시적 타입 변환이 가능하고 애리티가 동일하면, 해당 튜플 타입은 대상이 되는 튜플 타입으로 암시적 타입 변환이 가능하다. 마찬가지로 튜플 내의 모든 요소가 그 각각에 대응되는 대상 타입으로 명시적 타입 변환이 가능하고 애리티가 동일하면, 해당 튜플 타입은 대상이 되는 튜플 타입으로 명시적 타입 변환이 가능하다. 다음은 (int, string) 타입의 튜플을 다양한 타입으로 변환하는 예를 보여준다.

var t1 = (300, "text");  ----- t1 타입은 (int, string) 타입으로 추론
(long, string) t2 = t1;  ----- (int, string)을 (long, string)으로 암시적 형 변환 가능
(byte, string) t3 = t1;  ----- 유효하지 않음(int를 byte로 암시적 형 변환 불가능)
(byte, string) t4 = ((byte, string)) t1;  ----- (int, string)을 (byte, string)으로 명시적 형 변환 가능
(object, object) t5 = t1;  ----- (int, string)을 (object, object)로 암시적 형 변환 가능
(string, string) t6 = ((string, string)) t1;  ----- 유효하지 않음(int를 string으로 변환할 수 없음)

(int, string)(byte, string)으로 명시적 형 변환하는 네 번째 행에서 t4.Item1의 값은 44가 된다. int 값인 300byte로 명시적 변환했을 때의 결과가 그렇기 때문이다.

튜플 리터럴 변환과는 달리 튜플 요소의 이름이 서로 일치하지 않더라도 경고가 발생하지 않는다. 앞서 애리티가 5인 튜플 리터럴의 예를 살펴봤는데, 이와 유사한 예를 다음에 나타냈다. 달라진 부분은 리터럴을 타입으로 변환하지 않고 우선 튜플 리터럴을 변수에 저장한 후 타입 대 타입 변환을 수행했다는 점이다.

var source = (a: 10, wrong: 20, 30, pointless: 40, 50);
(int a, int b, int c, int, int) tuple = source;

이 코드는 경고 없이 깔끔하게 컴파일된다. 튜플 타입 간 변환 특성 중 일부는 튜플 리터럴 변환 시에는 그대로 적용되지 않는다. 그리고 이러한 타입 간 변환은 암시적 변환이 아니라 ID 변환이라는 점을 정확히 알고 있어야 한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.