객체지향에 준하는 프로그래밍 언어의 조건
객체지향에 준하는 프로그래밍 언어의 조건이란 무엇을 의미할까?
다양한 주장이 있지만 " Go 언어로 배우는 웹 애플리케이션 개발 "에서는 다음 3대 요소를 만족하는 것이 "객체지향에 준하는 프로그래밍 언어"라고 정의한다.
- 캡슐화(encapsulation)
- 다형성(polymorphism)
- 상속(inheritance)
먼저 Go 언어는 객체지향 언어일까? Go 공식 사이트에서는 'Yes'면서 'No'이기도 하다는 애매한 답변을 하는데, 이는 Go가 객체지향의 3대 요소를 일부만 도입하고 있기 때문이다.
Go에서는 서브클래스화 사용 불가
많은 사람들이 객체지향 언어에 기대하는 것 중 하나가 서브클래스(subclassing) 일 것이다. 좀 더 쉬운 말로 바꾸자면 클래스(단일)의 계층 구조(부모 자식 관계)에 의한 상속을 의미한다.
대표적인 객체지향 언어인 자바로 서브클래스화를 작성한 것이 아래 코드다. 부모인 Person 클래스, 자식인 Korean 클래스, Person 객체를 인수로 받는 메서드가 포함돼 있다.
자바에서는 Person 클래스를 상속한 Korean 클래스의 객체는 다형성에 의해 Person 변수에 대입할 수 있다. 마찬가지로 Person 클래스를 인수로 받는 메서드에도 대입할 수 있다.
위와 같이 다형성을 목적으로 한 상속 관계를 표현할 때 Go는 구체 클래스(concrete class)나 추상 클래스(abstract class)를 부모로 하는 서브클래스 상속 구조를 지원하지 않는다.
내장과 상속
Go 언어는 전통적인 객체지향 언어와 다르게 상속을 지원하지 않는다. 대신 내장(embedding)을 통해 유사한 기능을 제공합니다. 하지만 내장은 엄밀히 말하면 상속이 아니며, 구조체 간의 재사용성을 높이기 위한 방법이다.
아래 코드는 Go에서 내장을 사용하는 방식이다.
아래 코드에서 BullDog와 ShibaInu는 각각 Dog 구조체를 내장하여 Dog의 Bark 메서드를 오버라이드한다. 내장을 통해 구조체의 메서드를 재사용할 수 있지만, 이는 전통적인 객체지향 언어의 상속과는 다르다.
Go 언어는 SOLID 원칙을 완전히 따르지 않지만, 기본적인 개념을 도입하여 병용성 높은 코드를 작성할 수 있다. 예를 들어, 리스코프 치환 원칙(Liskov Substitution Principle, LSP)을 적용하여 인터페이스를 사용하면 유연한 코드를 작성할 수 있다.
이 코드에서 Dog와 Cat 구조체는 Animal 인터페이스를 구현하고 있다. Animal 인터페이스는 Speak 메서드를 정의하며, 각 구조체는 이를 구현한다. 리스코프 치환 원칙에 따라, Dog와 Cat 객체는 Animal 타입으로 대체될 수 있다.
출처
'Dev > Go' 카테고리의 다른 글
Go에서는 테스트 코드를 어떻게 작성할까 (0) | 2024.08.05 |
---|---|
Error 1205 (HY000): Lock wait timeout exceeded; try restarting transaction 해결 과정 (0) | 2024.07.31 |
Go 코딩 컨벤션 (0) | 2024.07.11 |
미들웨어 패턴 (0) | 2024.07.06 |
Go와 의존성 주입 (0) | 2024.07.05 |