본문 바로가기

golang

[golang] 구조체 , 메소드 예제 (map 초기화)

구조체

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 강의)

반응형