Backend/GoLang

[Golang] Go만의 구조체(struct)와 메소드(method) 사용법

Juwon2106 2022. 2. 5. 21:20
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