ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Golang #3 - Interface
    Tech/Development 2021. 3. 1. 18:56

    Golang #3 - Interface

    What is interface?

    interface란 Duck Typing 방식으로 동작하는 Golang의 타입으로 객체의 Method를 따로 정의해둔 모음집이라고 할 수 있습니다. 여기서 말하는 Method는 우리가 흔히 말하는 함수와는 조금 다릅니다. Method는 객체의 '행동' 자체에 초점을 맞춘 개념이죠.

     

    Duck Typing이란 만약 어떤 새가 오리처럼 헤엄치고 꽥꽥 소리를 낸다면 그 새는 오리라는 결론에 도달하는 개념입니다. 간단히 말해 정말 객체의 행동 자체가 중요하다는 것이며, 오리처럼 행동하기만 하면 사람이든 뭐든 그 객체는 오리가 된다는 뜻입니다. 다시 설명하자면, 객체의 상태와 기능 중에서도 기능을 따로 디커플링하여 코드의 확장성과 다형성이라는 특징을 구현하기 위한 타입이라 할 수 있습니다.

    Declare interface

    자, 그러면 interface를 선언해보도록 합시다. 아래 선언한 Duck interface의 경우 아무런 Method가 연결되어 있지 않은 Empty interface(ex. fmt package, Println)입니다. 이러한 경우, 암시적으로 모든 Type을 구현했다고 볼 수 있습니다. 예를 들어, Person과 Gopher라는 구조체를 만들어 확인해본다면, 해당 구조체들이 Duck interface를 구현한 것으로 확인됩니다. 신기하지 않나요. 명시적으로 Person과 Gopher가 Duck interface를 구현한다고 하지 않았는데도 말이죠.

    package main
    
    import "fmt"
    
    type Duck interface{}
    
    type Person struct{}
    type Gopher struct{}
    
    func main() {
    
      var d Duck
    
      p := Person{}
      g := Gopher{}
    
      d = p
      d = g
    
    }
    

     

    다음은, interface 안에 method를 포함시켜 보도록 합시다. 이제 Duck interface는 Swim과 Quack Method를 가집니다. 또한, 각 구조체들도 Method를 연결시켜줬습니다. Person의 경우 Swim/Quack을, Gopher의 경우 Swim을, Swan은 아무런 Method를 연결시키지 않았습니다. 이제 각각의 구조체가 어떤 interface를 구현했는지 확인해보도록 합시다. 

    type Duck interface {
      Swim()
      Quack()
    }
    
    type Person struct {}
    
    func (p Person) Swim() {
    	fmt.Println("Swim")
    }
    
    func (p Person) Quack() {
    	fmt.Println("Quack")
    }
    
    type Gopher struct {}
    
    func (g Gopher) Swim() {
    	fmt.Println("Swim")
    }
    
    type Swan struct {}
    
    func (s Swan) Walk() {
    	fmt.Println("Walk")
    }
    
    func main() {
    
      var d Duck
    
      d = Person{} // 정상작동
      d = Gopher{} // Error. Gopher does not implement Duck (missing Quack method)
      d = Swan{}   // Error. Swan does not implement Duck(missing Quack method)
    
    }

     

    Person은 Duck interface를 구현하였으나 Gopher와 Swan은 구현했다고 볼 수 없습니다. Gopher의 경우 헤엄칠줄만 알지 꽥 소리를 못 내니까요. 마찬가지로 Swan도 걸을 줄만 알고 Duck처럼 헤엄치거나 꽥 소리를 낼 수 없으니까요. 여기서 중요한 것은, 구조체가 interface의 특정 Method들 몇 개만을 내포하고 있다는 것으로는 특정 interface를 구현했다고 볼 수 없다는 것입니다. 한 가지가 없거나 더 많다거나 한다면. 즉, interface의 Method들만을 꼭 가져야지만이 구현했다고 볼 수 있는 것이죠.

     

    이러한 interface를 통해 우리는 동적으로 타입을 가질 수 있게 되었습니다. Duck에 Person이라는 타입의 객체를 넣을 수도 있고, 이 외에도 Duck의 Method를 가진 객체가 있다면 타입의 객체로 선언할 수 있으니까요. 위 예제에서는 Person 하나 밖에 없지만, Person 외에 여러 개의 동적타입을 가질 수가 있게 되었습니다. 이러한 것을 다형성이라하며 다양한 자료형을 가질 수 있는 특성이라고 말합니다. 거기다 어떠한 명시적 키워드들을 사용할 필요 없이 동적으로 타입을 구현할 수 있다는 것이죠. Duck을 구현하도록 강제한 것이 아니라 모든 것이 암시적으로 자동으로 이루어진 것입니다. 

     

    이 외에도 interface도 타입의 한 종류이기 때문에 interface 안에 Method말고도 interface 자체를 포함시킬 수 있습니다. 아래를 보면, Bird라는 새로운 interface 안에는 Duck interface가 포함되어 있죠. Person 객체의 경우, Bird안에 있는 Fly, Swim/Quack(Duck)을 포함하고 있기에 Bird interface를 구현했다고 볼 수 있습니다. 

    package main
    
    import "fmt"
    
    type Bird interface {
    	Fly()
    	Duck
    }
    
    type Duck interface {
    	Swim()
    	Quack()
    }
    
    type Person struct {
    }
    
    func (p Person) Swim() {
    	fmt.Println("Swim")
    }
    
    func (p Person) Quack() {
    	fmt.Println("Quack")
    }
    
    func (p Person) Fly() {
    	fmt.Println("Fly")
    }
    
    func main() {
    
    	var b Bird
    
    	b = Person{} // 정상작동
    
    	fmt.Println(b)
    
    }
    

    interface와 관련해 많은 내용이 있지만, 여기까지 다루어보고자 합니다. Python과 Javascript만 다루어봤던 입장에서 이해하기 참 어려운 부분도 있었지만, 참 재미있다고 느껴집니다. 앞으로 배워가는 동기가 계속 생기네요. 

     

    참고자료

    - 2020 TIL no.8 - Go의 Interface, @kykevin.log

     

    2020 TIL no. 8 - Go의 Interface

    스터디 자료 출처 https://medium.com/rungo/interfaces-in-go-ab1601159b3a Golang의 Interface란 무엇인가 Golang에서 Struct는 다양한 타입의 필드들로 이루어진 구조체들을 의미하며, Method를 선언하는

    velog.io

    - Go와 OOP, @mingrammer

     

    [번역] Go와 OOP

    theamydance의 Go and OOP… Sorta를 번역한 글입니다. 나는 2016년 7월 18일에 Go를 시작했다. 3주 후, 나는 NYC의 Women Who Go 밋업에서 처음으

    mingrammer.com

    - Golang으로 만나보는 Duck Typing, @Popit.kr

     

    golang으로 만나보는 Duck Typing | Popit

    Duck Typing ( 이하 덕 타이핑) 이란 방식이 세상에 알려진지는 상당한 시간이 지났다. 이미 덕 타이핑을 이해하고 덕 타이핑 동작 방식을 수용한 Program Language 를 도입하여 사용하는 이들도 있지만

    www.popit.kr

     

    'Tech > Development' 카테고리의 다른 글

    Linux Programming - File Descriptor(2)  (0) 2021.05.22
    Linux Programming - File Descriptor(1)  (0) 2021.05.21
    Golang #2 - Method vs Function  (0) 2021.03.01
    Golang #1 - Map  (0) 2021.02.14
    Golang Reserved Words  (0) 2021.02.11

    댓글 0

Designed by Tistory.