[팁] Verbatim String에 관해 알아둘 몇 가지

오랫만에 업로드하는 강좌이군요. 그간 별 일 없으셨나요?

갈수록 바쁜일이 많아지다보니 강좌를 올리는 것 자체가 어려워지고 있습니다. 많은 양해를 부탁드립니다.

오늘은 C#에서 편하게 쓸 수 있는 유틸리티인 Verbatim String에 대해서 조명해 보도록 하겠습니다. Verbatim String은 마치 꽁수처럼 알려져 왔던 @ 이라는 기호가 붙는 문자열을 뜻합니다. 다음의 예제를 살펴보도록 하지요.


string test = @”
Welcome to
“” My “”
Program!”;

Verbatim 문자열로 사용할 수 있는 모든 것이 드러난 코드입니다. 따옴표를 이스케이프시키기 위하여 두번 따옴표를 표기했다는 점을 빼면 이스케이프 기호를 한번도 사용하지 않고도 있는 그대로를 가져다 붙인 점이 매우 독특합니다. 이 점을 이용하면 정규표현식과 같이 매우 복잡한 문자열을 보이는 그대로 가져다 쓸 수 있습니다. 즉, 다음과 같은 코드가 가능합니다.


string innerCode = @”/// <summary>
/// 대한민국의 주민등록번호 식별 체계에 의하여 제공된 주민등록번호가 올바른 주민등록번호인지의 여부를 판별합니다.
/// </summary>
/// <remarks>
/// 이 메서드는 20세기, 21세기 출생자에 한해서 주민등록번호 유효성 검사를 지원합니다.
/// 20세기보다 이전의 출생자의 주민등록번호, 21세기보다 이후의 출생자의 주민등록번호들은
/// 검사 결과가 모두 False로 출력됩니다.
/// </remarks>
/// <param name=””firstPart””>주민등록번호를 구성하는 앞의 6자리 숫자입니다. 연, 월, 일 순서로 각각 두 자리로 구성된 앞의 6자리입니다.</param>
/// <param name=””lastPart””>주민등록번호를 구성하는 뒷쪽의 7자리 숫자입니다. 고유 번호 7자리로 구성되어있습니다.</param>
/// <returns>형식에 맞는 주민등록번호이면 True, 맞지 않다면 False를 반환합니다.</returns>
public static bool CheckSocialNumber(string firstPart, string lastPart)
{
  string socialNo = firstPart.Trim() + lastPart.Trim();

  // 정규식 패턴 문자열입니다. 6자리의 정수 + [1, 2, 3, 4 중 택 1] + 6자리의 정수
  string pattern = @””d{6}[1234]d{6}””;

  // 입력 내역과 정규식 패턴이 일치하면 이 조건문을 통과합니다.
  if(!Regex.Match(socialNo, pattern, RegexOptions.Compiled | RegexOptions.IgnorePatternWhitespace).Success)
       return false;

  // 20세기 출생자와 21세기 출생자를 구분합니다.
  string birthYear = (‘2’ >= socialNo[6]) ? “”19″” : “”20″”;

  // 연도 두 자리를 추출하여 추가합니다.
  birthYear += socialNo.Substring(0, 2);

  // 월 단위 두 자리를 추출합니다.
  string birthMonth = socialNo.Substring(2, 2);

  // 일 단위 두 자리를 추출합니다.
  string birthDate = socialNo.Substring(4, 2);

  try
  {
       // 정수로 변환을 시도합니다. 예외가 생기면 catch 블럭으로 이동됩니다.
       int bYear = int.Parse(birthYear);
       int bMonth = int.Parse(birthMonth);
       int bDate = int.Parse(birthDate);

      // 20세기보다 이전연도, 21세기보다 이후연도,
       // 월 표기 수가 1보다 작은 값, 월 표기 수가 12보다 큰 값,
       // 일 표기 수가 1보다 작은 값, 일 표기 수가 12보다 큰 값에 해당되면
       // catch 블럭으로 이동됩니다.
       if(bYear < 1900 || bYear > 2100 || bMonth < 1 || bMonth > 12 || bDate < 1 || bDate > 31)
           throw new Exception(“”잘못된 날짜 표현입니다.””);
  }
  catch { return false; }

  // 고유 알고리즘입니다.
  int[] buffer = new int [13];

  for(int i=0; i<buffer.Length; i++)
       buffer[i] = Int32.Parse(socialNo[i].ToString());

  int summary = 0;
  int[] multipliers = new int [] { 2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5 };

  for(int i=0; i<12; i++)
       summary += (buffer[i] *= multipliers[i]);

  return !((11 – (summary % 11)) % 10 != buffer[12]);
}
“;

Verbatim 문자열을 이용하여 코드 자체를 미리 내장하고 프로그램을 실행하는 도중에 동적으로 컴파일할 수 있습니다. 또한 이와 같이 포함된 Verbatim 문자열은 Obfuscator와 같은 도구로 암호화할 수도 있기 때문에 정보를 보호하기 위한 목적으로도 사용할 수 있습니다.

프로그램을 개발하는데에 좀 더 도움이 되시길 바라며 올해도 건강하십시오. ^^

댓글 남기기