다음을 통해 공유


인스턴스 생성자(C# 프로그래밍 가이드)

new으로 형식의 새 인스턴스를 만들 때 실행되는 코드를 지정하기 위해 인스턴스 생성자를 선언합니다. 정적 클래스 또는 비정적 클래스의 정적 변수를 초기화하려면 정적 생성자를 정의할 수 있습니다.

다음 예제와 같이 한 형식으로 여러 인스턴스 생성자를 선언할 수 있습니다.

class Coords
{
    public Coords()
        : this(0, 0)
    {  }

    public Coords(int x, int y)
    {
        X = x;
        Y = y;
    }

    public int X { get; set; }
    public int Y { get; set; }

    public override string ToString() => $"({X},{Y})";
}

class Example
{
    static void Main()
    {
        var p1 = new Coords();
        Console.WriteLine($"Coords #1 at {p1}");
        // Output: Coords #1 at (0,0)

        var p2 = new Coords(5, 3);
        Console.WriteLine($"Coords #2 at {p2}");
        // Output: Coords #2 at (5,3)
    }
}

앞의 예제에서 첫 번째 매개 변수가 없는 생성자는 두 인수가 모두 0인 두 번째 생성자를 호출합니다. 이를 위해 this 키워드를 사용합니다.

파생 클래스에서 인스턴스 생성자를 선언하는 경우 기본 클래스의 생성자를 호출할 수 있습니다. 이렇게 하려면 다음 예제와 같이 base 키워드를 사용합니다.

abstract class Shape
{
    public const double pi = Math.PI;
    protected double x, y;

    public Shape(double x, double y)
    {
        this.x = x;
        this.y = y;
    }

    public abstract double Area();
}

class Circle : Shape
{
    public Circle(double radius)
        : base(radius, 0)
    {  }

    public override double Area() => pi * x * x;
}

class Cylinder : Circle
{
    public Cylinder(double radius, double height)
        : base(radius)
    {
        y = height;
    }

    public override double Area() => (2 * base.Area()) + (2 * pi * x * y);
}

class Example
{
    static void Main()
    {
        double radius = 2.5;
        double height = 3.0;

        var ring = new Circle(radius);
        Console.WriteLine($"Area of the circle = {ring.Area():F2}");
        // Output: Area of the circle = 19.63
        
        var tube = new Cylinder(radius, height);
        Console.WriteLine($"Area of the cylinder = {tube.Area():F2}");
        // Output: Area of the cylinder = 86.39
    }
}

매개 변수 없는 생성자

‘클래스’에 명시적 인스턴스 생성자가 없는 경우 C#은 다음 예제와 같이 해당 클래스의 인스턴스를 인스턴스화하기 위해 사용할 수 있는 매개 변수가 없는 생성자를 제공합니다.

public class Person
{
    public int age;
    public string name = "unknown";
}

class Example
{
    static void Main()
    {
        var person = new Person();
        Console.WriteLine($"Name: {person.name}, Age: {person.age}");
        // Output:  Name: unknown, Age: 0
    }
}

이 생성자는 해당하는 이니셜라이저에 따라 인스턴스 필드와 속성을 초기화합니다. 필드 또는 속성에 이니셜라이저가 없는 경우 해당 값은 필드 또는 속성 형식의 기본값으로 설정됩니다. 클래스에서 하나 이상의 인스턴스 생성자를 선언하는 경우 C#은 매개 변수가 없는 생성자를 제공하지 않습니다.

구조체 형식은 항상 매개 변수가 없는 생성자를 제공합니다. 매개 변수 없는 생성자는 형식의 기본값을 생성하는 암시적 매개 변수 없는 생성자이거나 명시적으로 선언된 매개 변수 없는 생성자입니다. 자세한 내용은 구조체 형식 문서의 구조체 초기화 및 기본값 섹션을 참조하세요.

기본 생성자

C# 12부터 클래스 및 구조체에서 기본 생성자를 선언할 수 있습니다. 형식 이름 뒤에 매개 변수를 괄호 안에 넣습니다.

public class NamedItem(string name)
{
    public string Name => name;
}

기본 생성자에 대한 매개 변수는 선언 형식의 전체 본문 범위에 있습니다. 속성이나 필드를 초기화할 수 있습니다. 메서드나 로컬 함수에서 변수로 사용될 수 있습니다. 기본 생성자에 전달될 수 있습니다.

기본 생성자는 이러한 매개 변수가 해당 형식의 모든 인스턴스에 필요함을 나타냅니다. 명시적으로 작성된 모든 생성자는 기본 생성자를 호출하려면 this(...) 이니셜라이저 구문을 사용해야 합니다. 이렇게 하면 기본 생성자 매개 변수가 모든 생성자에 의해 명확히 할당됩니다. record class 형식을 포함한 모든 class 형식의 경우 기본 생성자가 있으면 암시적 매개 변수 없는 생성자가 생성되지 않습니다. record struct 형식을 포함한 모든 struct 형식의 경우 암시적 매개 변수 없는 생성자가 항상 내보내지고 기본 생성자 매개 변수를 포함한 모든 필드를 항상 0비트 패턴으로 초기화합니다. 매개 변수가 없는 명시적 생성자를 작성하는 경우 기본 생성자를 호출해야 합니다. 이 경우 기본 생성자 매개 변수에 대해 다른 값을 지정할 수 있습니다. 다음 코드는 기본 생성자의 예를 보여 줍니다.

// name isn't captured in Widget.
// width, height, and depth are captured as private fields
public class Widget(string name, int width, int height, int depth) : NamedItem(name)
{
    public Widget() : this("N/A", 1,1,1) {} // unnamed unit cube

    public int WidthInCM => width;
    public int HeightInCM => height;
    public int DepthInCM => depth;

    public int Volume => width * height * depth;
}

특성에 method: 대상을 지정하여 합성된 기본 생성자 메서드에 특성을 추가할 수 있습니다.

[method: MyAttribute]
public class TaggedWidget(string name)
{
   // details elided
}

method 대상을 지정하지 않으면 특성은 메서드가 아닌 클래스에 배치됩니다.

classstruct 형식에서 기본 생성자 매개 변수는 형식 본문 어디에서나 사용할 수 있습니다. 멤버 필드로 사용할 수 있습니다. 기본 생성자 매개 변수가 사용되는 경우 컴파일러는 컴파일러 생성 이름을 사용하여 전용 필드의 생성자 매개 변수를 캡처합니다. 기본 생성자 매개 변수가 형식 본문에 사용되지 않으면 전용 필드가 캡처되지 않습니다. 이 규칙은 기본 생성자에 전달된 기본 생성자 매개 변수의 복사본 두 개를 실수로 할당하는 것을 방지합니다.

형식에 record 한정자가 포함된 경우 컴파일러는 대신 기본 생성자 매개 변수와 동일한 이름을 가진 공용 속성을 합성합니다. record class 형식의 경우 기본 생성자 매개 변수가 기본 생성자와 동일한 이름을 사용하는 경우 해당 속성은 기본 record class 형식의 공용 속성입니다. 파생된 record class 형식에서는 중복되지 않습니다. 이러한 속성은 record 형식이 아닌 경우 생성되지 않습니다.

참고 항목