1. Struct (구조체)
- Go에서 struct는 Custom Data Type을 표현하는데 사용되는데, Go의 struct는 필드들의 집합체다.
- Go에서 struct는 필드 데이터만을 가지며, (행위를 표현하는) 메서드를 갖지 않는다.
- Go 언어는 객체지향 프로그래밍(Object Oriented Programming, OOP)을 고유의 방식으로 지원한다. 즉, Go에는 전통적인 OOP 언어가 가지는 클래스, 객체, 상속 개념이 없다. 전통적인 OOP의 클래스(class)는 Go 언어에서 Custom 타입을 정의하는 struct로 표현되는데, 전통적인 OOP의 클래스가 필드와 메서드를 함께 갖는 것(Java)과 달리 Go 언어의 struct는 필드만을 가지며, 메서드는 별도로 분리하여 정의한다.
- 나는 Typescript의 Type과 매우 유사하다고 느꼈다.
2. Struct 선언
- struct를 정의하기 위해서는 Custom Type을 정의하는데 사용하는 type 문을 사용한다.
package main
import "fmt"
// struct 정의
type person struct {
name string
age int
}
func main() {
// person 객체 생성
p := person{}
// 필드값 설정
p.name = "Lee"
p.age = 10
fmt.Println(p)
}
- 나는 주로 화면에서 서버로 DTO처럼 데이터를 받을 때 이용했다.
3. Struct 객체 생성
- struct 객체를 생성할 때, 초기값을 함께 할당할 수 있다.
- struct 객체를 생성할 때, Go 내장함수 new()를 쓸 수 있다.
var p1 person
p1 = person{"Bob", 20}
p2 := person{name: "Sean", age: 50}
p := new(person)
p.name = "Lee"
- Go에서 struct는 기본적으로 mutable 개체로서 필드값이 변화할 경우 (별도로 새 개체를 만들지 않고) 해당 개체 메모리에서 직접 변경된다. 하지만, struct 개체를 다른 함수의 파라미터로 넘긴다면, Pass by Value에 따라 객체를 복사해서 전달하게 된다. 그래서 만약 Pass by Reference로 struct를 전달하고자 한다면, struct의 포인터를 전달해야 한다.
- Go를 하면서 Pointer가 자주 등장하는데(C의 영향) 따로 공부해서 정리를 해야겠다.
4. 생성자(constructor) 함수
- 필드가 사용 전에 초기화되어야 하는 경우 생성자 함수를 통해 초기화 한다.
package main
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"
}
'개발 > Go' 카테고리의 다른 글
[Go] 기초 - 인터페이스 (0) | 2022.07.30 |
---|---|
[Go] 기초 - 메소드 (1) | 2022.07.27 |
[Go] 기초 - 패키지 (0) | 2022.07.25 |
[Go] 기초 - 컬렉션 (Map) (0) | 2022.07.22 |
[Go] 기초 - 컬렉션 (Slice) (0) | 2022.07.21 |