Go 언어는 클래스와 객체를 가지고 있지 않다. 클래스와 객체를 가지고 있지 않아도 객체지향 프로그래밍 언어라고 할 수 있을까 ? "객체지향"은 일종의 소프트웨어 개발 방법론으로 언어의 종류와는 상관없다. 예컨데, 절차지향 언어라는 C 언어로도 객체지향적인 프로그래밍이 가능하다. C로 구현한 GUI 툴킷인 GTK의 경우 객체지향적인 방식으로 개발됐다. 단 언어가 얼마나 자연스럽게 객체지향적 프로그래밍이 가능하도록 지원하느냐 라는 관점에서 본다면.... 할 이야기가 좀 있을 거다.
Go 언어도 비슷한 관점에서 볼 수 있을 것 같다. Go 언어는 전형적인 객체지향 언어의 형태에는 맞지 않는 부분이 있지만, 다른 방식으로 객체지향을 위한 기본적인 기능의 대부분을 제공한다.
Interfaces를 이용한 다형성(polymorphism) 지원
Export를 이용한 Namespace의 지원
automatic message delegation via embedding
methods on any type we define, with no boxing or unboxing
Go는 클래스와 상속을 지원하지 않기 때문에 "is - a relationship"을 이용해서 우회해서 (비슷하게) 구현해야 한다. Go언어로 상속을 구현하려면 composition이라는 객체지향 디자인을 이용해야 한다. 이런 식으로 우회하는게 올바른 객체지향 개발 방법이라고 볼 수 있느냐라는 의견이 있을 것 같다. 이 의견에 대한 답은 다음과 같다.
"객체지향에 있어서 클래스와 상속은 옵션이다. 모든 문제는 하나 이상의 풀이 방법을 가지고 있다." - Sandi Metz
형태만 만들어 둔 다음, 필요에 따라서 실 구현을 하는 객체지향의 기법으로, C++, Java, C#의 인터페이스와 비슷한 개념이다.
면적을 구하는 함수를 만든다고 가정해보자. 이 함수는 길이와 관련된 한 두개의 매개변수가 필요할 거다. 이 함수의 이름은 Area()로 하자. 헌데, Area()함수의 구현은 면적을 구하는 대상에 따라서 달라진다. 가장 손쉬운 구현은 삼각형과 사각형, 원 각각의 Area()를 구현하는 거다. circle.Area(), triangular.Area(), rectangle.Area() 이런식이 되겠다. 객체지향에서는 인터페이스를 만들고 실제 구현은 상속체에서 구현하는 방식을 이용한다. C++ 예제다.
자전거 대여점을 운영한다고 가정해 보자. 자전거는 spare 파트를 가지고 있는데, 자전거의 종류에 따라서 spare 파트도 다르게 구성해야 한다. 이 문제를 해결 하기 위한 가장 널리 알려진 방법 중 하나는 "클래스 상속"을 이용하는 거다. Bicycl라는 이름의 base 클래스를 만들고, 이 클래스로 부터 상속된 MountainBike와 RoadBike를 만들면 된다. 나는 클래스 상속 대신에 composition을 이용해서 구현할 거다.
자전거는 Size와 Parts로 구성된다. 자전거를 대여 할 때의 기준은 Size와 Parts가 되며, 각 파트별로 Spare를 준비할지를 결정한다. 이제 Bicycle 스트럭처로 새로운 타입의 자전거를 하나 만들면, Parts에 연결된 Spares()메서드를 이용할 수 있게 된다.
지금까지의 내용을 그림으로 묘사했다.
클래스는 사물의 순수한 원형으로, "Bycycle"이 되겠다 . 이 하나 뿐인 원형으로 부터 파생되는 객체가 "mountainBike", "roadbike"등 수많은 자전거들이다. 이들 자전거들은 parts로 구성되고, Spare()메서드를 이용해서 parts를 조작한다.
사물의 원형으로 부터 파생
각각의 객체는 사물을 구성하는 속성을 가진다.
각각의 객체는 속성을 제어하는 메서드를 가진다.
OOP의 기본적인 요소들을 모두 충족한다. 단 일반적인 객체지향 언어에서 사용하는 클래스와는 그 차이가 좀 보일 거다. OOP 언어에서의 클래스는 클래스 타입안에 속성(데이터)와 메서드를 모두 내장한다. 하지만 golang은 속성과 메서드를 별개의 구성요소(composition)으로 하고 이들을 조립하는 방식으로 객체지향을 구현한다.
Contents
1. Go 객체지향 프로그래밍
1.1. 메서드와 인터페이스
1.1.1. 메서드
1.1.2. 인터페이스
1.2. Composite OOP 디자인
1.2.1. 패키지
1.2.2. Types
1.2.3. 메서드
1.2.4. Embedding
1.2.5. Composite
1.2.6. 정리
2. 참고
1. Go 객체지향 프로그래밍
1.1. 메서드와 인터페이스
1.1.1. 메서드
1.1.2. 인터페이스
1.2. Composite OOP 디자인
1.2.1. 패키지
1.2.2. Types
1.2.3. 메서드
1.2.4. Embedding
1.2.5. Composite
1.2.6. 정리
2. 참고
Recent Posts
Archive Posts
Tags