"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
👨💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.
Go 에서 메서드 란 무엇이며, 어떻게 활용할 수 있는지 간략히 알아보았습니다.
질문 >
Go 에서 메서드 란 무엇이며, 어떻게 활용할 수 있나요?
답변 >
Go에서 메서드란?
메서드는 Go에서 특정 데이터 타입(특히 구조체나 사용자 정의 타입)에 바인딩된 함수입니다. 메서드는 데이터 타입과 동작(기능)을 결합하여 데이터와 관련된 작업을 수행할 수 있습니다. 메서드는 함수와 비슷하지만, **리시버(receiver)**라는 특별한 매개변수를 통해 특정 타입과 연결됩니다.
메서드 선언
메서드는 func 키워드를 사용하여 정의되며, 리시버는 함수 선언의 첫 번째 매개변수처럼 괄호 안에 지정됩니다.
형식
func (리시버_변수 리시버_타입) 메서드명(매개변수) 반환타입 {
// 메서드 본문
return 값
}
- 리시버 변수: 메서드가 작동할 데이터 타입의 인스턴스를 나타냅니다.
- 리시버 타입: 메서드가 연결된 데이터 타입입니다.
메서드 사용 예제
1. 구조체와 메서드
구조체와 메서드를 사용하여 데이터와 기능을 결합합니다.
package main
import "fmt"
// 구조체 정의
type Rectangle struct {
Width, Height float64
}
// 메서드 정의
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
func (r Rectangle) Perimeter() float64 {
return 2 * (r.Width + r.Height)
}
func main() {
rect := Rectangle{Width: 5, Height: 3}
// 메서드 호출
fmt.Println("Area:", rect.Area()) // 출력: Area: 15
fmt.Println("Perimeter:", rect.Perimeter()) // 출력: Perimeter: 16
}
리시버 타입
리시버는 값 타입과 포인터 타입으로 선언할 수 있으며, 두 가지의 동작 방식이 다릅니다.
값 리시버
- 메서드 호출 시 구조체의 복사본을 전달받아 작업합니다.
- 원본 데이터는 변경되지 않습니다.
func (r Rectangle) ScaleByValue(factor float64) {
r.Width *= factor
r.Height *= factor
}
func main() {
rect := Rectangle{Width: 5, Height: 3}
rect.ScaleByValue(2)
fmt.Println("Rectangle:", rect) // 출력: Rectangle: {5 3}
}
포인터 리시버
- 메서드 호출 시 원본 데이터에 대한 참조를 전달받아 작업합니다.
- 원본 데이터를 수정할 수 있습니다.
func (r *Rectangle) ScaleByPointer(factor float64) {
r.Width *= factor
r.Height *= factor
}
func main() {
rect := Rectangle{Width: 5, Height: 3}
rect.ScaleByPointer(2)
fmt.Println("Rectangle:", rect) // 출력: Rectangle: {10 6}
}
고급 메서드 활용
1. 사용자 정의 타입에 메서드 추가
기본 데이터 타입에도 메서드를 추가하여 새로운 동작을 정의할 수 있습니다.
type MyInt int
func (m MyInt) IsEven() bool {
return m%2 == 0
}
func main() {
num := MyInt(4)
fmt.Println("Is Even:", num.IsEven()) // 출력: Is Even: true
}
2. 인터페이스와 메서드
메서드는 인터페이스를 구현하는 데 사용됩니다. 인터페이스는 특정 메서드 집합을 포함하는 타입입니다.
type Shape interface {
Area() float64
}
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return 3.14 * c.Radius * c.Radius
}
func main() {
var s Shape = Circle{Radius: 5}
fmt.Println("Circle Area:", s.Area()) // 출력: Circle Area: 78.5
}
3. 가독성과 캡슐화
메서드를 통해 데이터와 동작을 결합함으로써, 코드의 가독성을 높이고 캡슐화를 제공합니다.
type Counter struct {
value int
}
func (c *Counter) Increment() {
c.value++
}
func (c *Counter) Value() int {
return c.value
}
func main() {
counter := &Counter{}
counter.Increment()
fmt.Println("Counter Value:", counter.Value()) // 출력: Counter Value: 1
}
메서드의 주요 특징
- 리시버와 데이터 결합:
- 메서드는 특정 타입의 데이터를 처리하도록 설계되어 객체 지향 프로그래밍의 캡슐화 개념과 유사합니다.
- 리시버 타입:
- 값 타입과 포인터 타입 모두 사용 가능하며, 요구사항에 따라 원본 데이터 변경 여부를 선택할 수 있습니다.
- 인터페이스 지원:
- 메서드는 Go에서 인터페이스를 구현하는 기본 단위로, 다형성을 제공합니다.
- 모든 사용자 정의 타입에 사용 가능:
- 구조체뿐만 아니라, 슬라이스, 맵, 기본 데이터 타입 등 모든 사용자 정의 타입에 메서드를 정의할 수 있습니다.
결론
Go에서 메서드는 데이터와 동작을 결합하여 코드를 더 구조적이고 재사용 가능하게 만듭니다. 값 리시버와 포인터 리시버를 적절히 활용하여 데이터 수정 여부를 관리할 수 있으며, 인터페이스와 결합하여 다형성을 구현할 수 있습니다. 이를 통해 Go는 객체 지향 프로그래밍의 유용한 기능을 간결한 방식으로 제공합니다.
🎬 유튜브 채널 🎬
위로그@WiLog
📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리(Willee) 입니다. 📢 위로그@WiLog 는 자기계발을 목적으로 하는 채널 입니다. 📢 오늘도 즐겁게~ 자신을 위한 계발을 함께 해보아요~ d^_^b 📌
www.youtube.com
🎬 치지직 채널 🎬
위로그 채널 - CHZZK
지금, 스트리밍이 시작됩니다. 치지직-
chzzk.naver.com
'프로그래밍' 카테고리의 다른 글
👨💻 [Go] Go 에서 벤치마크 코드 란 무엇이며, 어떻게 활용할 수 있나요? (0) | 2025.01.09 |
---|---|
👨💻 [Go] Go 에서 테스트 코드 란 무엇이며, 어떻게 활용할 수 있나요? (0) | 2025.01.09 |
👨💻 [Go] Go 에서 함수란 무엇이며, 어떻게 활용할 수 있나요? (0) | 2025.01.09 |
👨💻 [Go] Go 에서 sync.Map 은 무엇이며, 어떻게 활용할 수 있나요? (0) | 2025.01.08 |
👨💻 [Flutter] Flutter 의 역사는 어떻게 되며, 전망은 어떤가요? (0) | 2025.01.08 |