new 연산자 - new 연산자는 형식의 새 인스턴스를 만듭니다.

new 연산자는 새 유형의 인스턴스를 만듭니다. new 키워드를 멤버 선언 한정자 또는 제네릭 형식 제약 조건으로 사용할 수도 있습니다.

생성자 호출

새 인스턴스 유형을 만들려면 일반적으로 new 연산자를 사용하여 해당 유형의 생성자 중 하나를 호출합니다.

var dict = new Dictionary<string, int>();
dict["first"] = 10;
dict["second"] = 20;
dict["third"] = 30;

Console.WriteLine(string.Join("; ", dict.Select(entry => $"{entry.Key}: {entry.Value}")));
// Output:
// first: 10; second: 20; third: 30

다음 예제와 같이 new 연산자와 함께 개체 또는 컬렉션 이니셜라이저를 사용하여 하나의 명령문에서 개체를 인스턴스화하고 초기화할 수 있습니다.

var dict = new Dictionary<string, int>
{
    ["first"] = 10,
    ["second"] = 20,
    ["third"] = 30
};

Console.WriteLine(string.Join("; ", dict.Select(entry => $"{entry.Key}: {entry.Value}")));
// Output:
// first: 10; second: 20; third: 30

대상 형식 new

생성자 호출 식은 대상 형식입니다. 즉, 식의 대상 형식을 알고 있는 경우 다음 예제와 같이 형식 이름을 생략할 수 있습니다.

List<int> xs = new();
List<int> ys = new(capacity: 10_000);
List<int> zs = new() { Capacity = 20_000 };

Dictionary<int, List<int>> lookup = new()
{
    [1] = new() { 1, 2, 3 },
    [2] = new() { 5, 8, 3 },
    [5] = new() { 1, 0, 4 }
};

앞의 예제에 나온 것처럼 대상으로 형식화된 new 식에는 항상 괄호를 사용합니다.

new 식의 대상 형식을 알 수 없는 경우(예를 들어 var 키워드를 사용하는 경우) 형식 이름을 지정해야 합니다.

배열 생성

또한 다음 예제와 같이 new 연산자를 사용하여 배열 인스턴스를 만듭니다.

var numbers = new int[3];
numbers[0] = 10;
numbers[1] = 20;
numbers[2] = 30;
Console.WriteLine(string.Join(", ", numbers));
// Output:
// 10, 20, 30

배열 초기화 구문을 사용하여 배열 인스턴스를 만들고 하나의 명령문에 요소를 채웁니다. 다음 예제에서는 이를 수행하는 다양한 방법을 보여줍니다.

var a = new int[3] { 10, 20, 30 };
var b = new int[] { 10, 20, 30 };
var c = new[] { 10, 20, 30 };
Console.WriteLine(c.GetType());  // output: System.Int32[]

배열에 대한 자세한 내용은 배열을 참조하세요.

익명 형식의 인스턴스화

익명 형식의 인스턴스를 만들려면 new 연산자와 개체 이니셜라이저 구문을 사용합니다.

var example = new { Greeting = "Hello", Name = "World" };
Console.WriteLine($"{example.Greeting}, {example.Name}!");
// Output:
// Hello, World!

형식 인스턴스의 소멸

앞서 만든 형식 인스턴스를 제거할 필요가 없습니다. 참조 형식과 값 형식 모두의 인스턴스는 자동으로 제거됩니다. 값 형식의 인스턴스는 포함된 컨텍스트가 제거되는 즉시 제거됩니다. 참조 형식의 인스턴스는 마지막 참조가 제거된 후 일부 지정되지 않은 시간에 가비지 수집기에 의해 제거됩니다.

파일 핸들과 같이 관리되지 않은 리소스를 포함하는 형식 인스턴스의 경우에는 결정적 정리를 사용하여 포함된 리소스가 가능한 빨리 릴리스되도록 하는 것이 좋습니다. 자세한 내용은 System.IDisposable API 참조 및 명령문 사용 문서를 참조하세요.

연산자 오버로드 가능성

사용자 정의 형식은 new 연산자를 오버로드할 수 없습니다.

C# 언어 사양

자세한 내용은 C# 언어 사양new 연산자 섹션을 참조하세요.

대상으로 형식화된 new 식에 대한 자세한 내용은 기능 제안 노트를 참조하세요.

참고 항목