GO 구조체(struct)
Go 언어에서 구조체(struct)는 여러 필드를 그룹화하여 복합 데이터를 정의하는 사용자 정의 타입입니다. 구조체는 객체지향 프로그래밍의 클래스와 유사한 개념으로, 관련된 데이터와 메서드를 하나의 단위로 묶어 관리할 수 있습니다.
구조체 정의
구조체를 정의할 때는 struct 키워드를 사용합니다. 구조체는 하나 이상의 필드로 구성되며, 각 필드는 이름과 타입을 가집니다.
type Person struct {
Name string
Age int
}
위 예제에서는 Person이라는 구조체 타입을 정의하였으며, Name과 Age라는 두 개의 필드를 가지고 있습니다.
구조체 초기화
구조체를 초기화하고 사용하는 방법에는 여러 가지가 있습니다.
1. 필드 이름을 명시하여 초기화
p := Person{
Name: "Alice",
Age: 30,
}
2. 필드 순서에 따라 초기화
p := Person{"Alice", 30}
3. 개별 필드에 값을 할당
var p Person
p.Name = "Alice"
p.Age = 30
구조체 필드 접근
구조체 필드에 접근할 때는 점(.) 연산자를 사용합니다.
fmt.Println(p.Name) // 출력: Alice
fmt.Println(p.Age) // 출력: 30
구조체 메서드
구조체는 메서드를 가질 수 있습니다. 메서드는 특정 타입(주로 구조체)에 대해 정의된 함수입니다.
func (p Person) Greet() string {
return "Hello, my name is " + p.Name
}
위 예제에서 Greet 메서드는 Person 타입의 값을 리시버로 받습니다. 이를 통해 Person 구조체와 관련된 동작을 정의할 수 있습니다.
메서드를 호출할 때는 구조체 인스턴스를 통해 호출합니다.
p := Person{"Alice", 30}
fmt.Println(p.Greet()) // 출력: Hello, my name is Alice
예제: 구조체 사용
다음은 구조체를 정의하고 사용하는 예제입니다.
package main
import "fmt"
// 구조체 정의
type Person struct {
Name string
Age int
}
// 구조체 메서드 정의
func (p Person) Greet() string {
return "Hello, my name is " + p.Name
}
func main() {
// 구조체 초기화
p := Person{
Name: "Alice",
Age: 30,
}
// 필드 접근
fmt.Println("Name:", p.Name) // 출력: Name: Alice
fmt.Println("Age:", p.Age) // 출력: Age: 30
// 메서드 호출
fmt.Println(p.Greet()) // 출력: Hello, my name is Alice
}
포인터 리시버
구조체 메서드를 정의할 때 값 리시버 대신 포인터 리시버를 사용할 수 있습니다. 포인터 리시버를 사용하면 메서드 내에서 구조체 필드를 수정할 수 있습니다.
func (p *Person) UpdateName(newName string) {
p.Name = newName
}
func main() {
p := Person{"Alice", 30}
p.UpdateName("Bob")
fmt.Println(p.Name) // 출력: Bob
}
위 예제에서 UpdateName 메서드는 Person 구조체의 포인터를 리시버로 받아서 Name 필드를 수정합니다.
구조체의 임베딩
Go에서는 구조체 임베딩을 통해 다른 구조체의 필드를 포함하고 재사용할 수 있습니다. 이는 상속과 비슷한 개념입니다.
type Employee struct {
Person
Position string
}
func main() {
e := Employee{
Person: Person{Name: "Alice", Age: 30},
Position: "Developer",
}
fmt.Println(e.Name) // 출력: Alice
fmt.Println(e.Age) // 출력: 30
fmt.Println(e.Position) // 출력: Developer
}
위 예제에서 Employee 구조체는 Person 구조체를 임베딩하여 Name과 Age 필드를 상속받습니다. 이렇게 하면 구조체 간의 재사용성과 구성을 쉽게 할 수 있습니다.
이와 같이 Go 언어에서 구조체는 복잡한 데이터를 다루고, 관련 동작을 정의하며, 코드 재사용성을 높이는 데 중요한 역할을 합니다.
전체 예제
package main
import "fmt"
// 구조체 정의
type Person struct {
Name string
Age int
}
// 구조체 메서드 정의
func (p Person) Greet() string {
return "Hello, my name is " + p.Name
}
func (p *Person) UpdateName(newName string) {
p.Name = newName
}
type Employee struct {
Person
Position string
}
func main() {
// 구조체 초기화
p := Person{
Name: "Alice",
Age: 30,
}
// 필드 접근
fmt.Println("Name:", p.Name) // 출력: Name: Alice
fmt.Println("Age:", p.Age) // 출력: Age: 30
// 메서드 호출
fmt.Println(p.Greet()) // 출력: Hello, my name is Alice
p2 := Person{"Alice", 30}
p2.UpdateName("Bob")
fmt.Println(p2.Name) // 출력: Bob
e := Employee{
Person: Person{Name: "Alice", Age: 30},
Position: "Developer",
}
fmt.Println(e.Name) // 출력: Alice
fmt.Println(e.Age) // 출력: 30
fmt.Println(e.Position) // 출력: Developer
}
결과
Name: Alice
Age: 30
Hello, my name is Alice
Bob
Alice
30
Developer
출처 : chatGPT