생성자 함수
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)를 반환합니다. 이는 구조체 복사를 방지하고 포인터 리시버가 있는 메서드가 직접 작동할 수 있게 해줍니다. 유효성 검사 및 기본값은 생성자 내부에 작성합니다.
챌린지
중급유효성 검사 기능이 포함된 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)
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
8에러 처리와 OOP
error 인터페이스사용자 정의 에러 타입에러 래핑 (fmt.Errorf)센티넬 에러errors.Is()와 errors.As()Panic, Defer, Recover요약 - 파일 파서