반응형
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의 구현체로 결정했다는 의미입니다.
루비, 파이썬도 덕 타이핑을 많이 쓰고 있습니다.
원래 의미는 다음과 같습니다.
오리가 있다, 오리는 난다, 소리를 낸다 두 발로 걷는다로 정의할 경우
날 수 있고 소리를 내며 두발로 걷는 것은 전부 오리이다가 성립한다
그러므로 닭은 오리로 봐도 무방하다
반응형
'Go Lang > Study' 카테고리의 다른 글
[GoLang] Markdown을 HTML로 변환하기 (고도화) (0) | 2023.11.12 |
---|---|
[GoLang] Markdown을 HTML로 변환하기 (0) | 2023.11.05 |
[GoLang] 단축 URL 웹사이트 만들기 (0) | 2023.11.03 |
[GoLang] 구조체 선언 시 메모리 최적화 하기 (1) | 2023.10.29 |
[GoLang] 실수 오차 없애기 (1) | 2023.10.28 |