일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- tucker의 go 언어 프로그래밍
- Pinpoint
- kotlin
- go
- CKA 기출문제
- 정보처리기사 실기 기출문제
- 기록으로 실력을 쌓자
- 오블완
- 공부
- Java
- AI
- Spring
- mysql 튜닝
- Kubernetes
- Elasticsearch
- 티스토리챌린지
- PETERICA
- kotlin querydsl
- CKA
- kotlin coroutine
- docker
- APM
- Linux
- AWS EKS
- golang
- 코틀린 코루틴의 정석
- minikube
- CloudWatch
- aws
- 정보처리기사실기 기출문제
- Today
- Total
피터의 개발이야기
[GO] Go에서 함수와 메서드, 그리고 포인터 메서드와 값 타입 메서드 차이 본문

ㅁ 들어가며
ㅇ 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가 증가함
}
메서드 사용 시 주의사항
- Go에서는 포인터 리시버를 가진 메서드를 호출할 때, 값이나 포인터 모두 사용할 수 있다.
- 반면, 함수가 값 매개변수를 받을 때는 해당 타입의 값만 전달할 수 있다.
ㅁ 마무리
Java 개발자인 나에게 함수와 메서드, 그리고 포인터 메서드와 값 타입 메서드의 차이를 이해하는 것은 Go 프로그래밍에서 중요하였다. Go 언어에서는 클래스와 상속을 지원하지 않고 메서드와 인터페이스만을 지원한다. 그래서 일부는 Go 언어는 OOP언어가 아니라고 말한다. 상황에 따라 적절한 방식을 선택하여 사용하면 더 효율적이고 명확한 코드를 작성할 수 있을 것이다.
ㅁ 함께 보면 좋은 사이트
ㅇ https://rainbow96bear.tistory.com/entry/Go-메서드-사용법-함수와-메서드의-차이
[Go] 메서드 사용법 (함수와 메서드의 차이)
지금까지 언어를 배우면서 메서드와 함수를 거의 혼용하여 사용하고 있었습니다. Go를 배우며 함수와 메서드의 차이에 대하여 확실하게 잡게 되어 다행이라고 생각합니다. Go에서는 메서드를 어
rainbow96bear.tistory.com
'Programming > GO' 카테고리의 다른 글
[GO] Tucker의 GO 언어 프로그래밍 - 2장 변수 (0) | 2025.03.08 |
---|---|
[GO] Tucker의 GO 언어 프로그래밍 - 1장 역사와 특징 (0) | 2025.03.07 |
[GO] Go의 fsnotify 라이브러리를 활용한 파일 시스템 감시 (0) | 2025.02.20 |
[GO] Go 언어에서 sync.Map 사용하기 (0) | 2025.02.18 |
[GO] Golang에서 Linux 명령어 실행 및 관리하기 (0) | 2025.02.17 |