Menu
Coddy logo textTech

생성자 함수

Coddy GO 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 107개 중 10번째.

Go는 다른 언어와 같은 생성자가 없습니다. 대신, 초기화된 구조체를 주로 포인터 형태로 반환하는 NewTypeName이라는 이름의 함수를 만드는 것이 관례입니다.

기본 생성자 함수

type Person struct {
    Name string
    Age  int
}

func NewPerson(name string, age int) *Person {
    return &Person{
        Name: name,
        Age:  age,
    }
}

기본값을 가진 생성자

type Config struct {
    Host    string
    Port    int
    Timeout int
}

func NewConfig(host string) *Config {
    return &Config{
        Host:    host,
        Port:    8080,    // 기본값
        Timeout: 30,      // 기본값
    }
}

유효성 검사를 포함한 생성자

func NewPerson(name string, age int) *Person {
    if name == "" {
        name = "Unknown"
    }
    if age < 0 {
        age = 0
    }
    return &Person{
        Name: name,
        Age:  age,
    }
}

생성자 함수 사용하기

func main() {
    p1 := NewPerson("Alice", 25)
    fmt.Println(p1.Name) // Alice

    p2 := NewPerson("", -5)
    fmt.Println(p2.Name) // Unknown
    fmt.Println(p2.Age)  // 0
}

생성자 함수는 &를 사용하여 포인터(*StructName)를 반환합니다. 이는 구조체 복사를 방지하고 포인터 리시버가 있는 메서드가 직접 작동할 수 있게 해줍니다. 유효성 검사 및 기본값은 생성자 내부에 작성합니다.

challenge icon

챌린지

중급

유효성 검사 기능이 포함된 BankAccount 구조체용 생성자 함수 NewBankAccount를 작성하세요:

  • name (string)과 balance (float64)를 매개변수로 받습니다
  • name이 비어 있으면 기본값을 "Unnamed"로 설정합니다
  • balance가 음수이면 기본값을 0으로 설정합니다
  • Owner를 항상 "Default Owner"로 설정합니다
  • 새 구조체에 대한 포인터를 반환합니다

치트 시트

Go는 생성자(constructor) 대신 생성자 함수(constructor functions)를 사용합니다. 관례적으로 이름을 NewTypeName으로 지정하고 초기화된 구조체에 대한 포인터를 반환합니다.

기본적인 생성자 함수:

type Person struct {
    Name string
    Age  int
}

func NewPerson(name string, age int) *Person {
    return &Person{
        Name: name,
        Age:  age,
    }
}

기본값이 포함된 생성자:

func NewConfig(host string) *Config {
    return &Config{
        Host:    host,
        Port:    8080,    // 기본값
        Timeout: 30,      // 기본값
    }
}

유효성 검사가 포함된 생성자:

func NewPerson(name string, age int) *Person {
    if name == "" {
        name = "Unknown"
    }
    if age < 0 {
        age = 0
    }
    return &Person{
        Name: name,
        Age:  age,
    }
}

생성자 함수는 구조체 복사를 방지하고 포인터 리시버 메서드가 직접 작동할 수 있도록 &를 사용하여 포인터(*StructName)를 반환합니다.

직접 해보기

package main

import "fmt"

func main() {
    var name string
    var balance float64
    fmt.Scan(&name, &balance)

    account := NewBankAccount(name, balance)

    fmt.Printf("Account: %s\n", account.Name)
    fmt.Printf("Balance: %.2f\n", account.Balance)
    fmt.Printf("Owner: %s\n", account.Owner)
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨