문제의 역사:
Go에서 타입 별칭(type alias)의 등장은 API 버전 간 매끄러운 전환을 보장하기 위한 필요성과 관련이 있습니다. Go 1.9 이전에는 새로운 타입의 선언만 사용되었으나, 이제는 타입 별칭이 지원됩니다.
문제:
많은 사람들이 alias와 새로운 타입을 혼동하여 동일하다고 잘못 생각하고, 이는 변환, 메서드, 인터페이스에 전달 시 오류를 초래합니다.
해결책:
타입 별칭은 기존 타입에 대한 대체 이름을 생성하는 반면, 새로운 타입의 선언은 기존 타입을 기반으로 새로운 고유 타입을 생성하는 것입니다. 별칭은 이전 버전과의 호환성을 유지하며 변환 없이 오래된 타입과 새로운 타입을 통합할 수 있게 합니다.
코드 예시:
// 새로운 타입 type MyString string // 타입 별칭 type MyStringAlias = string
주요 특징:
별칭을 통해 타입에 메서드를 추가할 수 있나요?
아니요, 메서드는 새로운 타입에만 추가할 수 있으며, 별칭은 새로운 타입이 아니라 원래 타입과 동일합니다.
type Alias = int // func (a Alias) Method() {} // 오류!
alias와 새로운 타입의 비교에서 차이가 무엇인가요?
Alias는 기본 타입과 비교할 수 있으며 변환 없이 그 값을 가질 수 있습니다. 새로운 타입은 같은 타입에 기반하더라도 호환되지 않습니다.
type T1 = int var a T1 = 10 // ok var b int = a // ok type T2 int var c T2 = 10 // var d int = c // 컴파일 오류
언제 alias가 새로운 타입보다 나은가요?
패키지 간 타입의 재수출이나 클라이언트 코드를 재컴파일하지 않고 API의 투명한 마이그레이션이 필요할 때입니다. 예를 들어:
type OldType = NewType // 별칭은 이전 API 버전 지원에 더 편리함
프로젝트에서 새로운 타입이 아닌 alias를 사용하여 타입 이름을 변경하여 호환성이 깨진 경우
type OldType int
장점:
단점:
API의 투명한 마이그레이션을 위해 type alias가 사용된 경우
type OldType = NewType
장점:
단점: