인스턴스 생성자(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 지정하지 않으면 특성이 메서드가 아닌 클래스에 배치됩니다.
형식 및 struct 형식에서 class 기본 생성자 매개 변수는 형식 본문의 어디에서나 사용할 수 있습니다. 멤버 필드로 사용할 수 있습니다. 기본 생성자 매개 변수를 사용하는 경우 컴파일러는 컴파일러에서 생성된 이름을 사용하여 프라이빗 필드에서 생성자 매개 변수를 캡처합니다. 기본 생성자 매개 변수가 형식 본문에 사용되지 않으면 프라이빗 필드가 캡처되지 않습니다. 이 규칙은 기본 생성자에 전달되는 기본 생성자 매개 변수의 복사본 두 복사본을 실수로 할당하는 것을 방지합니다.
형식에 한정자가 포함된 record 경우 컴파일러는 대신 기본 생성자 매개 변수와 이름이 같은 public 속성을 합성합니다. 형식의 경우 record class 기본 생성자 매개 변수가 기본 기본 생성자와 동일한 이름을 사용하는 경우 해당 속성은 기본 record class 형식의 public 속성입니다. 파생 record class 형식에서는 중복되지 않습니다. 이러한 속성은 비 형식record 에 대해 생성되지 않습니다.
참고 항목
.NET feedback
피드백
다음에 대한 사용자 의견 제출 및 보기