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만 변경되고 나머지 필드는 제로 값으로 유지됩니다.

직접 해보기

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실력 점검

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

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