new() 함수
Coddy GO 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 107개 중 22번째.
Go는 형식을 위한 메모리를 할당하고 해당 메모리에 대한 포인터를 반환하는 new()라는 내장 함수를 제공합니다. 할당된 메모리는 해당 형식의 zero value로 초기화됩니다.
p := new(int) // int를 위한 메모리를 할당합니다
fmt.Println(*p) // 0 (제로 값)
fmt.Println(p) // 0xc000018030 (메모리 주소)new() 함수는 타입을 인수로 받아 해당 타입의 새로 할당된 zero value를 가리키는 포인터를 반환합니다. 이는 포인터가 필요하지만 참조할 기존 변수가 없을 때 특히 유용합니다.
구조체에서 new()는 모든 fields가 해당 zero values로 설정된 구조체를 가리키는 pointer를 생성합니다.
type Person struct {
Name string
Age int
}
p := new(Person)
fmt.Println(p.Name) // "" (빈 문자열)
fmt.Println(p.Age) // 0new()을 언제 주소 연산자 &와 비교해 사용해야 하는지 궁금할 수 있습니다. 아래의 두 접근 방식은 서로 동등합니다.
// new() 사용
p1 := new(Person)
// 리터럴과 함께 주소 연산자 사용
p2 := &Person{}&Person{} 구문은 필드를 동시에 초기화할 수 있기 때문에 실제로 더 일반적으로 사용됩니다. 0값 인스턴스를 명시적으로 원하고 명시적인 메모리 할당 의미를 선호할 때는 new()를 사용하세요.
챌린지
쉬움new()가 메모리를 할당하고 구조체를 zero value로 초기화하는 방식을 보여 주는 configuration manager를 만들어 보겠습니다. 이 방식이 구조체 리터럴과 address operator를 사용하는 방식과 어떻게 다른지도 확인할 수 있습니다.
코드를 두 개의 파일로 구성합니다:
config.go:Host(문자열),Port(정수),MaxConnections(정수),DebugMode(불리언) fields를 포함하는ServerConfig구조체를 정의합니다. 두 함수를 만듭니다:NewServerConfig:new()를 사용하여ServerConfig를 할당하고 pointer를 직접 반환합니다(모든 값이 zero value임).ConfigureServer:*ServerConfigpointer와 host 문자열 및 port 정수를 인수로 받아, pointer를 통해 config의 해당 fields를 설정합니다.
*ServerConfig에 모든 configuration 값을 보여 주는 formatted string을 반환하는Displaymethod를 추가합니다.main.go: input에서 host와 port를 읽습니다. 먼저NewServerConfig()를 사용하여 config를 만들고, zero values를 보여 주도록 표시합니다. 그런 다음ConfigureServer를 사용하여 host와 port를 설정하고, 업데이트된 값을 보여 주도록 config를 다시 표시합니다.
다음 input이 제공됩니다:
- Line 1: Host 이름(문자열)
- Line 2: Port 번호(정수)
Display method는 다음의 정확한 형식으로 string을 반환해야 합니다:
Host: [Host]
Port: [Port]
MaxConnections: [MaxConnections]
DebugMode: [DebugMode]표시 결과를 두 번 출력합니다. 한 번은 configuration 전( zero values를 표시)이고, 한 번은 configuration 후(업데이트된 host와 port를 표시)입니다.
예를 들어 localhost와 8080이 주어지면 출력은 다음과 같아야 합니다:
Host:
Port: 0
MaxConnections: 0
DebugMode: false
Host: localhost
Port: 8080
MaxConnections: 0
DebugMode: false첫 번째 표시에서 모든 zero values(빈 문자열, 0, 0, false)가 나타나는 이유는 new()가 모든 항목을 zero values로 초기화하기 때문입니다. ConfigureServer를 호출한 후에는 host와 port만 변경되고 나머지 fields는 zero values로 유지됩니다.
직접 해보기
package main
import (
"fmt"
)
func main() {
// 입력 읽기
var host string
var port int
fmt.Scanln(&host)
fmt.Scanln(&port)
// TODO: NewServerConfig()를 사용하여 config를 생성하고 표시하세요
// 이것은 제로 값을 보여줍니다
// TODO: ConfigureServer를 사용하여 host와 port를 설정하세요
// TODO: 업데이트된 값을 보여주기 위해 config를 다시 표시하세요
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
8에러 처리와 OOP
error 인터페이스사용자 정의 에러 타입에러 래핑 (fmt.Errorf)센티넬 에러errors.Is()와 errors.As()Panic, Defer, Recover요약 - 파일 파서직접 연습해 보세요: 온라인 Go 컴파일러