🔥 문자열은 값 타입

379자
5분

Swift의 String 타입은 값 타입(value type)이에요. 새로운 String 값을 생성하면, 해당 String 값은 함수나 메서드로 전달되거나 상수 또는 변수에 할당될 때 복사됩니다. 각 경우에, 기존 String 값의 새로운 복사본이 생성되고, 원본 버전이 아닌 새 복사본이 전달되거나 할당돼요. 값 타입에 대한 설명은 Structures and Enumerations Are Value Types에서 확인할 수 있어요.

다음 예제 코드를 살펴봅시다.:

func printString(_ string: String) {
    print("Printing string: \(string)")
}
 
var originalString = "Hello, World!"
printString(originalString)
// Printing string: Hello, World!
 
originalString = "Modified String"
printString(originalString)
// Printing string: Modified String
swift

위 코드에서는 printString 함수를 정의하고 있어요. 이 함수는 String 타입의 매개변수를 받아 해당 문자열을 출력합니다.

  1. originalString 변수에 초기값으로 "Hello, World!" 문자열을 할당해요.
  2. printString 함수를 호출하면서 originalString을 전달하죠.
    • 이때, originalString의 값이 복사되어 printString 함수의 string 매개변수로 전달돼요.
    • 함수 내부에서는 전달받은 문자열을 출력하게 되네요.
  3. originalString의 값을 "Modified String"으로 변경합니다.
  4. 다시 printString 함수를 호출하면서 수정된 originalString을 전달해요.
    • 이번에도 마찬가지로, 수정된 문자열이 복사되어 함수로 전달됩니다.

이처럼 String이 값 타입이기 때문에, 함수나 메서드에 전달될 때마다 새로운 복사본이 생성돼요. 이는 함수 내부에서 문자열을 수정하더라도 원본 문자열에는 영향을 주지 않는다는 것을 의미하죠.

Swift의 기본적인 복사 방식(copy-by-default) String 동작은 함수나 메서드가 String 값을 전달할 때, 해당 String 값의 소유권을 가지게 됨을 명확히 해요. 이는 전달받은 문자열이 어디에서 왔는지와 상관없이 적용되는 규칙이랍니다. 따라서 우리는 전달받은 문자열이 직접 수정하지 않는 한 변경되지 않을 것이라고 확신할 수 있어요.

하지만 걱정 마세요! 실제로는 Swift 컴파일러가 문자열 사용을 최적화하여 실제 복사는 절대적으로 필요한 경우에만 발생합니다. 이는 값 타입으로 문자열을 다룰 때 항상 훌륭한 성능을 얻을 수 있다는 것을 의미하죠.

다음은 문자열 복사가 실제로 발생하는 경우를 보여주는 예제 코드예요:

var string1 = "Hello"
var string2 = string1
// string1과 string2는 같은 문자열을 참조해요.
 
string2 += ", World!"
// string2를 수정하면, 새로운 문자열이 생성되고 string2는 새로운 문자열을 참조합니다.
// string1은 여전히 원래의 "Hello" 문자열을 참조하고 있어요.
 
print(string1) // Hello
print(string2) // Hello, World!
swift

위 코드에서 string1string2는 초기에 같은 문자열을 참조하죠. 하지만 string2를 수정하는 순간 새로운 문자열이 생성되고, string2는 수정된 문자열을 참조하게 돼요. 반면에 string1은 여전히 원래의 문자열을 참조하고 있답니다.

이렇게 Swift의 String은 값 타입으로 동작하여 안전하고 예측 가능한 방식으로 문자열을 다룰 수 있게 해줘요. 함수나 메서드 간에 문자열을 전달할 때 복사가 발생하므로, 원본 문자열이 의도치 않게 변경될 걱정 없이 안심하고 사용할 수 있죠. 그러면서도 컴파일러의 최적화 덕분에 성능 저하 없이 값 타입의 이점을 누릴 수 있답니다!