생성자(Constructior) Chaining(Cascading) C#/Java 개발자를 위한 C#2017. 3. 9. 17:43
.. 이번에는 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 |