본문 바로가기
C#

new() 의 완벽한 이해

by Oz Driver 2025. 5. 20.

 

C# 에서 new() 를 사용하는 이유는 단순해 보입니다.

어떤 객체든 new 를 붙이면 메모리에 생겨나고, 바로 사용할 수 있게 됩니다.

하지만 이 new() 라는 한 줄의 코드 속엔 두 가지 서로 다른 동작이 숨어 있습니다.

첫째는 메모리 공간 확보, 둘째는 초기화(생성자 호출) 입니다.
이 둘은 항상 함께 다니기에 한 덩어리처럼 보이지만, 의미적으로는 전혀 다른 역할을 하고 있습니다.

 

new 는 공간만 만든다

new 는 단지 메모리를 확보하는 명령어입니다.

구조체라면 메모리가 스택에 할당되고, 클래스라면 메모리가 힙에 할당됩니다.

즉, new 자체는 그저 “쓸 공간을 마련하라”는 의미일 뿐, 그 공간을 어떤 값으로 채우는지는 new 의 역할이 아닙니다.

 

초기화는 괄호 () 가 한다

우리가 함수를 호출할 때 이름 뒤에 괄호를 붙이는 것처럼 new 뒤에 붙은 () 는 생성자 함수를 호출하는 기능을 합니다. 그리고 생성자는 내부적으로 모든 field 값을 기본값으로 초기화합니다.

여기서 기본값이란 숫자는 0, bool type 은 false, 그리고 참조형일 경우는 null 로 채워집니다.

C# 에서는 초기화 되지 않은 변수를 사용하면 컴파일 에러가 납니다. 

따라서 구조체도 new () 로 초기화하는 것이 어찌보면 더 안전합니다. 

struct MyStruct
{
    public int number;
    public string text;
}

MyStruct a;

// 오류: 사용 전 초기화되지 않음
Console.WriteLine(a.number); 

// 생성자 호출로 모든 필드 자동 초기화
MyStruct b = new MyStruct(); 
Console.WriteLine(b.number); // 0
Console.WriteLine(b.text);   // null

 

구조체와 클래스 : 메모리 영역은 다르지만 논리는 동일

• new MyStruct() : 스택에 공간 확보 + 생성자 호출로 초기화

• new MyClass() : 힙에 공간 확보 + 생성자 호출로 초기화


new 는 공간을 만들고, 괄호 () 는 생성자를 호출해 초기화합니다.

위에서 언급한 것처럼, C# 은 초기화되지 않은 변수의 사용을 금지하기 때문에, new() 로 생성하면 그 즉시 사용할 수 있는 “초기화된 상태” 가 됩니다.

 

마무리

new () 는 메모리 확보와 생성자 호출(초기화) 을 동시에 수행합니다. 
그리고 구조체든 클래스든, 기본 생성자는 모든 필드를 0, false, null 로 자동 초기화합니다.

• 클래스는 반드시 new() 로 인스턴스를 생성해야 사용할 수 있습니다.

구조체는 new 없이도 선언 가능하지만, 이 때는 모든 필드를 직접 초기화해야 사용이 가능합니다.