본문스크랩 클래스 인스턴스 생성자 (new)


인스턴스 생성자는 인스턴스를 만들고 초기화하는 데 사용됩니다. 다음 형식으로 생성자를 선언할 수 있습니다.

[attributes] [modifiers] identifier([formal-parameter-list])
[initializer]{constructor-body}

 

attributes(선택적 요소) 추가 선언 정보입니다.

 

modifiers(선택적 요소) 허용된 한정자는 extern 및 네 개의 액세스 한정자입니다.

 

identifier identifier는 클래스 이름과 같습니다.
formal-parameters(선택적 요소) 생성자로 전달되는 선택적 매개 변수입니다. 이 매개 변수는 생성자처럼 액세스 가능해야 합니다.
initializer(선택적 요소) 생성자 본문을 실행하기 전에 호출됩니다. initializer는 선택적 argument-list를 가진 다음 형식 중 하나가 될 수 있습니다.
    : base(argument-list)
    : this(argument-list)
constructor-body 클래스 인스턴스를 초기화하는 문을 포함하는 블록입니다.

 

설명

클래스 생성자는 다음 예제처럼 새 개체를 만들 때 호출됩니다.

Point myPoint = new Point();

클래스는 둘 이상의 생성자를 가질 수 있습니다. 예를 들어,Point()같이 인수 없는 생성자와Point(int x, int y)같이 인수 있는 다른 생성자를 선언할 수 있습니다.

클래스에 생성자가 없으면 매개 변수 없는 기본 생성자가 자동으로 생성되며 개체 필드를 초기화하는 데 기본값이 사용됩니다(예:int는 0으로 초기화됨).

클래스 생성자는 다음 예제처럼 이니셜라이저를 통해 기본 클래스의 생성자를 호출할 수 있습니다.

public Cylinder(double radius, double height): base(radius, height)
{
}

앞의 예제에서radiusheight필드는 기본 클래스 생성자를 통해 초기화됩니다. 이것은 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

 


답글 남기기

이메일 주소는 공개되지 않습니다.