ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Golang #2 - Method vs Function
    Tech/Development 2021. 3. 1. 10:39

    Golang #2 - Method vs Function

    interface는 간단히 말해서 Golang의 Type으로 객체의 Method를 따로 정의해둔 모음집이라 할 수 있습니다. interface에 대해서 설명하기 전에 우선 알아야하는 것이, Method와 Function의 개념입니다. 일단 차이를 알아보도록 합시다.

    Method vs Function

    interface 개념을 설명하기 전에 앞서, Method와 Function의 차이점을 먼저 소개해야겠다 싶었습니다. 두 개 모두 우리가 흔히 아는 함수로 불리우고 사용되지만, 구현 방식이나 사용 방법에 있어서 조금 다릅니다. Method의 경우 Object의 Behavior을 정의한 것이고, 함수는 무언가에 종속되지 않은 단순히 Behavior 자체만을 구현한 것이라 생각하면 될 것 같습니다.

     

    구현 방식에도 차이가 있는데, Function과 다르게 Method는 함수 옆에 Method Receiver을 장착해 만듭니다. 하단의 예시를 보면 func (d Duck) 부분이 Method Receiver로 구조체를 연결한 모습입니다. 이를 통해 구조체와 구조체 내에 있는 필드 데이터를 처리할 수 있는 함수를 연결하여 Method를 만든 것이죠.

    type Duck struct {
    }
    
    // Methond
    func (d Duck) QuackMethod() {
    	fmt.Printf("Quack")
    }
    
    // Function
    func QuackFunction() {
    	fmt.Printf("Quack")
    }
    
    func main() {
      var d Duck
    
      d.QuackMethod()   // Method
      QuackFunction()   // Function
    }

    위의 코드를 보면, Duck이라는 구조체에 QuackMethond라는 Method가 연결된 것을 볼 수 있습니다. 그래서 QuackMethod를 호출하기 위해서는 d.QuackMethod처럼 체이닝하여 불러야합니다. 그에 반해 QuackFunction은 Duck 구조체에 종속되어 있지 않기에 단순히 함수 자체만을 호출하면 됩니다. Method를 통해서 Duck 구조체 안에 있는 필드 데이터 값을 가져와 사용할 수도 있기에 상황에 따라서 적절히 사용하면 좋을 것 같습니다.

     

    개인적으로 Method와 Function을 이야기할 때 체이닝에 대해서 이야기를 안할 수가 없는 것 같습니다. Function의 동작 방식에 비해 훨씬 코드를 깔끔하게 유지시킬 수 있기 때문입니다. 하단에 Person의 이름과 나이를 세팅하는 코드가 있는데, 체이닝 구조를 통해 보다 깔끔하게 만들 수 있습니다. 그에 반해 Function에서는 SetAge(SetName(p, "Yunseong"), 27)처럼 한 눈에도 보기 어렵게 작성할 수밖에 없습니다. 물론, 얼마안되는 코드일때야 그닥 상관없을 수도 있겠지만, 실제 개발환경 속에서는 눈여겨봐야할 부분인 것 같습니다.

    type Person struct {
      name string
      age  int 	
    }
    
    func (p *Person) SetName(name string) *Person {
      p.name = name
      return p
    }
    
    func (p *Person) SetAge(age int) *Person {
      p.age = age
      return p
    }
    
    func main() {
    
      var p Person
    
      p.SetName("Yunseong").SetAge(27)
    
      fmt.Println(p)
    
    }

    사실 어떤 방식이든 자신의 스타일이나 개발하고자 하는 프로그램의 성격에 따라 어떤 것을 쓸 지는 자유입니다. 하지만 단순히 누군가의 말만으로 어떻게 좋다더라 하며 사용하는 것이 아니라, 그 방법의 차이점은 명확히 이해하고 있어야 하며 나의 코드들을 최적화하기 위해서는 어떤 방법이 더 적합할지 생각을 해봐야할 것 같습니다.

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

    Linux Programming - File Descriptor(1)  (0) 2021.05.21
    Golang #3 - Interface  (0) 2021.03.01
    Golang #1 - Map  (0) 2021.02.14
    Golang Reserved Words  (0) 2021.02.11
    Headless Browser, Puppeteer  (0) 2020.07.22

    댓글 0

Designed by Tistory.