구조체
구조체(Structure)란 하나 이상의 변수를 묶어 새로운 자료형을 정의하는 데이터 타입이다.
예를들면 ‘집’ 에 대한 ‘주소’와 ‘전화번호’ 등이 있다. 매번 ‘주소’와 ‘전화번호’를 선언하기엔 번거로우므로 ‘집’이라는 구조체에 묶어 저장한다.
package main import "fmt" type home struct { address string // 주소 contect int // 전화번호 tv bool // tv 존재 여부 } func main() { var dale = home{} fmt.Println(dale) dale.address = "서울특별시" // 직접 값을 입력할 수 있음 dale.contect = 20 dale.tv = true fmt.Println(dale) hack := home{"부산광역시", 30, false} // 선언할 때 값을 입력할 수 있음. 변수를 지정 안하면 순차적으로 입력됨 fmt.Println(hack) fmt.Println(hack.contect) durumung := home{contect: 40} // 선언할 때 일부만 값을 입력하고 싶으면 변수를 지정하면 됨 fmt.Println(durumung) work := new(home) // new 로 객체 생성이 가능하며 new 를 사용할 경우 객체의 포인터를 리턴한다 fmt.Println(work) work.address = "개성공단" fmt.Println(work) }
┌──(daleji㉿HACK)-[~] └─$ go run structure.go { 0 false} {서울특별시 20 true} {부산광역시 30 false} 30 { 40 false} &{ 0 false} &{개성공단 0 false}
생성자
구조체(struct)의 필드가 사용 전에 초기화되어야 하는 경우가 있다고 한다. 처음 여기서 ‘초기화’ 라는 단어가 어려웠다. 결국 초기화란 다음과 같다.
초기화 != 0 (Zero Value)
초기화 == 초기값 지정 (단, 0이 될 수 있음)
생성자 함수는 struct를 리턴하는 함수로서 그 함수 본문에서 필요한 필드를 초기화한다.
package main import "fmt" type dict struct { data map[int]string } //생성자 함수 정의 func newDict() *dict { d := dict{} d.data = map[int]string{} return &d //포인터 전달 } func main() { dic := newDict() // 생성자 호출 dic.data[1] = "A" fmt.Println(dic) // newDict 함수는 포인터로 반환 fmt.Println(dic.data) // d.data 는 맵 선언 }
┌──(daleji㉿LAPTOP)-[~] └─$ go run constructor.go &{map[1:A]} map[1:A]
추가로 구조체 안에서 구조체를 사용할 수 있다.
package main import "fmt" type home struct { address string // 주소 contect int // 전화번호 tv bool // tv 존재 여부 person Human // Human 구조체 사용 } type Human struct { name string age int } func main() { var dale = home{} fmt.Println(dale) dale.address = "서울특별시" dale.person.name = "daleji" fmt.Println(dale) }
┌──(daleji㉿LAPTOP)-[~] └─$ go run struct.go { 0 false { 0}} {서울특별시 0 false {daleji 0}}