할당 가능성

할당 가능성 (Assignability)

어떤 값을 변수에 담을 때, 그 값의 타입이 변수의 타입과 정확히 일치해야만 담을 수 있는 건 아니에요. Go는 "이 값은 이 타입의 변수에 담아도 된다"라는 판단 기준을 따로 갖고 있는데, 이 기준을 **할당 가능성(assignability)**이라고 부르죠. 지금부터 이 기준이 정확히 어떻게 작동하는지 하나씩 살펴볼게요.

출처: Go Specification

본문

타입 V의 값 x는, 다음 조건 중 하나가 성립할 때 타입 T변수에 할당 가능하다고(assignable) 합니다. 흔히 "xT에 할당 가능하다"라고 표현하죠.

  • VT가 서로 동일(identical)한 타입인 경우.
  • VT가 동일한 기본 타입(underlying type)을 갖지만 둘 다 타입 파라미터가 아니고, VT 중 적어도 하나가 명명된 타입(named type)이 아닌 경우.
  • VT가 요소 타입이 동일한 채널 타입이고, V가 양방향(bidirectional) 채널이며, VT 중 적어도 하나가 명명된 타입이 아닌 경우.
  • T가 인터페이스 타입이되 타입 파라미터가 아니고, xT구현(implements)하는 경우.
  • x가 (부분적으로만 인스턴스화되었을 수도 있는) 제네릭 함수이고, T가 함수 타입이며, x에 대해 명시적으로 제공되지 않은 타입 인자가 (완전한 인스턴스화 후에) xT가 동일한 기본 타입을 갖도록 추론(infer)될 수 있는 경우 Go 1.27.
  • x가 선언된 식별자 nil이고, T가 포인터, 함수, 슬라이스, 맵, 채널 또는 인터페이스 타입이되 타입 파라미터가 아닌 경우.
  • x가 타입 T의 값으로 표현 가능(representable)무타입(untyped) 상수인 경우.

추가로, x의 타입 VT가 타입 파라미터인 경우에는, 다음 조건 중 하나가 성립할 때 x를 타입 T의 변수에 할당할 수 있어요.

  • x가 선언된 식별자 nil이고, T가 타입 파라미터이며, xT의 타입 집합(type set)에 속한 각 타입에 할당 가능한 경우.
  • V명명된 타입이 아니고, T가 타입 파라미터이며, xT의 타입 집합에 속한 각 타입에 할당 가능한 경우.
  • V가 타입 파라미터이고 T가 명명된 타입이 아니며, V의 타입 집합에 속한 각 타입의 값들이 T에 할당 가능한 경우.

더 알아보기