관리 메뉴

피터의 개발이야기

[GO] Go에서 함수와 메서드, 그리고 포인터 메서드와 값 타입 메서드 차이 본문

Programming/GO

[GO] Go에서 함수와 메서드, 그리고 포인터 메서드와 값 타입 메서드 차이

기록하는 백앤드개발자 2025. 2. 21. 06:40
반응형

ㅁ 들어가며

Go 언어를 사용하다 보면 함수와 메서드, 그리고 포인터 메서드와 값 타입 메서드의 차이점을 이해하는 것이 중요하다. 메서드는 포인터 리시버를 가질 때 값이나 포인터 모두 받을 수 있지만, 함수는 값 인자를 받을 때 해당 타입의 값만 받을 수 있다. 이 글에서는 이들의 차이점과 사용 방법에 대해 정리하였다. Tucker의 Go언어 프로그래밍 책, 17장 1~3의 내용을 참조하였다.

 

함수 vs 메서드

함수 (Function)

  • 독립적으로 존재하며 특정 타입에 종속되지 않는다.
  • 예: print(), sum()

메서드 (Method)

  • 특정 타입에 종속되어 있다.
  • 객체의 동작(behavior)을 정의한다.
  • 문법: func (리시버) 메서드명(매개변수) 반환값 { ... }
type Person struct {
    Name string
    Age  int
}

// 메서드 표현
//     리시버     메서드명
func (p Person) SayHello() {
    fmt.Printf("Hello, I'm %s\n", p.Name)
}

// 함수 표현
func  SayHello(p *Person) {
    fmt.Printf("Hello, I'm %s\n", p.Name)
}

 

 

ㅁ 객체지향: 절차 중심에서 관계 중심으로 변화, Go는 OOP 언어인가? (책 17.2.1)

 메서드 등장 이전에는 절차 중심의 프로그래밍이어서, 코드 설계 시 기능 호출 순서가 중요하였다. 메서드 기능이 생기면서 데이터와 기능을 묶을 수 있게 되어, 데어터와 기능이 묶인 단일 객체로서 동작하게 되었다. 객체란 데이터와 기능을 갖는 타입을 말하고 이 타입의 인스턴스를 각체 인스턴스라고 말한다. 이러한 객체 인스턴스들의 유기적 관계를 통해 절차보다 객체 간 관계 중심의 프로그래밍을 구현할 수 있다. 더러 GO는 OOP 프로그램인 JAVA처럼 클래스와 상속을 지원하지 않아 객체지향 언어가 아니라고 이야기 하지만 메서드와 인터페이스를 통해 객체 간의 상호관계 중심으로 프로그래밍할 수 있기 때문에 Go는 객체 지향 언어라고 할 수 있다. 

 

ㅁ 포인터 메서드 vs 값 타입 메서드

값 타입 메서드

  • 리시버의 복사본을 사용한다.
  • 메서드 내에서 리시버의 값을 변경해도 원본에 영향을 주지 않는다.
  • 새로운 객체를 생성할 필요가 있을 때 사용한다.

포인터 메서드

  • 리시버의 포인터를 사용한다.
  • 메서드 내에서 리시버의 값을 변경하면 원본도 변경된다.
  • 새로운 객체를 생성할 필요가 없을 때 사용한다.
func (p Person) Birthday() {
    p.Age++  // 원본 Person 객체의 Age는 변경되지 않음
}

func (p *Person) BirthdayPointer() {
    p.Age++  // 원본 Person 객체의 Age가 증가함
}

 

메서드 사용 시 주의사항

  1. Go에서는 포인터 리시버를 가진 메서드를 호출할 때, 값이나 포인터 모두 사용할 수 있다.
  2. 반면, 함수가 값 매개변수를 받을 때는 해당 타입의 값만 전달할 수 있다.

 

ㅁ 마무리

  Java 개발자인 나에게 함수와 메서드, 그리고 포인터 메서드와 값 타입 메서드의 차이를 이해하는 것은 Go 프로그래밍에서 중요하였다. Go 언어에서는 클래스와 상속을 지원하지 않고 메서드와 인터페이스만을 지원한다. 그래서 일부는 Go 언어는 OOP언어가 아니라고 말한다.  상황에 따라 적절한 방식을 선택하여 사용하면 더 효율적이고 명확한 코드를 작성할 수 있을 것이다.

 

ㅁ 함께 보면 좋은 사이트

https://rainbow96bear.tistory.com/entry/Go-메서드-사용법-함수와-메서드의-차이

 

[Go] 메서드 사용법 (함수와 메서드의 차이)

지금까지 언어를 배우면서 메서드와 함수를 거의 혼용하여 사용하고 있었습니다. Go를 배우며 함수와 메서드의 차이에 대하여 확실하게 잡게 되어 다행이라고 생각합니다. Go에서는 메서드를 어

rainbow96bear.tistory.com

 

반응형
Comments