Go Lang/Study

[GoLang] Interface와 덕 타이핑

DSeung 2023. 11. 5. 16:08

GoLang에서 처음 Interface를 배울 때 가장 헷갈렸던 점은 

Interface에 포함되는 구현체 구분에서 따로 정의가 없는데 어떻게 구분할까였습니다.

그랬던 이유는 "덕 타이핑"이라는 특징 덕분입니다.

 

우선 Java와 같은 타 언어들에서는 아래처럼 Interface를 implements와 같은 키워드로 사용합니다

(아래 코드는 Java가 아닌 Go에서의 예제이고 에러가 발생하는 예제입니다.)

package main

type Animal interface {
	SetName(name string)
}

// impelments를 통해 interface를 지정
type Dog struct impelments Animal {
	Name string
}

func (d *Dog) SetName(name string) {
	d.Name = name
}

 

하지만 Go는 아래와 같이 별도의 키워드를 사용하지 않고 Interface를 사용합니다.

package main

import "fmt"

type Animal interface {
	SetName(name string)
	GetName() string
}

type Dog struct {
	Name string
}

func (d *Dog) SetName(name string) {
	d.Name = name
}

func (d *Dog) GetName() string {
	return d.Name
}

func introduce(animal Animal) {
	fmt.Printf("안녕하세요, 저는 %s입니다.\n", animal.GetName())
}

func main() {
	dog := &Dog{}
	dog.SetName("멍멍이")
	introduce(dog)
}

dog 변수가 Animal Interface를 받는 introduce 함수에서 정상적으로 실행되는 걸 볼 수 있습니다.

성공적으로 Interface를 구현했다는 걸 알 수 있습니다.

 

위에서 "덕 타이핑"이라고 하였는데 이것의 컴퓨터 프로그래밍 분야에서의 정의는 다음과 같습니다.

=> 객체의 변수 및 메서드가 객체의 타입을 결정하는 것을 의미합니다.

 

즉 여기서는 GetName, SetName 메서드가 dog를 Animal Interface의 구현체로 결정했다는 의미입니다.

루비, 파이썬도 덕 타이핑을 많이 쓰고 있습니다.

 

원래 의미는 다음과 같습니다.

 

오리가 있다, 오리는 난다, 소리를 낸다 두 발로 걷는다로 정의할 경우

날 수 있고 소리를 내며 두발로 걷는 것은 전부 오리이다가 성립한다

그러므로 닭은 오리로 봐도 무방하다

 

 

반응형