Yeom's
Yeom's Coding Note
Yeom's
전체 방문자
오늘
어제
  • 분류 전체보기 (262)
    • 백준온라인 (94)
    • 운영체제 (14)
    • 프로그래머스 (0)
    • Go Language (40)
    • AWS (1)
    • 자료구조 (21)
    • Effective Java 3E (41)
    • JPA (1)
    • Tech Interview (33)
    • MySQL 8.0 (7)
    • CS 기술면접 (7)
    • Linux (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • https://mangkyu.tistory.com/92
  • https://mangkyu.tistory.com/89
  • maeil-mail
  • RealMySQL 8.0
  • java
  • m1 linux
  • 백준 설탕 배달
  • https://mangkyu.tistory.com/91
  • boj 2839
  • Real MySQL 8.0
  • https://mangkyu.tistory.com/90
  • https://mangkyu.tistory.com/94
  • 출처 : 망나니 개발자
  • 망나니 개발자
  • 교보dts
  • https://mangkyu.tistory.com/93
  • 망나니개발자
  • https://mangkyu.tistory.com/88
  • UTM

최근 글

티스토리

hELLO · Designed By 정상우.
Yeom's

Yeom's Coding Note

Go Language

[Go] #16 메소드

2023. 1. 14. 16:26
728x90
반응형

삼각형의 넓이를 계산하는 프로그램을 만든다고 생각해보자(이 기능만을 위한 프로그램을 만드는 것은 비효율적이지만). 지금까지 배운 '함수'와 '구조체'를 활용해보겠다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package main
 
import "fmt"
 
type triangle struct {
    width, height float32
}
 
func triArea(s *triangle) float32 { //'new'로 생성한 구조체 객체는 포인터값 반환
    return s.width * s.height / 2 //포인터 구조체는 자동 역참조 "*" 생략
}
 
func main() {
    tri1 := new(triangle)
    tri1.width = 12.5
    tri1.height = 5.2
 
    triarea := triArea(tri1)
    fmt.Printf("삼각형 너비:%.2f, 높이:%.2f 일때, 넓이:%.2f ", tri1.width, tri1.height, triarea)
}
Colored by Color Scripter
cs

triangle 은 삼각형의 너비와 높이 값을 필드로 갖는 구조체이다. 그리고 triArea 는 삼각형 높이와 너비의 정보가 잇는 구조체 객체를 매개변수로 전달받아 삼각형의 넓이를 계산하고 반환한다. 그냥 생각하면 굉장히 잘 정리된 코드같지만 객체 지향에 익숙한 개발자들은 무언가 어색할 것이다. 바로 함수의 역할 때문이다.

 

구조체는 함수와 마찬가지로 만드는 데 기준과 목적이 있다. 따라서 구조체도 변수가 많다는 이유로 단순히 값들을 묶지 않는다. 삼각형의 넓이를 구하기 위해 관련된 변수인 너비와 높이를 필드로 설정하고, 사람의 정보를 저장하기 위해 이름, 나이를 필드로 설정하는 것처럼 특정 속성들의 기능을 수행하기 위해 만들어진 특별한 함수를 '메소드'라고 한다. Java에서는 이들을 한 곳에 묶은 클래스 안에 필드와 메소드가 있다. 하지만 구조체 강의에서도 말했다시피 Go언어에서는 구조체 내에서 메소드를 선언하지 않고 일반 함수처럼 별도로 분리되어 선언된다.

 

쉽게 말하자면 메소드는 구조체의 필드들을 이용해 특정 기능을 하는 특별한 함수이다. 특별한 함수인 만큼 선언 방법도 특이하다.

  • 기본적으로 메소드는 "func (매개변수이름 구조체이름) 메소드이름() 반환형 {" 형식으로 선언한다. 매개변수 이름은 구조체 변수명으로서 메소드 내에서 매개변수처럼 사용된다.
  • '함수이름'을 입력하지 않고 구조체이름 뒤에 메소드 이름을 입력한다. 본문에서 메소드를 이요하기 위해 이름을 사용한다.

아래에 간단한 예시 코드를 확인해보자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package main
 
import "fmt"
 
type triangle struct {
    width, height float32
}
 
func (s triangle) triArea() float32 { //value receiver
    return s.width * s.height / 2
}
 
func main() {
    tri1 := new(triangle)
    tri1.width = 12.5
    tri1.height = 5.2
 
    triarea := tri1.triArea()
    fmt.Printf("삼각형 너비:%.2f, 높이:%.2f 일때, 넓이:%.2f ", tri1.width, tri1.height, triarea)
}
Colored by Color Scripter
cs

위 코드에서 (s triangle) 은 어떤 구조체를 전달 받는지 명시하는 'receiver'이다. 구조체 객체 자체를 전달받는 것이 아니라 구조체 객체 정보를 전달 받고 메소드의 기능을 수행하는 것이다. 함수를 사용해서 매개변수로서 객체를 활용하는 모습과는 조금 다르다. 이는 triarea := tri1.triArea() 를 보면 알 수 있다.

 

물론 메소드에서도 값을 복사해서 받는 것이 아닌 포인터 receiver도 있다.

 

Value Receiver와 Pointer Receiver

위 코드는 구조체의 '값' 정보를 전달(복사0 받아 연산한 후 반환한다. 하지만 포인터 정보를 전달한다면 구조체 필드 값을 메소드에서 직접 접근해 수정할 수 있다. 메소드를 호출할 때는 다른 점이 없지만 메소드의 receiver 부분에서 주솟값을 참조하는 연산자인 '*'를 구조체 이름 앞에 붙여주면 된다. 이를 비교하는 아래 코드를 확인해보자.

 

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
package main
 
import "fmt"
 
type triangle struct {
    width, height float32
}
 
func (s triangle) triAreaVal() float32 { //Value Receiver
    s.width += 10
    return s.width * s.height / 2
}
 
func (s *triangle) triAreaRef() float32 { //Pointer Reciver
    s.width += 10
    return s.width * s.height / 2
}
 
func main() {
    tri1 := new(triangle)
    tri1.width = 12.5
    tri1.height = 5.2
 
    triarea_val := tri1.triAreaVal()
    fmt.Printf("삼각형 너비:%.2f, 높이:%.2f 일때, 넓이:%.2f \n", tri1.width, tri1.height, triarea_val)
 
    triarea_ref := tri1.triAreaRef()
    fmt.Printf("삼각형 너비:%.2f, 높이:%.2f 일때, 넓이:%.2f ", tri1.width, tri1.height, triarea_ref)
}
Colored by Color Scripter
cs

Value receiver를 이용한 메소드는 전달받은 메소드 객체의 필드 값을 변경해도 메소드를 빠져나가면 값이 소멸되어 바뀌지 않는다. 하지만 Pointer receiver는 구조체 객체의 포인터를 전달받아 연산했기 때문에 객체의 실제 필드 값이 바뀐다.

728x90
반응형

'Go Language' 카테고리의 다른 글

[Go] #18-1 지연 처리 defer  (0) 2023.01.17
[Go] #17 인터페이스  (0) 2023.01.14
[Go] #15 구조체  (0) 2023.01.14
[Go] #14 클로저  (0) 2023.01.11
[Go] #13-5 함수  (0) 2023.01.08
    'Go Language' 카테고리의 다른 글
    • [Go] #18-1 지연 처리 defer
    • [Go] #17 인터페이스
    • [Go] #15 구조체
    • [Go] #14 클로저
    Yeom's
    Yeom's

    티스토리툴바