더북(TheBook)

자바 같은 엄격한 객체 지향 언어에서는 특정 클래스가 어떤 인터페이스를 구현하는지 명시적으로 표기해주어야 한다. 당연한 말이지만 어떤 클래스가 특정 인터페이스로 사용되려면 implements 키워드로 명시해주어야 한다. 이 말을 뒤집어 생각해 보자. implements 키워드로 특정 인터페이스를 구현한다는 표기를 해주지 않으면 인터페이스에 정의된 메서드를 구현했다 하더라도 그 인터페이스로 사용할 수 있는 방법은 없다.

그림 1-12 자바와 Go의 인터페이스 비교

컴파일 언어로 특정 라이브러리나 프레임워크와 호환되는 어떤 객체를 만들려면 특정 인터페이스나 클래스를 상속받아 구현하는 것이 일반적이다(물론 동적으로 인보킹시킬 수도 있지만, 이와 같은 리플렉션 방식은 여러 가지 이유로 꼭 필요한 경우가 아니라면 자제하는 것이 좋다). 그렇게 생성된 클래스는 특정 라이브러리나 프레임워크와 연결 고리가 생겨버려 확장성이 떨어지게 된다.

Go는 인터페이스의 이러한 특징 덕에 모듈 간의 연계가 아주 쉽다. Go의 일반적인 패턴은 전체 플로우를 제어하는 미들웨어를 만들고, 인터페이스 기반으로 전체 플로우를 제어하게 해서 라이브러리나 패키지를 담을 수 있는 형태로 미들웨어를 만드는 것이다.

Go의 인터페이스를 덕 타이핑 방식으로 동작하도록 설계한 것은 개인적으로 신의 한 수라 생각한다. Go의 인터페이스는 정적 언어에다 동적 언어의 유연함과 자유를 더해주고, 컴파일러의 도움을 받으며 동적인 코딩을 할 수 있게 해준다.

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