프로그래밍Go 개발자 / API 엔지니어

Go에서 type alias(타입 별칭)를 구현하고 사용하는 방법, 새로운 타입과의 차이점, 그리고 이 점이 특히 중요한 경우는 언제인가요?

Hintsage AI 어시스턴트로 면접 통과

답변.

문제의 역사:

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 재사용
  • 메서드가 필요한 캡슐화된 타입이 필요한 곳에서 alias 사용

실제 사례

부정적 케이스

프로젝트에서 새로운 타입이 아닌 alias를 사용하여 타입 이름을 변경하여 호환성이 깨진 경우

type OldType int

장점:

  • 고유한 메서드 정의 가능

단점:

  • 마이그레이션 시 타입 변환이 수동으로 필요하며, 역호환성이 깨짐

긍정적 케이스

API의 투명한 마이그레이션을 위해 type alias가 사용된 경우

type OldType = NewType

장점:

  • 호환성 문제 없음, 기존 코드 변경 필요 없음

단점:

  • alias를 통해서만 새로운 메서드를 추가할 수 없음