인스턴스 생성자는 인스턴스를 만들고 초기화하는 데 사용됩니다. 다음 형식으로 생성자를 선언할 수 있습니다.
[attributes] [modifiers] identifier([formal-parameter-list])
[initializer]{constructor-body}
attributes(선택적 요소) 추가 선언 정보입니다.
modifiers(선택적 요소) 허용된 한정자는 extern 및 네 개의 액세스 한정자입니다.
: base(argument-list)
: this(argument-list)
설명
클래스 생성자는 다음 예제처럼 새 개체를 만들 때 호출됩니다.
Point myPoint = new Point();
클래스는 둘 이상의 생성자를 가질 수 있습니다. 예를 들어,Point()
같이 인수 없는 생성자와Point(int x, int y)
같이 인수 있는 다른 생성자를 선언할 수 있습니다.
클래스에 생성자가 없으면 매개 변수 없는 기본 생성자가 자동으로 생성되며 개체 필드를 초기화하는 데 기본값이 사용됩니다(예:int는 0으로 초기화됨).
클래스 생성자는 다음 예제처럼 이니셜라이저를 통해 기본 클래스의 생성자를 호출할 수 있습니다.
public Cylinder(double radius, double height): base(radius, height)
{
}
앞의 예제에서radius
및height
필드는 기본 클래스 생성자를 통해 초기화됩니다. 이것은 C++ 초기화 목록과 유사합니다.
이 클래스 생성자는 다음 예제처럼this키워드를 사용하여 같은 클래스에서 다른 생성자를 호출할 수도 있습니다.
public Point(): this(0,20)
{
}
앞의 예제에서 매개 변수 없는 생성자Point()
는 2개의 인수를 가진 다른 생성자를 호출하여 (0, 20)를 기본 위치로 초기화합니다.
예제 1
다음 예제에서는 인수 없는 클래스 생성자와 두 개의 인수가 있는 클래스 생성자라는 2개의 클래스 생성자를 가진 클래스에 대해 설명합니다.
// Constructor1.cs
using System;
class Point
{
public int x, y;
// Default constructor:
public Point()
{
x = 0;
y = 0;
}
// A constructor with two arguments:
public Point(int x, int y)
{
this.x = x;
this.y = y;
}
// Override the ToString method:
public override string ToString()
{
return(String.Format("({0},{1})", x, y));
}
}
class MainClass
{
static void Main()
{
Point p1 = new Point();
Point p2 = new Point(5,3);
// Display the results using the overriden ToString method:
Console.WriteLine("Point #1 at {0}", p1);
Console.WriteLine("Point #2 at {0}", p2);
}
}
출력
Point #1 at (0,0)
Point #2 at (5,3)
예제 2
이 예제에서Person
클래스는 생성자를 갖지 않는데, 이 경우 기본 생성자가 자동으로 생성되며 필드는 기본값으로 초기화됩니다.
// Constructor2.cs
using System;
public class Person
{
public int age;
public string name;
}
public class MainClass
{
static void Main()
{
Person p = new Person();
Console.Write("Name: {0}, Age: {1}",p.name, p.age);
}
}
출력
Name: , Age: 0
age의 기본값은0
이고name
의 기본값은null입니다.
예제 3
다음 예제에서는 기본 클래스 이니셜라이저를 사용하여 설명합니다.Circle
클래스는 일반 클래스Shape
에서 파생되며Cylinder
클래스는Circle
클래스에서 파생됩니다. 파생된 각 클래스의 생성자는 자체의 기본 클래스 이니셜라이저를 사용합니다.
// CtorInitializer.cs
using System;
abstract class Shape
{
public const double pi = Math.PI;
protected double x, y, z;
public Shape (double x, double y, double z)
{
this.x = x;
this.y = y;
this.z = z;
}
public abstract double Area();
}
class Circle: Shape
{
public Circle(double radius): base(radius,0,0)
{
}
public override double Area()
{
return pi*x*x;
}
}
class Cylinder: Circle
{
public Cylinder(double radius, double height): base(radius)
{
y = height;
}
public override double Area()
{
return 2*(base.Area()) + 2*pi*x*y;
}
}
class TestClass
{
public static void Main()
{
double radius = 2.5, height = 3.0;
Circle myCircle = new Circle(radius);
Cylinder myCylinder = new Cylinder(radius, height);
Console.WriteLine("Area of the circle = {0:F2}",
myCircle.Area());
Console.WriteLine("Area of the cylinder = {0:F2}",
myCylinder.Area());
}
}
출력
Area of the circle = 19.63
Area of the cylinder = 86.39