[swift] 문자열과 문자 -1 (Strings and Characters)

Swift 2015. 8. 1. 21:45

프래그램밍에서 기본은 문자열 다루기! Swift에서는 문자열과 문자를 어떻게 다룰까요?

  • 문자열은 "hello" 같은 문자들의 순서집합

  • Swift 문자열은 String 타입으로 표현되며, String 타입은 Character타입 값들의 집합으로 표현됨.

  • String과 Character 타입은 코드에서 텍스트를 다룰 때 빠르고 유니코드 호환되는 방식을 제공.

  • 문자열 생성과 조작 문법은 간단하고 가독성이 좋으며, C와 유사한 문자열 리터럴 문법을 가짐.

  • + 연산자를 사용하여 두 문자열을 쉽게 연결가능.

  • 문자열의 변경가능 유무는 Swift의 다른 값들처럼 var,let 에 따라 관리.

  • 문법이 단순함에 더해 Swift의 문자열 타입은 빠르고 현대적은 구현을 갖음.

  • 모든 문자열은 인코딩에 독립적인 유니코드 문자로 구성.

  • 다양한 유니코드 표현방식으로 문자들 접근을 지원.

  • 문자열 보간을 사용하여 문자열에 상수, 변수, 리터럴, 표현식 삽입가능.


1. 문자열 리터럴

문자열 리터럴은 쌍따옴표 쌍으로 감싸진 고정된 순서의 문자들입니다. 상수나 변수에 초기값으로 문자열 리터럴을 사용할수 있습니다.

let someString = "Some string literal value"  

Swift는 someString 상수가 문자열 리터럴로 초기화 되었기 때문에 String 타입임을 추론합니다.


2. 빈 문자열 생성

var emptyString = ""              // 문자열 리터럴 사용
var anotherEmptyString = String() // 문자열 생성자 사용 
// 두 문자열은 비어있으면 두 표현은 동일함 

isEmpty 속성을 사용해서 String 값이 비어있는지 검사할 수 있습니다.

if emptyString.isEmpty {
    print("Nothing to see here")    
}  


3. 문자열의 수정가능 유무(Mutability)

문자열을 변수(var) 또는 상수(let)에 할당하느냐에 따라 String의 수정가능 유무를 가리킬수 있습니다.

var variableString = "Horse"
variableString += " and carriage"
// variableString은 "Horse and carriage"

let constantString = "Highlander"
costantString += " and another Highlander"
// 문자열 상수는 변경할수 없다는 컴파일 에러가 발생

문자열의 수정가능 유무를 NSString 클래스와 NSMutableString 클래스로 결정하는 Objective-C 와는 접근방식이 다릅니다.


4. 문자열은 Value타입!

Swift의 String타입은 value타입입니다. 새 문자열을 생성하면 문자열은 함수나 메소드에 전달되거나, 변수 또는 상수에 할당될 때마다 복사됩니다. 각 경우에 기존 문자열의 복사본이 생성되고 이 복사본이 전달되거나 할당됩니다.

Swift의 이런 특성(copy-by-default)은 함수나 메소드가 문자열을 전달받으면 어디에서 왔는지에 상관없이 완전히 문자열을 소유한다는 것을 보장해줍니다. 즉 스스로 문자열을 변경하지 않으면 전달받은 문자열은 결코 수정되지 않을 것이라 확실할 수 있습니다.

사실 Swift 컴파일러가 반드시 필요한 경우에만 복사가 일어나도록 문자열 사용을 최적화합니다. value 타입으로 문자열을 사용하면 항상 좋은 성능을 얻을 수 있습니다.


5. 문자 다루기

for-in 루프에서 character 속성을 사용해서 문자열의 개별 문자들에 접근할 수 있습니다.

for character in "Dog!".character {
    print(character)
}
// D
// o
// g
// !

한문자만을 갖는 문자열 리터럴을 사용해서 Character 상수를 생성할수 있습니다.

let exclamationMar:Character = "!"  

문자열은 Character의 배열을 생성자의 인자로 전달하여 생성할 수도 있습니다.

let catCharacters:[Character] = ["C", "a", "t", "!"]
let catString = String(catCharacters)
print(catString)
// Cat!


6. 문자열과 문자 접합

  • 연산자를 사용하여 두 문자열을 접합한 새로운 문자열을 생성할 수 있습니다.
let string1 = "hello"
let string2 = " there"
var welcome = string1 + string2
// welcome은 "hello there"

문자열 변수에 += 연산자를 사용하여 문자열을 추가할 수도 있습니다.

var instruction = "look over"  
instruction += string2
// instruction은 "look over there"

문자열 변수에 append() 메소드를 사용하여 문자를 추가할 수 있습니다.

let exclamationMark:Character = "!"  
welcome.append(exclamationMark)
// welcome은 "hello there!"

Character 변수는 하나의 문자만 포함하기 때문에 다른 문자열이나 문자를 추가할 수 없습니다.


7. 문자열 보간(Interpolation)

문자열 보간은 문자열 리터럴 안에 상수, 변수, 리터럴, 표현식을 혼합하여 새로운 문자열을 생성하는 방식입니다. 각 항목은 백슬러시와 소괄호 안에 감싸여진 문자열 리터럴에 삽입됩니다.

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

위 예에서 multipiler값은 문자열 리터럴 (multiplier)에 삽입됩니다. 새 문자열을 생성하기 위해 문자열 보간이 평가될때 placeholder는 multiplier의 실제값으로 대치됩니다.
표현식 Double(multiplier) * 2.5는 계산된 결과 7.5가 문자열에 삽입됩니다.