Go만의 Struct와 Method

구조체와 메소드 사용법

Go의 구조체, 메소드, 타입에 대해 알아보겠습니다.

구조체 ( 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)
}

01

메소드( method )

메소드의 특징으로는

Receiver를 통한 해당 구조체의 메소드인지 명시가 가능합니다.

Value Receiver와 Pointer Receiver(*)가 있습니다.

리시버의 정의는 함수명 앞에 중괄호( )로 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)
}

02


Go는 struct 내에서 method를 포함할 수 없습니다.

struct 바깥에서 만들어지며, receiver를 이용해 어느 구조체의 메소드인지 정의할 수 있습니다.

03

또한 Go의 new() 내장 함수를 이용하는 방법이 있습니다.

func new(Type) *Type

new 함수를 호출하고 나면, 메모리를 할당하고 포인터를 반환합니다.

필드의 값들은 기본 값으로 초기화됩니다.

Golang은 생성자가 없지만 팩토리 패턴( factory pattern )을 이용해서 구현할 수 있습니다.

new 함수는 팩토리 패턴을 이용하고 있습니다.

팩토리 패턴이란 인스턴스를 공장처럼 찍어내는 것이 아닌, 사용하고 저장하고 필요할때 해당 주소값에서 꺼내어 사용하는 방법입니다.

Copyright © Juwon. Built with Gatsby