
⎮ 한글 비교하기
먼저 한글을 정렬하기 위해서는 다음의 원리를 이해하고 있어야 한다.
아래의 코드를 보자.
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)
// ["표범", "사자", "너구리", "강아지"]
요소들을 비교해서 내림차순으로 정렬하거나 오름차순으로 정렬하도록 할 수 있고,


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() 를 사용하자!
'스파르타코딩 클럽 > 기초' 카테고리의 다른 글
| Swift | KingFisher(feat. 이미지 캐싱) (0) | 2025.05.17 |
|---|---|
| Swift | CocoaPods 설치하기 (0) | 2025.04.26 |
| Swift | do, catch, try 이해하기(feat. Result Type) (0) | 2025.04.20 |
| Swift | 네트워크 쉽게 이해하기(with URLSession) (0) | 2025.04.17 |
| Swift | 클로저(Closure) 쉽게 이해하기? (2) | 2025.04.05 |