🔥 문자열 비교하기

572자
6분

Swift에서는 문자열과 문자의 동등성을 비교하는 세 가지 방법을 제공해요. 문자열과 문자의 동등성, 접두사 동등성, 접미사 동등성이 있죠.

문자열과 문자의 동등성

문자열과 문자의 동등성은 "같음" 연산자(==)와 "같지 않음" 연산자(!=)를 사용하여 확인할 수 있어요. 아래 예제를 볼까요?

let quotation = "We're a lot alike, you and I."
let sameQuotation = "We're a lot alike, you and I."
if quotation == sameQuotation {
    print("These two strings are considered equal")
}
// "These two strings are considered equal"이 출력돼요.
swift

두 개의 String 값(또는 두 개의 Character 값)은 확장 자소 클러스터가 '표준적으로 동등한(canonically equivalent)' 경우에 같은 것으로 간주됩니다. 확장 자소 클러스터는 Unicode 스칼라 값이 서로 다르더라도, 언어적 의미와 모양이 같으면 '표준적으로 동등'합니다.

참고

"표준적으로 동등하다(canonically equivalent)"는 것은 Unicode 표준에서 정의한 동등성을 의미합니다. 예를 들어, "é"라는 문자는 "e" 다음에 악센트 기호인 "◌́"를 결합한 것과 동일한 문자로 표현할 수 있습니다. 이 두 표현 방식은 Unicode 스칼라 값은 다르지만, 언어적 의미와 모양이 같기 때문에 Unicode 표준에 따라 '표준적으로 동등'한 것으로 간주됩니다.

예를 들어, LATIN SMALL LETTER E WITH ACUTE(U+00E9)는 LATIN SMALL LETTER E(U+0065)와 COMBINING ACUTE ACCENT(U+0301)의 조합과 canonically equivalent해요. 이 두 가지 확장 자소 클러스터는 문자 é를 나타내는 유효한 방법이므로 canonically equivalent한 것으로 간주돼요.

// "Voulez-vous un café?"에서 LATIN SMALL LETTER E WITH ACUTE 사용
let eAcuteQuestion = "Voulez-vous un caf\\u{E9}?"
 
// "Voulez-vous un café?"에서 LATIN SMALL LETTER E와 COMBINING ACUTE ACCENT 사용
let combinedEAcuteQuestion = "Voulez-vous un caf\\u{65}\\u{301}?"
 
if eAcuteQuestion == combinedEAcuteQuestion {
    print("These two strings are considered equal")
}
// "These two strings are considered equal"이 출력돼요.
swift

반대로 영어에서 사용되는 LATIN CAPITAL LETTER A(U+0041 또는 "A")는 러시아어에서 사용되는 CYRILLIC CAPITAL LETTER A(U+0410 또는 "А")와 동등하지 않아요. 이 문자들은 시각적으로 유사하지만 언어적 의미가 같지는 않죠.

let latinCapitalLetterA: Character = "\\u{41}"
let cyrillicCapitalLetterA: Character = "\\u{0410}"
 
if latinCapitalLetterA != cyrillicCapitalLetterA {
    print("These two characters aren't equivalent.")
}
// "These two characters aren't equivalent."가 출력돼요
swift

접두사와 접미사 동등성

문자열에 특정 문자열 접두사나 접미사가 있는지 확인하려면 문자열의 hasPrefix(_:)hasSuffix(_:) 메서드를 호출하면 돼요. 이 메서드들은 String 타입의 단일 인자를 받고 Boolean 값을 반환하죠.

아래 예제는 셰익스피어의 로미오와 줄리엣 1막과 2막의 장면 위치를 나타내는 문자열 배열을 고려해요.

let romeoAndJuliet = [
    "Act 1 Scene 1: Verona, A public place",
    "Act 1 Scene 2: Capulet's mansion",
    "Act 1 Scene 3: A room in Capulet's mansion",
    "Act 1 Scene 4: A street outside Capulet's mansion",
    "Act 1 Scene 5: The Great Hall in Capulet's mansion",
    "Act 2 Scene 1: Outside Capulet's mansion",
    "Act 2 Scene 2: Capulet's orchard",
    "Act 2 Scene 3: Outside Friar Lawrence's cell",
    "Act 2 Scene 4: A street in Verona",
    "Act 2 Scene 5: Capulet's mansion",
    "Act 2 Scene 6: Friar Lawrence's cell"
]
 
swift

hasPrefix(_:) 메서드를 romeoAndJuliet 배열과 함께 사용하여 1막의 장면 수를 셀 수 있어요.

var act1SceneCount = 0
for scene in romeoAndJuliet {
    if scene.hasPrefix("Act 1 ") {
        act1SceneCount += 1
    }
}
print("There are \(act1SceneCount) scenes in Act 1")
// "There are 5 scenes in Act 1"이 출력돼요.
swift

비슷하게 hasSuffix(_:) 메서드를 사용하면 Capulet의 저택과 Friar Lawrence의 방에서 일어나는 장면의 수를 셀 수 있죠.

var mansionCount = 0
var cellCount = 0
for scene in romeoAndJuliet {
    if scene.hasSuffix("Capulet's mansion") {
        mansionCount += 1
    } else if scene.hasSuffix("Friar Lawrence's cell") {
        cellCount += 1
    }
}
print("\(mansionCount) mansion scenes; \(cellCount) cell scenes")
// "6 mansion scenes; 2 cell scenes"이 출력돼요.
swift

이렇게 Swift는 문자열과 문자의 동등성을 비교하는 강력하고 유연한 방법을 제공하네요. 문자열 비교는 Swift 프로그래밍에서 매우 일반적인 작업이므로, 이러한 기능들을 잘 이해하는 것이 중요해요.