[Go] 인터페이스의 기묘한 동작
Go의 인터페이스는 동작 방식이 좀 기묘한 편이다.
기본적으로 인터페이스는 원본 객체를 가리키는 포인터 값이나, 경우에 따라서는 아닐 수도 있다는 것이다.
일단 간단한 예제코드를 깔고 시작해보겠다.
큰 의미없는 인터페이스 하나 두고
구현체 둘만 적당히 뒀다.
그리고 실행하면, 각 구현체대로 잘 동작할 것이다.
여기까지가 약간 일반적인 사용 패턴이다.
예외: 리플렉션
Go에서는 리플렉션 떡칠을 통해서 문제를 해결하는 경우가 매우 많다.
그러다보면 이런 문제에 종종 부닥칠 수 있다.
방금 사용한, 인터페이스를 받는 함수에서 인터페이스 객체의 리플렉션 정보를 사용한다고 가정해보자.
수정이나 요소 값 획득이나 이것저것 다양한 것을 할 수 있겠지만, 여기서는 타입 정보만 획득해보겠다.
명시적으로 객체의 포인터를 넘겨서 인터페이스로 전달했을 경우에는, TypeOf를 쓰면 원본 객체의 포인터 타입을 기대한 대로 가리키는 것을 확인할 수 있다.
그런데 사실, 인터페이스에는 포인터가 들어가지 않을 수도 있다.
포인터가 아닌 객체를 넣어도 인터페이스로의 변환-전달이 가능하며,
이런 경우에는 포인터가 아니다.
이건 단순히 타입 정보에 국한되는 것이 아니라, 실제로도 포인터로 전달되지 않기 때문에 값 수정도 불가능하며, 내부 필드 정보를 조회하거나 하는 것도 접근 단계가 달라진다.
포인터가 들어오는 것을 가정하고 작성했는데, 값이 들어온다면 뻗을 수 있는 것이다.
그래서 리플렉션을 통해서 동적으로 내부 요소에 접근하는 레이어가 있다면 유의해서 사용할 필요가 있다.
난 이걸 강타입 언어라고 불러야 하는건지 잘 모르겠다.