CafeM0ca

[Go] Interface 본문

Programming/Go

[Go] Interface

M0ca 2020. 12. 4. 14:48
반응형

tour.golang.org/methods/9

 

A Tour of Go

 

tour.golang.org

Go는 클래스가 없다.

Interface 타입은 메소드 시그니쳐를 갖는다.

interface 타입은 메서드를 갖는 값들을 가질 수 있다.

 

처음에 Abser라는 인터페이스를 선언했고 Absersms Abs()라는 메서드를 갖는다.

오른쪽 코드에서 Abs는 2개가 있다.

 

1. MyFloat를 value로 받는 메소드

2. Vertex를 pointer로 받는 메소드

 

Abser 타입의 변수 a에 f를 대입한다. f는 MyFloat 타입으로 Abs함수를 갖고 있다.

실행 결과

f의 Abs는 Receiver가 value다. 따라서 a = f로 대입한다.

v의 Abs는 Receiver가 pointer다. 따라서 a = &v로 대입한다.

a = v는 안된다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Interface 타입은 메서드가 무조건 구현되어야 한다. 구현되지 않을꺼면 interface 키워드를 붙이지 말자.

implicit(암묵적인) interface는 인터페이스의 정의가 구현으로부터 분리 되어있다. 그래서 사전에 순서에 상관없이 어떤 패키지에서나 구현이 나올 수 있다.

 

오른쪽 코드에서 M이라는 메서드는 I라는 인터페이스에 대한 구현이다. 

 

우리가 명시적으로 선언해줄 필요가 없다. (인터페이스가 있으면 어디서든 구현해도 된다는 의미)

 

 

 

 

 

 

 

 

 

 

 

 

 

내부적으로, 인터페이스의 값은 (value, type)의 tuple로 되어있다.

따라서 인터페이스의 메소드는 타입에 맞는 메소드를 호출한다.

 

오른쪽 코드에서 33번째 줄에 string은 포인터 타입이라 포인터를 receiver로 받는 M()이 호출되고

 

37번째 줄에서는 i가 value를 받기 때문에 value를 receiver로 받는 M()이 호출된다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

인터페이스의 값이 nil이면 메소드는 nil receiver로 호출된다. 

 

 

 

 

Empty interface에 대해 알아보자.

Empty interface는 메소드가 없는 것을 의미한다.

 

또한 어떤 타입이든 들어올 수 있다.

예제를 보면 6번째줄에 empty interface를 선언하고 출력하면 (value, type)이 nil로 되어있다.

 

9번째 줄에서는 42를 대입하고 출력한다. 값은 42, 타입은 int로 나온다.

 

fmt.Print가 이런식으로 구현되어 있다.

반응형
Comments