[C#] string 앞의 @의 의미 및 활용

[C#] string 앞의 @의 의미 및 활용

안녕하세요. DiProB 입니다.

클라이언트 개발을 하다 보면 경로를 지정해야 하는 상황이 많습니다. 그런데 이 경로를 지정함에 있어서 특수 문자들 때문에 코딩 실수의 가능성이 급격하게 높아지게 됩니다. 실제로 저도 이 글을 쓰고 있는 주에 오래된 코드를 리팩토링 하다가 품질 테스트 까지 넘긴 코드를 수정해야 했습니다. 여러분들이 덩달아 고생한건 덤이었습니다. ㅠㅠ

물론 해당 코드는 C++ 이었어서 지금 C#의 특수문자 처리와 완벽하게 동일하진 않지만 path 설정에 의한 부분에서 야기된 문제라는 점에서 잊지 않기 위해서 기록을 남깁니다.

본론

Console.WriteLine("Hello, World!");

위 코드를 실행하면 정상적으로 콘솔창에 hello, world 라는 창이 보이게 됩니다.

그런데 아래와 같은 코드를 입력하면

Console.WriteLine("c:\test\test2");

제가 의도한 대로 c:\test\test2 경로를 표시할까요? 결과는 아래와 같이 나옵니다.

원인은 바로 “이스케이프 시퀀스”

대부분의 프로그래밍 언어에서는 문자열에 특수문자나 특정 명령을 표현하기 위해 이스케이프 시퀀스를 사용하게 됩니다.

(참조 msdn – 이스케이프 시퀀스)

https://learn.microsoft.com/ko-kr/cpp/c-language/escape-sequences?view=msvc-170

이스케이프 시퀀스표현
\a벨(경고)
\b백스페이스
\f폼 피드
\n줄 바꿈
\r캐리지 리턴
\t가로 탭
\v세로 탭
\’작은따옴표
\”큰따옴표
\\백슬래시
\?리터럴 물음표
\ooo8진수 표기법의 ASCII 문자
\xhh16진수 표기법의 ASCII 문자
\xhhhh이 이스케이프 시퀀스가 와이드 문자 상수 또는 유니코드 문자열 리터럴에 사용되는 경우 16진수 표기법의 유니코드 문자입니다.

예를 들어 WCHAR f = L'\x4e00' 또는 WCHAR b[] = L"The Chinese character for one is \x4e00"로 이름을 지정할 수 있습니다.

위 법칙에 따라서 문자열 안에 \t 가 탭으로 인식되어 저렇게 콘솔창에서 탭을 친 것처럼 띄워져서 표시된 겁니다.

따라서 우리가 원하는 경로가 표시되게 하기 위해서는 두 가지 방법이 있습니다.

  1. 경로를 나타내는 “\” 를 표현하기 위해 “\\”입력한다.
  2. @ 를 붙인다.
Console.WriteLine("c:\\test\\test2");
Console.WriteLine(@"c:\test\test2");

보시는 것처럼 둘 다 우리가 원하는 path 가 의도한 대로 잘 나왔습니다.

C# 에서 문자열 앞의 @ 는 해당 문자열에서 이스케이프시퀀스를 무시하고 특수문자를 그대로 반영하라는 명령어 입니다.

그럼 여기서 무엇을 선택하느냐는 개발자의 선택이라고 할 수 있겠지만 제가 앞으로 개발을 하거나 후배들에게 가이드를 해준다면 두 번째 방법을 가이드 해줄 겁니다.

제가 이번에 실수를 한 이유도 \\\\\\\\\\의 남발인 코드 때문이었습니다. 가독성이 훨씬 후자가 좋고 따라서 유지보수에 더 큰 이득이 있다고 봅니다.

결론

문자열에서 경로를 나타낼 때는 어지간하면 가독성을 위해 “@” 를 사용하자!!

Comments

No comments yet. Why don’t you start the discussion?

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다