Objective-C에서 NSArray 정렬하는 여러가지 방법
개발/iOS1 2025. 11. 20. 07:57
Objective-C에서 정렬하는 방법 정리
Objective-C에서 배열을 정렬해야 하는 일은 아주 흔합니다.
문자열, 숫자 정렬부터 커스텀 객체 정렬까지, 여러 상황에서 필요한 정렬 방식을 각각 정리해보려고 합니다.
전체적으로 기본 정렬 방식 → SortDescriptor → Comparator → Function 기반 정렬까지 순서대로 구성했습니다.
1. NSArray / NSMutableArray 기본 정렬
가장 단순한 정렬 방식은 compare:를 활용하는 방법입니다. 문자열이나 NSNumber처럼 Apple이 기본적으로 비교 메소드를 제공하는 객체라면 이 방법이 가장 간단합니다.
1-1. 문자열 배열 정렬 (오름차순)
NSArray *names = @[@"kim", @"park", @"choi"];
NSArray *sortedNames = [names sortedArrayUsingSelector:@selector(compare:)];
1-2. 숫자 배열 정렬
NSArray *numbers = @[@5, @1, @3];
NSArray *sortedNumbers = [numbers sortedArrayUsingSelector:@selector(compare:)];
1-3. NSMutableArray 즉시 정렬
NSMutableArray *list = [@[@"b", @"a", @"c"] mutableCopy];
[list sortUsingSelector:@selector(compare:)];
2. NSSortDescriptor로 정렬하기 (객체 배열 정렬)
딕셔너리 배열, 모델 객체 배열을 정렬할 때 가장 많이 사용하는 방식이 NSSortDescriptor입니다.
2-1. 특정 key 기준 정렬
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"age"
ascending:YES];
NSArray *sortedUsers = [users sortedArrayUsingDescriptors:@[sort]];
2-2. 여러 기준을 순차적으로 적용하기
NSArray *sorted = [users sortedArrayUsingDescriptors:@[
sortAge, sortName
]];
3. Comparator(블록) 기반 정렬
정렬 조건이 복잡하거나, 두 값 비교 로직을 직접 구현해야 할 때 comparator 방식이 더 유연합니다.
3-1. 문자열 길이 기준으로 정렬
NSArray *sorted = [list sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
NSInteger lenA = [a length];
NSInteger lenB = [b length];
if (lenA < lenB) return NSOrderedAscending;
if (lenA > lenB) return NSOrderedDescending;
return NSOrderedSame;
}];
4. Custom Class 정렬
Custom Class에서도 프로퍼티 기반으로 쉽게 정렬할 수 있습니다.
NSArray *sorted = [userList sortedArrayUsingComparator:^NSComparisonResult(User *a, User *b) {
return [a.age compare:b.age];
}];
5. 대소문자 무시 정렬 (Case-Insensitive)
NSArray *sorted = [names sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
return [a compare:b options:NSCaseInsensitiveSearch];
}];
6. sortedArrayUsingFunction 사용하기 (C 함수 기반 정렬)
Objective-C에서 비교적 잘 알려져 있지는 않지만, sortedArrayUsingFunction을 사용하면 정렬 로직을 별도의 C 스타일 함수로 분리해서 사용할 수 있습니다.
정렬 함수가 복잡하거나, 여러 곳에서 재사용하고 싶을 때 꽤 유용합니다.
6-1. 기본 사용 형태
NSArray *sortedArrayUsingFunction:(NSInteger (*)(id, id, void *))comparator
context:(void *)context;
- comparator : 두 값을 비교하는 C 함수 포인터
- context : 비교에 참고할 추가 정보 (필요 없는 경우 NULL)
6-2. 예제: 문자열 길이 비교 함수로 정렬하기
먼저 비교 함수를 따로 만들어둡니다.
NSInteger compareLength(id a, id b, void *context) {
NSUInteger lenA = [a length];
NSUInteger lenB = [b length];
if (lenA < lenB) return NSOrderedAscending;
if (lenA > lenB) return NSOrderedDescending;
return NSOrderedSame;
}
이제 배열에 적용합니다.
NSArray *list = @[@"abcd", @"a", @"abc"];
NSArray *sorted = [list sortedArrayUsingFunction:compareLength
context:NULL];
6-3. context 활용 예시
context에 외부 옵션을 넣어 비교 기준을 다르게 만들 수도 있습니다.
typedef struct {
BOOL ascending;
} SortOption;
NSInteger compareNumber(id a, id b, void *context) {
SortOption *opt = (SortOption *)context;
NSComparisonResult result = [a compare:b];
return opt->ascending ? result : -result;
}
사용 예:
SortOption option = { .ascending = NO };
NSArray *sorted = [numbers sortedArrayUsingFunction:compareNumber
context:&option];
정렬 함수를 따로 관리할 수 있어, 프로젝트 전체에서 재사용하기 편해지는 장점이 있습니다.
정리하자면..
Objective-C의 정렬 방식은 단순한 정렬부터 복잡한 비교 함수까지 다양하게 준비되어 있습니다.
일반적인 문자열·숫자 정렬은 selector로 충분하고, 모델 배열은 SortDescriptor 또는 comparator 블록이 가장 효율적입니다.
만약 정렬 로직을 재사용해야 하거나 구조적으로 분리하고 싶다면 sortedArrayUsingFunction 방식도 좋은 선택이 될 수 있습니다.




