C#에서 new 키워드는 객체 지향 프로그래밍의 핵심 요소로, 주로 두 가지 용도로 사용됩니다. 첫 번째는 배열이나 객체를 메모리에 생성(인스턴스화)하는 것이며, 두 번째는 기본 클래스의 멤버를 숨기는(method hiding) 역할입니다. 이 글에서는 가장 많이 쓰이는 인스턴스 생성 용도를 중심으로 살펴보겠습니다.
1. 배열 인스턴스 생성
new 키워드를 사용하면 배열의 인스턴스를 생성하고 초기화할 수 있습니다. 다음 예제는 정수형 요소 5개를 담을 수 있는 배열을 힙(heap) 메모리에 할당합니다.
int[] a = new int[5];
이렇게 생성된 배열의 각 요소는 자동으로 기본값(정수형의 경우 0)으로 초기화됩니다.
2. 객체 생성 및 인스턴스화
new 연산자는 클래스의 객체를 생성하거나 인스턴스화하는 데 사용됩니다. new 키워드가 실행되면 해당 타입에 맞는 메모리가 힙에 할당되고, 생성자가 호출된 후 객체의 참조가 반환됩니다. 아래 예제에서는 new를 사용해 NumberManipulator 클래스의 객체를 생성합니다.
예제 코드
using System;
namespace CalculatorApplication {
class NumberManipulator {
public void swap(int x, int y) {
int temp;
temp = x; /* x의 값을 임시 변수에 저장 */
x = y; /* x에 y의 값 대입 */
y = temp; /* y에 임시 변수의 값 대입 */
}
static void Main(string[] args) {
NumberManipulator n = new NumberManipulator();
/* 지역 변수 정의 */
int a = 100;
int b = 200;
Console.WriteLine("Before swap, value of a : {0}", a);
Console.WriteLine("Before swap, value of b : {0}", b);
/* 값을 교환하는 함수 호출 */
n.swap(a, b);
Console.WriteLine("After swap, value of a : {0}", a);
Console.WriteLine("After swap, value of b : {0}", b);
Console.ReadLine();
}
}
}실행 결과
Before swap, value of a : 100 Before swap, value of b : 200 After swap, value of a : 100 After swap, value of b : 200
참고: 값이 교환되지 않는 이유
흥미롭게도 위 실행 결과에서 swap 호출 후에도 a와 b의 값은 그대로입니다. 그 이유는 C#에서 메서드 매개변수가 기본적으로 값에 의한 전달(pass by value) 방식으로 복사되기 때문입니다. 원본 변수의 값을 실제로 변경하려면 ref 또는 out 키워드를 사용해 참조로 전달해야 합니다.
정리
위 예제의 new NumberManipulator() 구문은 NumberManipulator 클래스의 새 인스턴스를 생성하여 변수 n에 할당합니다. 이처럼 new 키워드는 C#에서 객체와 배열을 메모리에 생성하는 필수적인 역할을 하며, 모든 참조 형식(reference type)을 사용할 때 반드시 거치게 되는 기본 문법입니다.