더북(TheBook)

Go는 상태를 표현하는 ‘타입’동작을 표현하는 ‘메서드’를 분리하여 정의한다. 타입은 어떤 값을 표현하는 수단이고, 메서드는 특정 타입의 동작을 표현한다. 이렇게 각각 따로 정의된 타입과 메서드를 바인딩하여 객체를 표현한다. 이처럼 객체의 상태와 동작이 느슨하게 결합된 방식이라 더욱 자유롭게 객체 기반의 프로그래밍을 할 수 있다. Go의 내장 타입이나 다른 패키지에 정의된 타입에도 원하는 메서드를 바인딩할 수 있어서 좀 더 자연스럽게 해당 타입을 사용할 수 있다.

또 한 가지 특이한 점이 있다. 전통적인 객체 지향 언어는 상속으로 코드를 재사용하는데 Go의 구조체(struct)는 상속을 할 수 없다는 점이다. 대신 구조체가 다른 구조체를 포함하는 임베디드 타입 형태로 구조체를 정의할 수 있다. 이는 클래스 간의 과도한 상속 관계로 프로그램이 복잡해지는 것을 방지한다. Go는 상속이 아니라 조합으로 코드를 재사용한다.

그림 1-2 상속과 조합

물론 다른 언어에서도 조합으로 타입을 정의할 수 있다. 하지만 이는 상속을 구현하는 것보다 복잡하고 어려워서 실제로 많은 개발자가 고민 없이 상속을 사용한다. 앞서 말했듯이 Go의 구조체는 조합으로만 정의할 수 있다. 따라서 이를 기반으로 코드를 작성하다 보면 조합으로 문제를 해결하는 것에 자연스레 익숙해진다.

기본 문법은 2장에서, Go의 객체 지향 표현 방식은 4장에서 자세히 설명한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.