본문 바로가기

iOS

[iOS] [Swift] The Swift Language Guide - 2. 문자열과 문자(String and Characters)

문자열과 문자 (Strings and Characters)



Swift의 StringFoundation 프레임워크의 NSString 이 bridge 된 타입이기 때문에 NSString의 메소드를 String 에서 또한 사용이 가능합니다.



여러줄 문자열 리터럴


Swift에서 여러줄로 구성된 문자열을 사용하고 싶은 경우 큰 따옴표 3개(""")로 묶어서 표현할 수 있습니다.

let quotation = """
The white Rabbit put on his spectacles. "Where shall I begin,
Please your Majesty?" he asked.

"Begin at the beginning," the king said gravely, "and go on
till yo ucome to the end; then stop."
"""

 

여러줄로 구성된 문자열을 사용할 때는 첫 시작의 """ 다음 줄 부터 마지막 """의 직전까지를 문자열로 봅니다.

따라서 아래 두 줄의 표현으로 이루어진 singleLineStringmultiLineString은 동일한 값을 갖게 됩니다.

 

let singleLineString = "These are the same."
let multiLineString = """These are the same."""

 

여러줄로 구성된 문자열을 사용하며 줄바꿈을 하고 싶을때에는 백슬래쉬() 를 사용합니다.

let softWrappedQuotation = """
The White Rabbit put on his spectables. "Where shall I begin, \
please your Majesty?" he asked.

"Begin at the beginning," the King said gravely, "and go on \
till you come to the end; then stop."
"""



빈 문자열 초기화


 

아래 예의 두 변수의 문자열은 동일한 값을 갖습니다.

var emptyString = ""
var anotherEmptyString = String()



값 타입 문자열


Swift의 String 은 값 타입(Value type) 입니다.

따라서 String 이 다른 함수 혹은 메소드로 부터 생성이 되어 String 값이 할당 될떄, 이전 String 의 레퍼런스를 할당하는 것이 아니라 값을 복사하여 생성하게 됩니다.

즉 다른 메소드에서 할당 받은 문자열은 그 문자열을 수정해도 원본 문자열에 영향이 가지 않습니다.



문자열 삽입


 

백슬래쉬 괄호를 이용해 상수, 변수, 리터럴 값을 문자열에 추가할 수 있습니다.

let multiplier = 3
let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)"

// message: "3 times 2.5 is 7.5"



부분 문자열


문자열을 구성하는 부분 문자를 얻기 위해 prefix(_:) 와 같은 서브스크립트 메소드를 이용할 수 있습니다.

이를 통해 얻은 부분 문자열은 문자열(String) 인스턴스가 아닌 부분 문자열(SubString)의 인스턴스 입니다.

만일 부분 문자열을 단기간에 사용하는 것이 아니라 오랜 기간 사용한다면 이를 문자열 인스턴스로 변경하여 사용하는것이 좋습니다.

let greeting = "Hello, World!"
let index = greeting.index(of: ",") ?? greeting.endIndex
let beginning = greeting[..<index]
// beginning: Hello

// SubString 타입인 beginning을 String으로 변환
let newString = String(beginning)

위와 같이 사용하는 것을 권고하는 이유는 메모리 관리 때문입니다.

SubString 은 해당 문자를 직접 가지고 있는 것이 아니라 원본 String의 메모리를 참조하여 사용합니다.

따라서 SubString을 계속 사용하게 되면 원본 String이 계속하여 메모리에 잔재하게 됩니다.

즉, 실제로 이용하는 SubString을 제외한 나머지 String들 또한 계속하여 남아있게 되는 것 입니다.

따라서 SubString을 오랫동안 사용하고자 한다면 위 예제처럼 String 인스턴스로 만들어 사용하는 것이 메모리 관리 효율면에서 좋다고 할 수 있습니다.