본문 바로가기
Golang/Study

chapter3(8) primitive type - interface{} and nil

by 윤원용 2022. 2. 6.

책에는 interface{} 타입을 소개하는 정도의 분량을 갖고 있다. 예제도 2개뿐.... 그래서 궁금한 것들을 스스로 예제 코드로 만들어 포스트 하겠다.

 

interface{}

Go언어도 Java의 Object class와 같이 최상위 타입이 존재한다. 이전 글에서 배열 변수 선언 시 [5]int는 대괄호([]) 까지가 타입이라고 말했었는데 interface 또한 중괄호({}) 까지가 타입이다. interface{} 변수의 선언 방법은 명시적 선언뿐인데 초기화 영역에 어떠한 값이든 초기화가 가능하다.

Go의 Object인 interface{}

위 사진과 같이 모든 자료형을 저장할 수 있다. Go는 타입을 엄청 강하게 검사하는데 a변수에 b변수를 대입할 때 오류가 발생할까?

가능하다. 그럼 interface{} 타입인 변수를 묵시적으로 변수 선언 시 초기화 값으로 사용하면 어떻게 될까?

이것 또한 상관없이 사용할 수 있다. 예제 코드를 따라 치다 궁금한 게 생겼는데 interface{}로 선언한 변수들의 타입은 interface{} 타입일까?

럴수럴수 이럴수가...

정답은 아니다. a부터 f까지 변수들의 타입은 interface{}가 아닌 변수 선언 시 초기화한 값의 타입이나 대입한 값의 타입으로 출력된다. 책에는 나와있지 않지만 개인적인 생각으로는 어떻게 보면 당연한 것 같다. Go는 변수 선언의 방법으로 묵시적 선언을 지원하는데 초기화하는 값의 타입으로 컴파일 시 타입 추론 개념을 사용하여 메모리를 할당한다. interface{} 타입도 똑같이 타입 추론 개념을 사용하여 타입이 정해지는 것이 아닐까?라고 생각을 해봤다.
예제 코드를 만드면서 점점 궁금한 부분이 생기는데 interface{} 타입으로 선언 시 초기화한 값의 타입처럼 연산이 가능한지 궁금해졌다. Java는 상속 개념이 있어서 Object 타입으로 선언한 변수에 자식 클래스를 instance 시 해당 변수가 자식 클래스의 자원을 사용하려면 down casting(type casting)을 선행해야 한다. Go의 interface{} 타입은 어떨까?

invalid operation: operator + not defined for a (variable of type interface{})

...? 배열 변수인 e의 0번째 메모리에 접근도 안되고 float64 타입인 a와 b변수 덧셈 연산도 안된다... 그럼 "Go도 casting을 할 수 있으니 casting을 한 후 연산이 가능할까?"라는 의문이 생겼다.

cannot convert a (variable of type interface{}) to int

casting자체가 안된다.... (뭐야... 이거 어디다 써먹어???) 그... 그럼 배열을 복사할 때 얕은 복사일까? 깊은 복사일까?

array type 대입 연산과 똑같다

 

array type과 똑같은 방식이 적용돼 있다는 것을 볼 수 있다. 

이런 의문점들을 코드로 작정하면서 출력하여 보며 느낀 점은 interface{} 타입은 초기화하는 값의 타입과 똑같은 방식이 적용되고 연산은 불가능 하지만 단순히 값을 표현하는 타입이라는 걸 알 수 있다.
(책을 끝까지 읽으면 사용할 수 있는 방법이 있을 수도 있겠지만... 아직은 내공이 부족하다.)

nli

nli은 별거 없다. Java의 null이랑 같고 nli은 Error 처리할 때 또 이야기해야 해서 간단히 하겠다. nli은 interface{} 타입의 기본 값이다.

interface{} 타입의 기본 값

"기본 값이 nil이면 묵시적 선언이 가능한 게 아닌가?"라는 생각이 들어서 코딩해봤다.

use of untyped nil

interface{}의 기본 값이지만 묵시적 선언을 할 순 없었다. "명시적으로 interface{} 타입 변수 선언 시 nil를 초기화 값으로 사용할 수 있을까?"라는 생각과 "선언한 변수의 타입을 출력해보자"라는 생각이 낫다.

묵시적은 안돼지만 명시적은 됌

신기하게 interface{} 타입에 nil로 초기화하면 <nil>이 타입으로 나온다.

 

책에 예제라곤 2개뿐이어서 궁금한 것들을 인터넷에 검색하지 않고 포스트 했다.  앞으로 많이 사용할 타입인 것 같지만 지금 이걸 어느 곳에서 활용할지는 잘 모르겠다 ㅎㅎ 나중에 더 정확하게 포스트 해보겠다. ㅃ2~

다음 포스트 할 내용은 원래는 연산자이지만 딱히 특별한 게 없어서(한 개 있음) 바로 함수를 포스트 하겠다.

ㅃ2~