🔥 타입 스위치

337자
5분

Go 언어에서는 interface를 통해 다양한 타입의 값을 처리할 수 있습니다. 하지만 interface 값의 실제 타입을 알아내기 위해서는 타입 단언(type assertion)을 사용해야 합니다. 여러 개의 타입 단언을 연속적으로 수행해야 하는 경우, 타입 스위치(type switch)를 사용하면 편리합니다.

타입 스위치는 일반적인 스위치 문과 유사하지만, 케이스에서 값 대신 타입을 지정한다는 점이 다릅니다. 각 케이스에서 지정한 타입과 주어진 interface 값의 실제 타입을 비교하여 일치하는 케이스로 분기됩니다.

switch v := i.(type) {
case T:
    // 여기서 v는 T 타입입니다.
case S:
    // 여기서 v는 S 타입입니다.
default:
    // 매칭되는 타입이 없으면 v는 i와 같은 타입과 값을 가집니다.
}
 
go

타입 스위치의 선언부는 타입 단언 i.(T)와 동일한 문법을 따르지만, 특정 타입 T 대신 type 키워드를 사용합니다.

위의 스위치 문은 interfaceiT 또는 S 타입의 값을 가지고 있는지 검사합니다. 각 TS 케이스에서 변수 v는 각각 T 또는 S 타입이 되며, i가 가지고 있는 값을 저장합니다. 기본(default) 케이스에서는 매칭되는 타입이 없으므로, 변수 vi와 동일한 interface 타입과 값을 가집니다.

다음은 타입 스위치를 사용하여 interface 값의 타입에 따라 다른 동작을 수행하는 예제 코드입니다.

package main
 
import "fmt"
 
func do(i interface{}) {
	switch v := i.(type) {
	case int:
		fmt.Printf("전달받은 값 %v의 두 배는 %v입니다.\n", v, v*2)
	case string:
		fmt.Printf("%q의 길이는 %v 바이트입니다.\n", v, len(v))
	default:
		fmt.Printf("%T 타입은 처리할 수 없습니다!\n", v)
	}
}
 
func main() {
	do(21)      // int 타입 처리
	do("hello") // string 타입 처리
	do(true)    // bool 타입은 처리할 수 없음
}
 
go

위 코드에서 do 함수는 interface{} 타입의 매개변수를 받습니다. 함수 내부에서는 타입 스위치를 사용하여 전달받은 값의 실제 타입을 검사합니다.

  • int 타입인 경우, 전달받은 값과 그 값의 두 배를 출력합니다.
  • string 타입인 경우, 전달받은 문자열과 그 길이를 출력합니다.
  • 그 외의 타입인 경우, 처리할 수 없다는 메시지와 함께 타입 정보를 출력합니다.

main 함수에서는 do 함수를 호출하면서 다양한 타입의 값을 전달합니다. 실행 결과는 다음과 같습니다.

전달받은 값 21의 두 배는 42입니다.
"hello"의 길이는 5 바이트입니다.
bool 타입은 처리할 수 없습니다!
text

타입 스위치를 활용하면 interface 값의 실제 타입에 따라 적절한 처리를 수행할 수 있으므로, 다양한 타입을 다루는 코드를 보다 간결하고 가독성 있게 작성할 수 있습니다.