다음을 통해 공유


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

new 식을 사용하여 클래스의 개체를 만드는 경우 인스턴스 생성자를 사용하여 인스턴스 멤버 변수를 만들고 초기화합니다. 정적 클래스나 비정적 클래스의 정적 변수를 초기화하려면 정적 생성자를 정의해야 합니다. 자세한 내용은 정적 생성자(C# 프로그래밍 가이드)를 참조하십시오.

다음 예제에서는 인스턴스 생성자를 보여 줍니다.

class CoOrds
{
    public int x, y;

    // constructor 
    public CoOrds()
    {
        x = 0;
        y = 0;
    }
}

참고

명확한 이해를 돕기 위해 이 클래스에는 public 필드가 포함되어 있습니다.public 필드를 사용하면 프로그램의 모든 메서드가 위치에 관계없이 개체의 내부 작업에 확인을 거치지 않은 채 무제한으로 액세스할 수 있으므로 이 방법은 실제로 사용하지 않는 것이 좋습니다.데이터 멤버는 일반적으로 전용이어야 하며 클래스 메서드 및 속성을 통해서만 액세스할 수 있어야 합니다.

이 인스턴스 생성자는 CoOrds 클래스를 기반으로 개체가 만들어질 때마다 호출됩니다. 이와 같이 인수를 사용하지 않는 생성자를 기본 생성자라고 합니다. 그러나 일반적으로는 다른 생성자를 추가로 제공하는 것이 유용합니다. 예를 들어, 데이터 멤버에 대한 초기 값을 지정할 수 있도록 CoOrds 클래스에 생성자를 추가할 수 있습니다.

// A constructor with two arguments: 
public CoOrds(int x, int y)
{
    this.x = x;
    this.y = y;
}

이렇게 하면 다음과 같이 특정 초기 값이나 기본값으로 CoOrd 개체를 만들 수 있습니다.

CoOrds p1 = new CoOrds();
CoOrds p2 = new CoOrds(5, 3);

클래스에 생성자가 없는 경우 기본 생성자가 자동으로 생성되며, 기본값을 사용하여 개체 필드가 초기화됩니다. 예를 들어, int는 0으로 초기화됩니다. 기본값에 대한 자세한 내용은 기본값 표(C# 참조)를 참조하십시오. 따라서, CoOrds 클래스 기본 생성자가 모든 데이터 멤버를 0으로 초기화하므로 클래스의 작동 방식을 변경하지 않고도 이를 완전히 제거할 수 있습니다. 여러 생성자를 사용하는 전체 예제는 이 항목의 뒷부분에 있는 예제 1을 참조하고, 자동으로 생성된 생성자의 예제는 예제 2를 참조하십시오.

인스턴스 생성자를 사용하여 기본 클래스의 인스턴스 생성자를 호출할 수도 있습니다. 클래스 생성자는 다음과 같이 이니셜라이저를 통해 기본 클래스의 생성자를 호출할 수 있습니다.

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

이 예제에서 Circle 클래스는 Circle을 파생하는 데 사용되는 Shape에서 제공하는 생성자에 반지름과 높이를 나타내는 값을 전달합니다. Shape 및 Circle을 사용하는 전체 예제는 이 항목의 예제 3을 참조하십시오.

예제 1

다음 예제에서는 인수 없는 클래스 생성자와 두 개의 인수가 있는 클래스 생성자라는 2개의 클래스 생성자를 가진 클래스에 대해 설명합니다.

class CoOrds
{
    public int x, y;

    // Default constructor: 
    public CoOrds()
    {
        x = 0;
        y = 0;
    }

    // A constructor with two arguments: 
    public CoOrds(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()
    {
        CoOrds p1 = new CoOrds();
        CoOrds p2 = new CoOrds(5, 3);

        // Display the results using the overriden ToString method:
        Console.WriteLine("CoOrds #1 at {0}", p1);
        Console.WriteLine("CoOrds #2 at {0}", p2);
        Console.ReadKey();
    }
}
/* Output:
 CoOrds #1 at (0,0)
 CoOrds #2 at (5,3)        
*/

예제 2

이 예제에서 Person 클래스는 생성자를 갖지 않는데, 이 경우 기본 생성자가 자동으로 생성되며 필드는 기본값으로 초기화됩니다.

public class Person
{
    public int age;
    public string name;
}

class TestPerson
{
    static void Main()
    {
        Person person = new Person();

        Console.WriteLine("Name: {0}, Age: {1}", person.name, person.age);
        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
// Output:  Name: , Age: 0

age의 기본값은 0이고 name의 기본값은 null입니다. 기본값에 대한 자세한 내용은 기본값 표(C# 참조)를 참조하십시오.

예제 3

다음 예제에서는 기본 클래스 이니셜라이저를 사용하여 설명합니다. Circle 클래스는 일반 클래스 Shape에서 파생되며 Cylinder 클래스는 Circle 클래스에서 파생됩니다. 파생된 각 클래스의 생성자는 자체의 기본 클래스 이니셜라이저를 사용합니다.

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()
    {
        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 TestShapes
{
    static void Main()
    {
        double radius = 2.5;
        double height = 3.0;

        Circle ring = new Circle(radius);
        Cylinder tube = new Cylinder(radius, height);

        Console.WriteLine("Area of the circle = {0:F2}", ring.Area());
        Console.WriteLine("Area of the cylinder = {0:F2}", tube.Area());

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
/* Output:
    Area of the circle = 19.63
    Area of the cylinder = 86.39
*/

기본 클래스 생성자 호출에 대한 자세한 예제는 virtual(C# 참조), override(C# 참조)base(C# 참조)를 참조하십시오.

참고 항목

참조

클래스 및 구조체(C# 프로그래밍 가이드)

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

소멸자(C# 프로그래밍 가이드)

static(C# 참조)

개념

C# 프로그래밍 가이드