sort 는 단어의 뜻 그대로 정렬해주는 메서드 입니다.
sort가 들어간 메서드는
"
sort()
sort(by: )
sorted()
sorted(by: )
"
이렇게 4개가 있습니다.
아래의 정수 배열과 문자열 배열을 예를 들어서 정리해 볼게요 :)
var nums: [Int] = [7, 6, 9, 2, 4, 5, 1, 8, 3]
var names: [String] = ["break", "fast", "car", "apple", "drive", "ensure", "gear"]
하나씩 사용해보면서 차이점을 알아봅시다!
.
.
.
.
.
항상 그렇듯 일단 apple documentation을 먼저 꼭 확인해봅시다.
sort()
sort는 Comparable을 만족하는 Element를 정렬하는 인스턴스 메서드 입니다.
sort() 는 기본적으로 오름차순(ascending order)으로 정렬합니다.
그래서 예시배열에 사용해보면
nums.sort() // [1, 2, 3, 4, 5, 6, 7, 8, 9]
names.sort() // ["apple", "break", "car", "drive", "ensure", "fast", "gear"]
print(nums) // [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(names) // ["apple", "break", "car", "drive", "ensure", "fast", "gear"]
다음과 같은 결과를 얻을 수 있습니다.
sort() 메서드를 사용한 결과와 nums, names 배열을 프린트한 결과가 같지요?
정의를 보면
"Sorts the collection in place."
라고 되어있습니다.
sort() 메서드는 이렇게 원본 배열의 값을 '제자리에서( in place )' 정렬하기 때문에
리턴값이 없습니다.
sort(by: )
sort(by: )는 sort() 와 같은데 by: 라는 인자가 생겼죠??
sort()는 무조건 오름차순으로 정렬을 해주기 때문에,
"우리가 원하는 방식을 정렬을 커스텀해주고 싶다!"
할때 이 메서드를 사용합니다.
apple documetation을 보면~
by: 인자 뒤에 적은 조건에 따라서 두 원소를 비교해서
sort() 메서드 처럼 제자리 정렬을 해주는 메서드 입니다.
예시 배열로 테스트를 해보면
nums.sort(by: >)
names.sort(by: <)
print(nums) // [9, 8, 7, 6, 5, 4, 3, 2, 1]
print(names) // "["apple", "break", "car", "drive", "ensure", "fast", "gear"]\n"
위와 같이 부등호를 통해 내림차순, 오름차순을 정렬할 수 있습니다.
혹은
by: 부분이 클로저 형태로 되어있기 때문에
names.sort { lhs, rhs in
lhs < rhs
}
print(names) // ["apple", "break", "car", "drive", "ensure", "fast", "gear"]
names.sort(by: <)
print(names) // ["apple", "break", "car", "drive", "ensure", "fast", "gear"]
위와 같이 클로저를 사용하여 비교 조건을 작성해도 똑같이 동작하는 것을 볼 수 있습니다.
(커스텀 정렬 조건의 경우는 클로저를 사용하면 작성하기 쉽겠죠?)
sorted()
sorted() 관련 공식문서를 보면
sort() 와 다르게 리턴값이 있는게 보이시나요?
이 차이점을 sort(), sorted() 를 둘 다 사용해서 확인해볼게요!
names.sorted()
print(names) // ["break", "fast", "car", "apple", "drive", "ensure", "gear"]
names.sort()
print(names) // ["apple", "break", "car", "drive", "ensure", "fast", "gear"]
보면 sorted()의 경우는
메서드를 사용했음에도 불구하고 names를 print했을 때 정렬되지 않았습니다.
sort()의 경우는
메서드를 사용했고 print를 했을 때 잘졍렬되어 있는 모습을 확인할 수 있습니다.
그 이유는
정의를 살펴보면 알 수 있습니다.
sort()는 리턴값이 없고 제자리 정렬을 하기 때문에 names라는 원본 배열의 값이 정렬이 되었고,
print를 했을 때 names가 정렬이 되어 있습니다.
하지만
sorted()는 원본 배열을 건들지 않고 정렬한 원소들의 sequence를 리턴하여주는 메서드 이기때문에
원본 배열을 그대로 존재합니다. (변동없음)
그래서 print를 했을 때 names가 정렬이 되지 않고 원본(정렬하기 전) 배열이 출력됩니다.
sorted()를 사용해서 원본 배열을 바꿔주고 싶다면
방법은 있습니다
names = names.sorted()
print(names) // ["apple", "break", "car", "drive", "ensure", "fast", "gear"]
처음에 names배열을 만들 때 '변수'로 선언해두었으니
names.sorted() 를 실행했을 때 정렬된 배열이 리턴값으로 나올 것이고,
그 리턴값을 names에 대입해주는 것입니다.
조금 번거롭죠??ㅎㅎ
지금쯤이면
왜 굳이 sort() 와 sorted() 가 따로 있는가??
하는 궁금증이 생길 같아요.
이유는 원본 배열을 유지해야 할 일이 있기 때문이에요.
쉽고 현실에서 겪을 만한 예로
학교에서 학생들이 강의를 들으러 강의실에 들어오는 경우를 봅시다.
"wang" "kim" "lee" "park" 이렇게 4명이 순서대로 들어왔다고 생각해봅시다.
그러면
var attendList: [String] = [] // 출석 순서 대로 추가할 배열
attendList.append("wang") // 1빠로 출석
attendList.append("kim") // 2빠로 출석
attendList.append("lee") // 3빠로 출석
attendList.append("park") // 4빠로 출석
다음과 같이 될겁니다.
근데
출석 체크를 위해 abc순서로 정렬을 할 필요가 있다고 가정하여 정렬을 합니다.
이때 sort()를 사용하면
attendList.sort()
print(attendList) // ["kim", "lee", "park", "wang"]
abc 순서로 정렬된 순서대로 불러 출석체크를 하는데 용이하겠죠?
하지만 누가 먼저 왔는지는 알 수 없게 되어버립니다.
왜냐면
강의실에 들어온 순서대로 append를 해서
원본 배열에서는 누가 먼저 들어왔는지 알 수 있었는데,
원본 배열을 정렬해서 바꿔버려서 알 수 없게 되었습니다.
그래서 들어온 순서도 유지하고, 출석부를 때는 정렬되어 부르기 용이하게 하고자 한다면
var sortedList = attendList.sorted()
print(attendList) // ["wang", "kim", "lee", "park"]
print(sortedList) // ["kim", "lee", "park", "wang"]
이렇게 sortedList 라는 배열을 하나 생성해서 sorted()의 리턴값을 대입해주면
원본 배열도 유지하면서 정렬된 값도 사용할 수 있습니다!
sorted(by: )
마지막으로 sorted(by:) 를 살펴보겠습니다.
sort() / sort(by:)
처럼
sorted() / sorted(by:)
도 똑같습니다.
sort(by:) 와 sorted(by:)의 차이점은 역시
리턴값의 유무 입니다!
sort(by:)는 위에서 말했지만
주어진 조건에 따라 제자리 정렬을 해서 원본 배열을 변형시키는 것이고,
sorted(by:)는 sort(by:)와 달리
리턴값을 던져주고 원본 배열은 건들지 않습니다.
코드로 작성해서 확인해보면
nums.sorted(by: >)
names.sorted(by: >)
print(nums) // [7, 6, 9, 2, 4, 5, 1, 8, 3]
print(names) // ["break", "fast", "car", "apple", "drive", "ensure", "gear"]
위와 같이 원본 배열에는 변화가 없는 것을 볼 수 있습니다.
마찬가지로 by뒤의 조건을 클로저로도 작성해보면
nums.sorted { lhs, rhs in
lhs > rhs
}
print(nums) // [7, 6, 9, 2, 4, 5, 1, 8, 3]
위와 같이 작성해볼 수 있습니다 :)
.
.
.
.
.
오늘은 오랜만에 swift 관련해서 정리해보았습니다!
저도 아무생각없이 메서드를 사용해오다가
오랜만에 정리를하면서 실습하다보니까
더 확실하게 개념정립이 된거같아요 :)
이 포스팅을 보시는 분들은
혹시라도 공부할 때 모르거나 헷갈리는 개념이 있다면
저처럼 누군가에게 설명하듯이 정리 해보거나
실제로 누군가에게 설명해보면
자신이 잘 모르는 부분이 어디인지 파악이 가능하고,
조금더 확실하게 머리속에 정리가 될거에요 추천드립니다 ☺️🙏🏻
또 빠른시일에...
부지런히 하나씩 내용정리를 해보겠습니다!
그럼 이만 돔황치겠습니다..
후다다닥
안뇽! 👋🏻
< 실습 코드 전문 >
import Foundation
var nums: [Int] = [7, 6, 9, 2, 4, 5, 1, 8, 3]
var names: [String] = ["break", "fast", "car", "apple", "drive", "ensure", "gear"]
/// - sort -
/// 오름차순 제자리 정렬
nums.sort()
names.sort()
print(nums)
print(names)
/// - sort(by:) -
/// by뒤의 조건에 따라 제자리 정렬. by 부분을 클로저의 형태로 조건 작성 가능
nums.sort(by: >)
names.sort(by: >)
// 클로저로 작성한 버전
nums.sort { lhs, rhs in
lhs > rhs
}
print(nums)
print(names)
/// - sorted() -
/// 오름차순으로 정렬한 sequence를 리턴 (원본은 건들지 않음)
nums.sorted()
names.sorted()
print(nums)
print(names)
/// - sorted(by:) -
/// by뒤에 조건에 따라 정렬하여 리턴(원본은 건들지 않음). by 부분을 클로저의 형태로 조건 작성 가능
nums.sorted(by: >)
names.sorted(by: >)
print(nums)
print(names)
// 클로저로 작성한 버전
nums.sorted { lhs, rhs in
lhs > rhs
}
print(nums)
// sort() vs sorted()
var attendList: [String] = [] // 출석 순서 대로 추가할 배열
attendList.append("wang") // 1빠로 출석
attendList.append("kim") // 2빠로 출석
attendList.append("lee") // 3빠로 출석
attendList.append("park") // 4빠로 출석
//attendList.sort()
//print(attendList)
var sortedList = attendList.sorted()
print(attendList)
print(sortedList)
참고 자료
틀린부분이 있거나, 더 좋은 방법이 있다면 댓글로 남겨주세요!
🌈댓글은 언제나 환영입니다🙏🏻
'Swift' 카테고리의 다른 글
문자열에서 특정문자"들"을 원하는 문자로 치환하는 방법 - Swift (0) | 2021.10.23 |
---|---|
최대공약수, 최대공배수 구하는 함수 - swift (0) | 2021.09.30 |
클래스, 인스턴스, 객체가 도대체 뭡니까. - swift (0) | 2021.08.20 |
소수점 제거 (올림 / 버림 / 반올림 ) 관련 함수 - swift (0) | 2021.07.22 |
주어진 문자열이 문자로만 이루어져 있는지 체크하는 함수 만들기 - swift (2) | 2021.07.22 |