Menu
Coddy logo textTech

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()는 모든 필드가 제로 값(zero values)으로 설정된 구조체에 대한 포인터를 생성합니다.

type Person struct {
    Name string
    Age  int
}

p := new(Person)
fmt.Println(p.Name)  // "" (빈 문자열)
fmt.Println(p.Age)   // 0

언제 new()를 사용하고 언제 주소 연산자 &를 사용해야 할지 궁금할 수 있습니다. 아래의 두 방식은 동일합니다:

// new() 사용
p1 := new(Person)

// 리터럴과 함께 주소 연산자 사용
p2 := &Person{}

&Person{} 구문은 필드를 동시에 초기화할 수 있기 때문에 실제 관행에서 더 흔히 사용됩니다. 명시적인 메모리 할당 의미론을 선호하고 특히 제로 값(zero-valued) 인스턴스를 원할 때는 new()를 사용하세요.

challenge icon

챌린지

쉬움

new()가 메모리를 할당하고 구조체를 제로 값(zero values)으로 초기화하는 방법을 보여주는 설정 관리자(configuration manager)를 만들어 보겠습니다. 이 방식이 구조체 리터럴과 주소 연산자를 사용하는 방식과 어떻게 다른지 확인하게 될 것입니다.

코드는 두 개의 파일로 구성됩니다:

  • config.go: Host (string), Port (int), MaxConnections (int), DebugMode (bool) 필드를 가진 ServerConfig 구조체를 정의합니다. 다음 두 함수를 작성하세요:
    • NewServerConfig: new()를 사용하여 ServerConfig를 할당하고 포인터를 직접 반환합니다 (모든 필드는 제로 값으로 초기화됨).
    • ConfigureServer: *ServerConfig 포인터와 host 문자열, port 정수를 인자로 받아, 포인터를 통해 해당 필드들을 설정합니다.
    또한 모든 설정 값을 보여주는 포맷팅된 문자열을 반환하는 Display 메서드를 *ServerConfig에 추가하세요.
  • main.go: 입력으로부터 host와 port를 읽습니다. 먼저 NewServerConfig()를 사용하여 설정을 생성하고 이를 출력하여 제로 값을 확인합니다. 그런 다음 ConfigureServer를 사용하여 host와 port를 설정하고, 다시 설정을 출력하여 업데이트된 값을 확인합니다.

다음 입력이 제공됩니다:

  • Line 1: 호스트 이름 (string)
  • Line 2: 포트 번호 (integer)

Display 메서드는 반드시 다음 형식의 문자열을 반환해야 합니다:

Host: [Host]
Port: [Port]
MaxConnections: [MaxConnections]
DebugMode: [DebugMode]

출력 결과는 두 번 출력해야 합니다. 한 번은 설정 전(제로 값 표시), 다른 한 번은 설정 후(업데이트된 host와 port 표시)입니다.

예를 들어, localhost8080이 주어지면 출력은 다음과 같아야 합니다:

Host: 
Port: 0
MaxConnections: 0
DebugMode: false
Host: localhost
Port: 8080
MaxConnections: 0
DebugMode: false

new()가 모든 것을 제로 값으로 초기화하기 때문에 첫 번째 출력에서 모든 제로 값(빈 문자열, 0, 0, false)이 어떻게 표시되는지 확인하세요. ConfigureServer를 호출한 후에는 host와 port만 변경되고 나머지 필드는 제로 값으로 유지됩니다.

치트 시트

new() 함수는 타입에 대한 메모리를 할당하고 해당 타입의 제로 값(zero value)으로 초기화된 포인터를 반환합니다:

p := new(int)      // int를 위한 메모리를 할당합니다
fmt.Println(*p)    // 0 (제로 값)
fmt.Println(p)     // 0xc000018030 (메모리 주소)

구조체의 경우, new()는 모든 필드가 제로 값으로 설정된 구조체에 대한 포인터를 생성합니다:

type Person struct {
    Name string
    Age  int
}

p := new(Person)
fmt.Println(p.Name)  // "" (빈 문자열)
fmt.Println(p.Age)   // 0

new()를 사용하는 것과 주소 연산자 &를 사용하는 것 - 둘은 동일합니다:

// new() 사용
p1 := new(Person)

// 리터럴과 함께 주소 연산자 사용
p2 := &Person{}

&Person{} 구문은 생성 시점에 필드 초기화가 가능하기 때문에 더 일반적으로 사용됩니다. 명시적인 메모리 할당 의미를 가진 제로 값 인스턴스를 원할 때 new()를 사용하세요.

직접 해보기

package main

import (
	"fmt"
)

func main() {
	// 입력 읽기
	var host string
	var port int
	fmt.Scanln(&host)
	fmt.Scanln(&port)

	// TODO: NewServerConfig()를 사용하여 설정을 생성하고 표시하기
	// 이렇게 하면 제로 값(zero values)이 표시됩니다

	// TODO: ConfigureServer를 사용하여 host와 port 설정하기

	// TODO: 업데이트된 값을 확인하기 위해 설정을 다시 표시하기
}
quiz icon실력 점검

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

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