프로그래밍

type conversion과 type assertion의 차이

2kindsofcs 2020. 2. 24. 18:00

v1 := int(n) // type conversion

v2, ok := n.(int) // type assertion

 

v1도 정수이고 v2도 정수일 것이다(에러가 나지 않는다면).

위 두 줄의 코드는 어떻게 다른가?

 

 

1. type conversion

type casting이다. Golang에서는 명시적으로 형변환을 해줘야 한다. 자동으로 형변환을 해주는 일 따위는 없다.

예를 들어, int형을 int64형으로 바꾸고 싶다면 아래와 같이 명시적으로 코드를 작성해야 한다.


var n int = 15
var v1 int64 = int64(n)

데이터 타입이 A인 것을 A가 아닌 다른 타입으로 바꾸는 것이다.

 

 2. type assertion

네이버 영영사전에서 assert의 뜻을 찾아보면, 첫 번째 의미가 아래와 같이 나온다.

If someone asserts a fact or belief, they state it firmly.

사실임을 주장하는 것이다. conversion이 전환, 개조 등의 뜻을 가진 데 비해 의미가 확연히 다르다.

type assertion은 단어 뜻에서도 나타나듯이, 형 변환과는 상관이 없다. 

 

a tour of go에서도 type assertion을 다루고 있다. 

A type assertion provides access to an interface value's underlying concrete value.

 

type assertion은 인터페이스가 가지고 있는 실제 값(concrete value)에 접근할 수 있게 해준다. 

(golang의 인터페이스는 임의의 타입 값을 가질 수 있기 때문에 concrete라는 표현을 쓴 듯 하다.) 


var n interface{} = 15
v := n.(int)

위의 코드에서 우리는 n이라는 interface의 값이 실제로는 int타입임을 알 수 있다.

따라서 type assertion을 이용하여 n의 실제 값에 접근할 수 있다. 

 

어떤 인터페이스 값이 특정 타입임인지를 확인하기 위해서 ok 값을 받을 수도 있다.


v, ok := n.(int)

만약 n의 타입이 int가 아니라면 v는 int의 zero value인 0이 될 것이고, ok는 false가 될 것이다. 

 

반응형