본문 바로가기
스파르타코딩 클럽/기초

Swift | Swift에서 한글을 정렬하는 방법(+ sort, sorted)

by UDDT 2025. 4. 23.

추억의 정렬.....

 한글 비교하기

 

    먼저 한글을 정렬하기 위해서는 다음의 원리를 이해하고 있어야 한다.

   아래의 코드를 보자.

let str1 = "가"
let str2 = "나"

let result = str1 < str2
print(result)

    위 코드는 이상해보이지만, 빌드가 되고 결과도 true로 잘 나온다.

 

   

 

   아니 도대체 컴퓨터는 뭘 기준으로 '가'와 '나'를 비교해서 '가'가 더 작다고 한걸까?

   (멍청한 줄 알았는데 똑똑한 너....)

 

 Swift의 String 체계

    이를 이해하려면, Swift가 String을 어떻게 사용하고 있는지 알아야 한다.

   Swift는 유니코드(Unicode)를 사용하고 있다.

   유니코드란? 전 세계의 모든 문자를 다루도록 설계된 정보 교환 표준 부호이다

 

    애플 공식 문서에 따르면, Swift의 기본 String Type은 유니코드 스칼라 값(Unicode scalar values)로부터 생성된다.

   'a'의 경우 U+0061 또는 '🐥' 의 경우 U+1F425와 같은 유니크한 21-bit 숫자이다.

   * 모든 21-bit 유니코드 스칼라 값이 한 문자에 할당되는 것은 아니다   

 

한글 유니코드 예시

 

  위에서 볼 수 있듯 '가'는 U+AC00이고, 

 U+AC01인 '각'보다 작다.

 

   따라서 앞서 보았던,

let str1 = "가"
let str2 = "나"

let result = str1 < str2
print(result)
// true

   위의 코드와 같은 형태의 수식이 가능했던 것이다.

 

   이걸 응용하면, str1이 str2보다 클 때 값을 바꿔주는 코드도 작성해볼 수 있다.

var str1 = "나"
var str2 = "가"

let result = str1 > str2
print(result)


if result == true {
    swap(&str1, &str2)
}

print(str1, str2)

    '나'의 유니코드가 U+B098 이고, '가'의 유니코드는 U+AC00이다.

  따라서 '나'의 유니코드가 더 크기 때문에 str1과 str2의 값을 바꿔줄 수 있는 것이다.

 

    이제 단순 값 비교를 넘어, 배열 안에서 정렬하는 함수에 대해서도 알아보자

 sort()와 sorted()의 차이

var array = ["너구리", "강아지", "표범", "사자"]
array.sort()
print(array)
// ["강아지", "너구리", "사자", "표범"]

var array1 = ["너구리", "강아지", "표범", "사자"]
array.sorted()
print(array)
// ["강아지", "너구리", "사자", "표범"]

    이 두개의 코드를 실행시킨 결과는 같다.

   '아 ~ 같은 코드구나' 하고 생각할 수 있지만, 작동하는 방식은 다르다.

 

  

sort() : return Type이 없이 원본의 값을 바꿈
sorted() : return Type이 있어, 해당 값을 저장할 수 있음

   만약 원본을 바로 수정해서 쓸 것이 아니라면(값을 별도로 저장해서 쓴다면), sorted()를 사용해야 한다.

 

 sort()

  https://developer.apple.com/documentation/swift/array/sort()

 

sort() | Apple Developer Documentation

Sorts the collection in place.

developer.apple.com

var students = ["Kofi", "Abena", "Peter", "Kweku", "Akosua"]
students.sort()
print(students)
// Prints "["Abena", "Akosua", "Kofi", "Kweku", "Peter"]"

   sort()는 배열을 정렬해주는 함수로

  예시에서처럼 유니코드를 기준으로 정렬해준다.

  단 여기서 주의할 점은, sort()는 students를 바꿔준다는 것.

  즉 원본 값 자체를 변경하는 함수다.

 

   따라서 sort()는 mutable한 값(변수)에서만 사용할 수 있다.

  계속 말한 것처럼, sort()는 return Type이 없기 때문에

  sort()한 값을 변수나 상수에 담아주려고 하면 다음과 같은 에러 메시지를 확인할 수 있다.

 

 sort(by: )

 

  모양 자체는 무시무시하게 생겼지만, 이해 자체는 어렵지 않다.

var array = ["너구리", "강아지", "표범", "사자"]
array.sort(by: <)
print(array)
// ["강아지", "너구리", "사자", "표범"]

array.sort(by: >)
print(array)
// ["표범", "사자", "너구리", "강아지"]

    요소들을 비교해서 내림차순으로 정렬하거나 오름차순으로 정렬하도록 할 수 있고,

by를 추가하면 나오는 코드에 enter 키를 눌러 traling Closure로도 작성할 수 있다.

var array = ["너구리", "강아지", "표범", "사자"]
array.sort { name1, name2 in
    return name1 < name2
}
print(array)
// ["강아지", "너구리", "사자", "표범"]

   다음과 같이 클로저로도 작성할 수 있다

 

   그러면 여기서 이런 질문이 나올 수 있다.

 

  아니, 나는 name1하고 name2만 지정해줬는데
  어떻게 모든 이름을 다 비교하지?

 

     name1, name2는 클로저에서 쓰이는 파라미터이다.

   여기서 '파라미터'라는게 핵심인데,

   name1의 값이 '너구리' / name2의 값이 ' 강아지'로 고정된 것이 아니라

   클로저를 실행할 때 name1에 배열의 값이 하나씩 순회하면서 들어가는 개념이다.

 

{ name1, name2 in
    return name1 < name2
}

   따라서 이 부분은, 너구리 < 강아지가 될 수도 있고

  너구리 < 표범이 될 수도 있는 것으로

  내부적인 정렬 알고리즘이 알아서 name1과 name2에 값을 담아준다.

 

 sorted()

  https://developer.apple.com/documentation/swift/array/sorted()

 

sorted() | Apple Developer Documentation

Returns the elements of the sequence, sorted.

developer.apple.com

 

 

  앞서 말했듯, sorted는 Return값이 있기 때문에 let으로 선언된 배열도 저장할 수 있다.

let array = ["너구리", "강아지", "표범", "사자"]
array.sort()
print(array)

   let으로 된 배열은 sort()로 죽었다 깨어나도 변경할 수 없다.

  이럴 때, sorted()를 사용하면 된다.

 

let array1 = ["너구리", "강아지", "표범", "사자"]
let result = array1.sorted()
print(result)
// ["강아지", "너구리", "사자", "표범"]

   sorted()를 사용하면 let으로 선언된 배열을 정렬하고, 정렬된 값을 return하여

  변수나 상수에 담아줄 수 있다.

  이렇게 하면 원본을 바꾸지 못하더라도 원본에서 파생된 데이터를 저장할 수 있다.

 

 sorted(by: )

   sort에서와 마찬가지로, sorted에서도 (by: ) 를 사용할 수 있다.

  그리고 이 또한 return Type이 있다.

let array1 = ["너구리", "강아지", "표범", "사자"]
let result = array1.sorted(by: >)
print(result)
// ["표범", "사자", "너구리", "강아지"]

 

 결론

    원본을 바꿔서 바로 사용한다면 sort()

   원본을 바꾸지 못하는 상황에서, 값을 어딘가에 담아줘야 한다면 sorted() 를 사용하자!

최근댓글

최근글

skin by © 2024 ttuttak