728x90
오늘 포스팅할 주제는 Go의 특징 중
구조체( struct )
메소드( method )
타입( type )
에 대해 알아보겠습니다.
구조체 ( struct )란?
Go는 Go만의 방식으로 OOP를 지원합니다.
사용하는 방법으로는 구조체와 메소드가 있습니다.
4가지 방식으로 구조체의 인스턴스를 생성할 수 있습니다.
예시코드
package main
import "fmt"
// 구조체( struct ) 정의
type Person struct {
name string
age int
}
// 생성자 정의
func NewPerson(name string, age int) *Person {
return &Person{name, age}
}
func main() {
// 인스턴스 생성
var person1 = Person{}
person1.name = "juwon1"
person1.age = 1
person2 := Person{"juwon2", 2}
var person3 = new(Person)
person3.name = "juwon3"
person3.age = 3
var person4 = NewPerson("juwon4", 4)
fmt.Println(person1.name, person1.age)
fmt.Println(person2.name, person2.age)
fmt.Println(person3.name, person3.age)
fmt.Println(person4.name, person4.age)
}
다음은 메소드( method ) 입니다.
메소드의 특징으로
Receiver를 통한 해당 구조체의 메소드인지 명시가 가능합니다.
Value Receiver와 Pointer 리시버(*)가 있습니다.
리시버의 정의는 함수명 앞에 중괄호( )로 struct 혹은 type을 기재하면 됩니다.
예시 코드
package main
import "fmt"
type person struct {
name string
age int
}
func NewPerson(name string, age int) *person {
person := person{name: name, age: age}
return &person
}
// 리시버 정의 (리시버 변수명 구조체명) 함수명(){...}
func (p person) introduce() string {
return fmt.Sprint("name : ", p.name, " Age : ", p.getAge())
}
// Pointer Receiver
func (p *person) setName(name string) {
p.name = name
}
// Value Receiver
func (p person) setAge(age int) {
p.age = age
}
func (p person) getAge() int {
return p.age
}
func main() {
person1 := NewPerson("juwon1", 1)
fmt.Println(person1.introduce())
var person2 = person{}
person2.setAge(2)
person2.setName("juwon2")
fmt.Println(person2)
person3 := person{name: "juwon3", age: 3}
// Value Receiver는 값만 바꾸기 때문에 person3의 메모리 값에 참조할 수 없습니다.
// 따라서 값이 바뀌지 않습니다.
person3.setAge(4)
fmt.Println(person3)
}
Go는 struct 내에서 method를 포함할 수 없습니다.
struct 바깥에서 만들어지며, receiver를 이용해 어느 구조체의 메소드인지 정의할 수 있습니다.
또한 Go의 new() 내장 함수를 이용하는 방법이 있습니다.
func new(Type) *Type
new 함수를 호출하고 나면, 메모리를 할당하고 포인터를 반환합니다.
필드의 값들은 기본 값으로 초기화됩니다.
Golang은 생성자가 없지만 팩토리 패턴( factory pattern )을 이용해서 구현할 수 있습니다.
new 함수는 팩토리 패턴을 이용하고 있습니다.
이번 포스팅으로 struct와 method에 대해 알아보았습니다.
728x90
'Backend > GoLang' 카테고리의 다른 글
[Golang] Channel 과 비동기 메커니즘의 GoRoutine을 알아보자! (0) | 2022.02.05 |
---|---|
GoLang만의 문법, 변수 표현식( Variable Expression)을 알아보자! (0) | 2022.01.31 |
WSL( Ubuntu 20.04 )에 Go 설치하기 (0) | 2022.01.29 |
Google Go 언어에 대해 알아보자! ( GoLang ) (0) | 2022.01.28 |