형식 변환 라우터 만들기

귀에 걸면 귀걸이고 코에 걸면 코걸이라는 암묵 형식 변환 연산자를 끝까지 응용해본 개념이다. 나름 이름을 붙이지만 “형식 변환 라우터”.! 상속 관계나 인터페이스 구현 여부와는 전혀 상관이 없는 서로 다른 두 형식을 중계할 수 있는 것은 물론 정상적으로 컴파일이 가능한 코드가 된다. 아래 코드와 같은 작업을 가능케 한다는 의미이다.


DataTable oTable = new DataTable(“input”);
oTable.Columns.AddRange((ToDataColumnArray)BuildArray(“ISBN”, “BOOKNM”, “AUTHOR”, “VENDOR”, “AMOUNT”, “FLAG”));

참고로 위에서 사용한 BuildArray 함수는 정적 함수로 아래와 같다.


public static string[] BuildArray(params string[] o) { return o; }

위의 예제에서 주목할 필요가 있는 부분은 바로 ToDataColumnArray라는 형식이다. 이것이 바로 내가 말하는 형식 변환 라우터이다. 소스를 잠깐 보면 아래와 같다.


public sealed class ToDataColumnArray
{
  private ToDataColumnArray(string[] o) { this.m_oArray = o; }
  private string[] m_oArray;

  public static implicit operator DataColumn[](ToDataColumnArray o)
  {
       ArrayList oTemp = new ArrayList(o.m_oArray.Length);


       for (int i = 0; i < o.m_oArray.Length; i++)
           oTemp.Add(new DataColumn(o.m_oArray[i]));


       return (DataColumn[])oTemp.ToArray(typeof(DataColumn));
  }


  public static implicit operator ToDataColumnArray(string[] o)
  { return new ToDataColumnArray(o); }
}


구조는 아주 간단하다. 인수를 받는 Private 멤버 생성자와 Private 멤버 필드, 그리고 암묵 형식 변환 연산자 두 개를 선언했다. 암묵 형식 변환 연산자를 두 개를 쓴 이유는 간단하다. ToDataColumnArray에 들어오고 나가는 형식을 정의한 것이다.

위의 예에서 BuildArrary로 만든 문자열 배열은 우선 들어오는 형식 변환 연산자 함수에서 생성되는데 ToDataColumnArray의 객체로 우선 만들어진다. 이 상태에서 Columns.AddRange 함수는 DataColumn 객체의 배열을 요구하는데 이 때 호출하게 되는 것이 나가는 형식 변환자 함수이다. 문자열의 배열을 DataColumn 객체의 배열로 바꾸는 처리를 한 다음 최종적으로 DataColumn 객체의 배열이 나가게 된다. 이로서 Columns.AddRange 함수의 요구 사항은 만족하게되고 모든 것이 정상적인 코드가 된다.

이와 같은 클래스를 Generic 버전으로 업그레이드한다면 더욱 가독성이 좋은 코드를 만드는 것도 가능할 것이다.

댓글 남기기