생성자2 Articles

  1. 2007/01/24 private 생성자.. (2)
  2. 2006/12/20 static 생성자의 생성 시점.
C# 2007/01/24 21:24

private 생성자..

나는 private로 만드는 생성자는 잘 쓰지 않는다. 글세 나만 잘 안쓰지 다른 사람들은 잘쓸지도 모르겠다. ^^ 백마디 말보다 소스 한번 보자~~

class PrivateConstruct
{
    private static PrivateConstruct privateConstruct = null;
    private int sumX;
    private int sumY;
    private PrivateConstruct()
    {
        Console.WriteLine("Private Construct~~");
    }
    public static PrivateConstruct getInstance()
    {
        if (PrivateConstruct.privateConstruct == null)
            PrivateConstruct.privateConstruct = new PrivateConstruct();
        return PrivateConstruct.privateConstruct;
    }
    public int Sum()
    {
        return (this.sumX + this.sumY);
    }
    public int i
    {
        get
        {
            return this.sumX;
        }
        set
        {
            this.sumX = value;
        }
    }
    public int j
    {
        get
        {
            return this.sumY;
        }
        set
        {
            this.sumY = value;
        }
    }
    static void Main(string[] args)
    {
        PrivateConstruct pc1 = PrivateConstruct.getInstance();
        PrivateConstruct pc2 = PrivateConstruct.getInstance();
        pc1.i = 1;
        pc1.j = 2;
        Console.WriteLine("pc1 의 sum() 메서드 " + pc1.Sum());
        Console.WriteLine("pc2 의 sum() 메서드 " + pc2.Sum());
    }
}



 

결과
Private Construct~~
pc1 의 sum() 메서드 3
pc2 의 sum() 메서드 3



위에서 PrivateConstruct 는 싱글톤 형태의 서비스를 한다. 싱글톤 서비스란 나는 웹서비스 쪽에서 처음 접했는데, 어떤 서비스를 요청할때 마다 매번 새로운 서비스를 만드는 것이 아니라, 딱 한번만 그 인스턴스를 만드는 것이다. 그래서 만든것을 가져다 사용 하는것이다. 그럼으로 이점은 숫자 카운팅이나 잊어버리지 않을 성격의 것들을 기억 할수 있다. 웹서비스가 멈출때까지...

그것을 구현하기 위해서 private 형으로 생성자를 선언했다. PrivateConstruct는 단 한개의 인스턴스만 있으면 된다. 뭐 위에 프로그램은 간단해서 문제가 없을지 모르겠지만, 만약 큰 통합 프레임워크 같은 경우에는 PrivateConstruct를 쓰게 된다면 어디선가 그냥 생성할수 있을것이다. 이것을 방지 하기위해서 private 생성자로 생성자을 만들어 놓으면 그냥 가져다 쓸경우 생성을 할수 없게 된다. 이런 경우 private 생성자를 사용하는것이 유용하게 쓰인다. ^^

클래스 함수에서 스테틱 멤버필드나 스테틱 함수를 사용할 수 있게 되는데 이 스테틱 멤버필드와 같은 경우에는 스테틱 생성자를 이용하여 멤버들의 값을 초기화 할수 있다. 그렇다면 이 스테틱 생성자는 언제 생성이 될것인가? 메인이 실행되는 시점? 궁금하다.


using System;
class StaticConst
{
public static int sInt=0;
static StaticConst()
{
 sInt = 10;
 Console.Write("sInt=" + sInt + " : static생성자!!!");
}
public StaticConst()
{
}
public static void InitSint(int a)
{
 sInt = a;
}
}
class StaticConstTest
{
public static void Main()
{
 Console.WriteLine("사용하지 않음");
 int a=StaticConst.sInt;
}
}
 



위와 같은 간단한 코드를 만들어 봤다. 그럼 결과는

StaticConst

사용하지 않음
sInt=10 : static생성자!!!



이와 같은 결과가 나왔다. 그렇다면 스테틱 생성자는 사용하지 않음 후 생성자의 메세지가 출력 됐으므로 스테틱 생성자는 스테틱 멤버를 접근하게 되면 스테틱 생성자가 생성됨을 알게 되었다.

참고로 스테틱 생성자의 특징!!
접근제어를 사용할 수 없음.
매개변수를 가질 수 없음.

div>