달력

12

« 2024/12 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

..  이번에는 Constructor Chaining(또는 Cascading)이라는 개념입니다.

대단한건 아니고 생성자를 하나가 아니라 여러 파라미터들을 옵션으로 선택할 경우 코드를 줄이기 위한 방법 중 하나입니다. 


물론 C# 뿐만이 아니라 Java에서도 가능하지만 Java에서는 딱히 이런 명칭을 들어본 적은 없는것 같네요..  C#은 약간 별도의 문법이 있어서 이런 명칭이 붙은 것 같습니다.  당연히 될 거라 생각하고 Java의 문법을 적용했는데 자꾸 Syntax Error가 발생하여 찾아보다가 발견한 내용입니다.



  예를 하나 들겠습니다.

UserException 이라는 사용자 정의 Exception을 하나 생성하려고 하는데 생성자에 파라미터로 에러메시지(message), 에러코드(code)라는 두 개의 파라미터를 받으려고 합니다.

그런데 항상 두 개의 파라미터를 꼭 받아야 하는 건 아니고 디폴트 코드가 있으면 메시지만, 거꾸로 디폴트 메시지가 있다면 코드만 받아서 나머지 하나는 디폴트 값을 넣으려고 합니다.  물론 둘 다 받을 경우도 있으니 총 3개의 경우의 수가 생기겠네요.


단순하게 생각해서 생성자 3개 만들면 끝납니다.  그런데 만일 단순히 이 값을 받아 저장하는 것이 아니라 값들에 따른 로직이 좀 더 있다라면 해당 로직은 세 개의 생성자에 동일하게 복사해서 넣어야 합니다.  코딩에서 주의해야 할 코드 중복이 발생하겠죠..

그렇다면 어떻게 하는 것이 좋을까요?  가장 다양한 케이스인 두 개의 파라미터를 모두 받는 경우에만 해당 로직을 구현해 놓고 나머지 두 개의 생성자에는 디폴트 값과 입력받은 값을 가지고 두 개의 파라미터를 가지는 생성자를 호출하면 깔끔하게 끝납니다.

백문이 불여일타라, Java의 경우는 대략 다음과 같은 코드로 만들 수 있습니다.


	public UserException (int code) {
        this(code, "Default Message");
    }

    public UserException (String message) {
        this(0, message);
    }

    public UserException (int code, String message) {
        // 값을 할당하고 처리하는 로직.....
    }



this() 를 이용하여 생성자 내부에서 생성자를 호출할 수 있죠.

물론 this()  호출은 해당 생성자의 첫번째에 위치해야 합니다.



  그런데 문제는 C#에서 동일한 코드를 사용했더니 자꾸 오류가 발생하는 겁니다.

검색을 해 보니 C#에서는 이런걸 Constructor Chaining(Cascading)이라 부르고(Java에서도 이 기법 자체를 그렇게 부르는지는 모르겠습니다.  지금까지는 들어본 적이 없어서..) 약간 문법이 다릅니다.  해당 내용을 C# 버전으로 구현하면 다음과 같습니다.


    public UserException (int code) : this(code, "Default Message")
    {

    }

    public UserException (String message) : this(0, message) {

    }

    public UserException (int code, String message) {
        // 값을 할당하고 처리하는 로직.....
    }


위 코드와 같이 함수명 뒤에 : this() 형태로 추가를 해야 하지 Java 처럼 내부에서 this를 호출하면 Syntax Error가 발생합니다.

물론 생성자 호출 후 자체적인 초기화 코드가 있으면 Java에서는 this 밑에, C#에서는 코드 본문 영역에 넣으면 됩니다.


이렇게 별 것도 아닌데 사소한 문법의 차이로 시간 낭비할 때가 해결된 후에 제일 허탈하더군요..

그게 어찌 보면 제가 이 꼭지를 만든 이유이기도 합니다.


다른 분들은 삽질을 덜 하길 바라면서...

'C# > Java 개발자를 위한 C#' 카테고리의 다른 글

C# 에서의 문자열 비교, == or Equals?  (4) 2017.02.28
이곳의 용도는...  (0) 2017.02.27
:
Posted by hanavy