클래스를 디자인하다 보면,

많은 경우 생성자의 인자를 통해 멤버변수를 초기화를 하는데,

멤버변수를 추가해야할 일이 생기게 되면,

덩달아서 생성자 또한 변경이나 추가를 해줘야 한다.

 

우선 Java를 예로 들어보자.

 

 

2개의 멤버변수를 갖는 클래스를 예로 들어보자.

public class TestClass

{

    private int m_iVal1 = 0;

    private int m_iVal2 = 0;

 

    public TestClass(int iVal1, int iVal2)

    {

        m_iVal1 = iVal1;

        m_iVal2 = iVal2;

    }

}

 

이 클래스에 멤버변수가 추가된다고 무작정 이렇게 클래스를 변경하는 사람은 없을꺼다.

public class TestClass

{

    private int m_iVal1 = 0;

    private int m_iVal2 = 0;

    private int m_iVal3 = 0;

 

    public TestClass(int iVal1, int iVal2, int iVal2)

    {

        m_iVal1 = iVal1;

        m_iVal2 = iVal2;

        m_iVal3 = iVal3;

    }

}

무작정 이렇게 변경을 해버리면

기존에 인자 2개 생성자 TestClass(1,2)를 사용했던 모든 프로그램들에선 오류가 발생한다.

 

그렇다고 이렇게 똑같은 생장자에 코드만 추가생성을 하면 어떻게 될까?

public class TestClass

{

    private int m_iVal1 = 0;

    private int m_iVal2 = 0;

    private int m_iVal3 = 0;

 

    public TestClass(int iVal1, int iVal2)

    {

        m_iVal1 = iVal1;

        m_iVal2 = iVal2;

    }

 

    public TestClass(int iVal1, int iVal2, int iVal3)

    {

        m_iVal1 = iVal1;

        m_iVal2 = iVal2;

        m_iVal3 = iVal3;

    }

}

이렇게 수정했을시 또다른 문제가 발생할 수 있다.

첫째 문제 불필요한 소스코드 작성이고,

둘째 문제는 TestClass(1, 2)와 TestClass(1,2,3)간 무결성 오류가 생길 수 있다는 것이다.

 

시간이 지나고 지나서, 생성자에서 멤버변수 초기화부분을 수정하게 된다면...

매번 TestClass(1, 2)와 TestClass(1,2,3)를 똑같이 수정해주거나,

한쪽에서 수정을 빼먹는다면 무결성 오류가 발생할 수 있는것이다.

 

따라서 이렇게 수정하는 것이 가장 깔끔하다고 할 수 있다.

public class TestClass

{

    private int m_iVal1 = 0;

    private int m_iVal2 = 0;

    private int m_iVal3 = 0;

 

    public TestClass(int iVal1, int iVal2)

    {

        m_iVal1 = iVal1;

        m_iVal2 = iVal2;

    }

 

    public TestClass(int iVal1, int iVal2, int iVal3)

    {

        this(iVal1, iVal2);    //이 코드앞에 다른 코드를 추가하면 컴파일 오류가 생긴다.

        m_iVal3 = iVal3;

    }

}

항상 주의해야 할 것은 생성자에서 또다른 생성자를 호출할때,

Body의 가장 첫부분에 생성자를 호출해야한다는 것이다.

생성자가 클래스를 초기화 하는 놈인데, 클래스 초기화도 전에 다른 것을 수행하면 안되기 때문이다.

아주 간단한 Print문이라도 예외없이 Java컴파일는 오류를 반환한다.

 

 

 

자 이번엔 C#을 예로 들어보자.

 

 

위와 똑같은 구분을 C#으로 작성해보면 에러가 발생한다.

public class TestClass

{

    private int m_iVal1 = 0;

    private int m_iVal2 = 0;

    private int m_iVal3 = 0;

 

    public TestClass(int iVal1, int iVal2)

    {

        m_iVal1 = iVal1;

        m_iVal2 = iVal2;

    }

 

    public TestClass(int iVal1, int iVal2, int iVal3)

    {

        this(iVal1, iVal2);    //여기서 오류가 발생한다.

        m_iVal3 = iVal3;

    }

}

C#에서는 생성자 Body안에서 생성자를 호출하는 것이 문법적으로 막혀있다.

Java에서는 Body안에 호출할 수는 있지만, 가장 처음에 호출하게 되었있는데,

C#에서는 아예 문법적으로 이를 제약하여 Body구문 이전에 이를 호출해야한다.

 

C#생성장에서 다른 생성자를 호출하려면 이렇게 해야한다.(C++을 써왔다면 익숙한 구문)

public class TestClass

{

    private int m_iVal1 = 0;

    private int m_iVal2 = 0;

    private int m_iVal3 = 0;

 

    public TestClass(int iVal1, int iVal2)

    {

        m_iVal1 = iVal1;

        m_iVal2 = iVal2;

    }

 

    public TestClass(int iVal1, int iVal2, int iVal3) : this(iVal1, iVal2)

    {

        m_iVal3 = iVal3;

    }

}


Google AdSense

+ Recent posts