구조체
golang은 struct를 지원하지만, 메소드는 객체 밖에서 선언하여 사용할 수 있다.
이름과 성별, 그리고 성적을 저장하는 struct를 예제로 확인해보자
package main
import "fmt"
type student struct {
name string
gender string
score map[string]int
}
func createStudent(name string, gender string) student{
s := student{name: name, gender: gender}
s.score = map[string]int{}
return s
}
func main() {
var numStu, numScore, valueScore int
var name, gender, nameScore string
fmt.Scanln(&numStu, &numScore)
var myStudents []student
for i := 0; i < numStu; i++ {
fmt.Scanln(&name, &gender)
aStudent := createStudent(name, gender)
for j := 0; j < numScore; j++ {
fmt.Scanln(&nameScore, &valueScore)
aStudent.score[nameScore] = valueScore
}
myStudents = append(myStudents, aStudent)
}
for _, s:= range(myStudents) {
fmt.Println("----------")
fmt.Printf("%s %s\n",s.name, s.gender)
for index, val := range s.score {
fmt.Println(index, val)
}
}
fmt.Println("----------")
}
위 student 구조체에서 score 자료형은 map[string]int이다.
map은 사용시 초기화가 필요한데, 생성자 메소드를 활용하여 불편함을 해소할 수 있다.
map 은 reference type이므로 초기화를 하지 않으면 nil pointer가 되는데, 초기화 방법으로는 아래 두가지가 있다.
- make()
var tmp = make(map[string]int)
- literal{}
var tmp = map[string]int{}
위 구조체와 메소드를 활용하여 student array를 생성하고, 입력받는 각 student를 생성자를 통해 생성한 다음 array에 append하는 방식으로 구현한 예제다.
메소드
메소드는 에너지의 크기를 구하는 예제를 통해 알아본다.
package main
import "fmt"
const G float32 = 9.8
type thing struct {
m, v, h, ke, pe, me float32
}
func(t thing) getKE() float32 {
return 0.5 * t.m * t.v * t.v
}
func(t thing) getPE() float32 {
return t.m * t.h * G
}
func main() {
var numThing int
var tm, tv, th float32
fmt.Scanln(&numThing)
var things []thing
for i := 0; i < numThing; i++{
tmp := thing{}
fmt.Scanln(&tmp.m, &tmp.v, &tmp.h)
things = append(things, tmp)
tm = tmp.getKE()
tv = tmp.getPE()
th = tm + tv
fmt.Println(tm, tv, th)
}
위와 예제에서 getKE(), getPE()와 같이 일반적인 func NAME(param...)(return...) {} 형식이 아닌 func(STRUCT) methodName (return)의 형식으로 정의하며 호출 역시 struct.methodName(tmp.getKE())와 같이 호출됨을 확인한다.
참고 : 한 눈에 끝내는 고랭 기초 (goorm 강의)
반응형
'golang' 카테고리의 다른 글
golang gin API + swagger 적용하기 (0) | 2022.11.15 |
---|---|
Go gin middleware 적용하기 (0) | 2022.11.14 |
API server를 위한 go Gin 설치하고 사용하기 (예제) (0) | 2022.04.14 |
[golang] go routine과 chan 이용한 메세지 입력 (0) | 2022.03.15 |
[golang] defer, panic, recover (0) | 2022.02.28 |