Swift에서 문자열을 사용할때 많이는 아니지만, 가끔 문자열에 " 혹은 \ 를 표현할 경우가 있습니다. 이런 상황이 발생했는데 헷갈리지 않고 간편하게 구분하고 사용하기 위해 이 글을 작성합니다.
Raw Strings는 Swift 5.0에서 도입된 기능으로, 문자열 내의 이스케이프 문자를 해석하지 않고 문자 그대로 처리하는 문자열 표기법입니다.
이것은 문자열 안에 있는 특수 문자나 이스케이프 시퀀스를 좀 더 쉽게 다룰 수 있도록 도와줍니다. Raw Strings는 문자열 내에서 \ (백슬래시) 와 " (따옴표) 를 직접 사용할 수 있게 해주어, 기존의 문자열에서 이스케이프 문자를 반복적으로 사용하는 번거로움을 줄여줍니다. 이를 통해 특정 패턴이나 정규 표현식을 사용할 때 더 직관적이고 가독성 있는 코드를 작성할 수 있습니다.
Raw strings를 사용하지 않은 기존 표현법 예시를 들어보겠습니다.
예를 들어 Hellow “World”라는 문자열을 표현한다고 가정해보겠습니다.
“World”에 있는 “를 표현하기 위해 “앞에 \를 추가해됩니다.
let str = "Hello \"World\""
print(str) // Hello "World"
또 다른 예로 정규식을 들어보겠습니다.
\\[A-Z]+[A-Za-z]+\.[a-z]+
위 정규식을 표현하기 위해 아래와 같이 작성했습니다.
let regex = "\\\\[A-Z]+[A-Za-z]+\\.[a-z]+"
위와 같이 표현하고 싶은 문자 앞에 \를 작성해야 됩니다.
보시다 시피 \가 여러개 추가되어서 복잡해 보일 것입니다. 물론 이게 뭐가 복잡한지 의문을 가질 수도 있을 것입니다. "그냥 표현하려는 문자 앞에 \를 붙히면 되는거지?" 라는 생각을 하실수 있습니다.
그런데 만약 여러 조건이 붙고, 표현하려는 문자열의 길이가 긴 경우(예를들면 JSON 문자열처리)와 같은 경우에는 놓칠수 있는 부분이 생길수도 있습니다.
그렇다면 "혹은 \ 를 사용하기 위해 \를 추가하는 이런 추가적인 작업은 왜 필요한것 일까요?
그 이유는 "와 \가 각각 문자열의 시작과 끝을 나타내는 경계 문자(String delimiters)와 이스케이프 문자(Escape characters)로 사용되기 때문입니다.
다시 말해 "는 문자열의 범위의 경계를 파악하기 위한 기호로 사용하고, \는 이스케이프 문자로 문자열(string literals) 안에서 특별한 일을 처리하기 위해 사용하기 때문입니다.
이런 불편함을 해결하기 위해 문자열 경계를 나타내는 새로운 경계 문자 #"…"# 를 추가한 Raw String이 추가 되었습니다.
이제 한번 위 예시들을 Raw String로 표현해보겠습니다.
let str1 = "Hello \"World\""
let str2 = #"Hello ”World”"#
let regex1 = "\\\\[A-Z]+[A-Za-z]+\\.[a-z]+"
let regex2 = #"\\[A-Z]+[A-Za-z]+\.[a-z]+"#
위와 같이 기존에 표현했던 문자열과 정규식 표현을 #"..."# 형식으로 추가적인 \ 없이 간단하게 표현 할수 있습니다.
다음과 같이 multi-line strings에서도 사용 가능합니다.
그렇다면 기존에 문자열 안에 원하는 프로퍼티 넣기 위해 사용하던 string interpolation(\(프로퍼티)) 는 어떻게 사용할수 있을까요?
Raw String 표현법에 기존 string interpolation 을 한번 사용해 보겠습니다
xcode 예시
let ex = "World"
let str = #"Hello \(World)"#
print(str) // Hello \(World)
이렇게 되면 \( ) 안에 World가 아닌 ex(문자열) 자체가 들어가게 됩니다.
그러므로 string interpolation를 사용하기 위해서는 기존 사용 방법인 \( )이 아닌 \#( ) 와 같이 표현해야 됩니다.
이렇게만 보더라도 Raw String을 사용하면 기존 방식보다 보기 간편하고, 더 이상 추가적인 " 혹은 \ 를 사용할 필요가 없습니다.
만약, Raw String안에 "# (문자열 끝 경게문자) 을 작성해야 되는 경우는 어떻게 할까요? 그런 경우에는 문자열 경계 문자를 #"…"# 가 아닌 ##"…"## 를 사용하면 됩니다. 그리고 "# (문자열 끝 경게문자) "## 로 끝나게 되면 string interpolation을 사용할때 \##( ) 로 사용해야 됩니다. (쉽게 생각해서 문자열 경계 문자에 사용된 # 의 개수 만큼 사용하면 됩니다.)

참고
https://jusung.github.io/RawString/
https://www.hackingwithswift.com/articles/162/how-to-use-raw-strings-in-swift
https://www.hackingwithswift.com/swift/5.0/raw-strings