제네릭 비교
Coddy C 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 61개 중 52번째.
C 표준 라이브러리의 qsort 및 bsearch와 같은 제네릭 함수는 요소의 타입을 알지 못해도 요소를 비교할 수 있는 방법이 필요합니다. 그 해결책은 비교 함수입니다. 이는 제네릭 알고리즘이 두 항목을 비교해야 할 때마다 호출하는, 사용자가 직접 작성하는 함수입니다.
비교 함수의 표준 시그니처는 다음과 같습니다:
int compare(const void* a, const void* b);두 매개변수는 모두 const void*입니다. 제네릭 함수가 정렬하려는 타입을 알지 못하기 때문입니다. 반환 값은 특정 규칙을 따릅니다:
| 반환 값 | 의미 |
|---|---|
| 음수 | a가 b보다 앞에 옵니다 |
| 0 | a와 b가 같습니다 |
| 양수 | a가 b보다 뒤에 옵니다 |
비교 함수 내부에서 void* 포인터를 실제 타입으로 형변환(cast)하고 값을 비교합니다. 정수를 비교하는 방법은 다음과 같습니다:
int compare_ints(const void* a, const void* b) {
int val_a = *(const int*)a;
int val_b = *(const int*)b;
return val_a - val_b;
}뺄셈 트릭은 정수에서 잘 작동합니다: a가 더 작으면 결과는 음수이고, 같으면 0이며, 더 크면 양수입니다. 이제 이 함수를 qsort에 전달하여 정수 배열을 오름차순으로 정렬할 수 있습니다.
챌린지
쉬움qsort와 같은 제네릭 알고리즘에서 사용하는 표준 비교 함수 규칙에 따라 두 정수를 비교하는 compare_ints 함수를 작성하세요.
함수는 두 값을 비교하고 그들의 순서 관계를 나타내는 결과를 반환해야 합니다.
반환 값 규칙:
- 첫 번째 정수가 두 번째 정수보다 앞에 오면 (첫 번째 < 두 번째) 음수를 반환합니다.
- 두 정수가 같으면 0을 반환합니다.
- 첫 번째 정수가 두 번째 정수보다 뒤에 오면 (첫 번째 > 두 번째) 양수를 반환합니다.
매개변수:
a(int): 비교할 첫 번째 정수b(int): 비교할 두 번째 정수
반환값: 순서를 나타내는 정수: a < b이면 음수, a == b이면 0, a > b이면 양수.
힌트: 강의에서 배운 뺄셈 트릭을 사용하면 우아한 한 줄 솔루션을 만들 수 있습니다.
치트 시트
비교 함수는 qsort 및 bsearch와 같은 제네릭 알고리즘이 요소의 타입을 알지 못해도 요소를 비교할 수 있게 해줍니다.
비교 함수의 표준 시그니처는 다음과 같습니다:
int compare(const void* a, const void* b);제네릭 함수는 정렬되는 타입을 알지 못하기 때문에 매개변수는 const void*입니다.
반환 값 규칙:
| 반환 값 | 의미 |
|---|---|
| 음수 | a가 b보다 앞에 옴 |
| 0 | a와 b가 같음 |
| 양수 | a가 b보다 뒤에 옴 |
비교 함수 내부에서 void* 포인터를 실제 타입으로 캐스팅하고 값을 비교합니다:
int compare_ints(const void* a, const void* b) {
int val_a = *(const int*)a;
int val_b = *(const int*)b;
return val_a - val_b;
}뺄셈 방식은 정수에서 유효합니다: a가 더 작으면 결과는 음수이고, 같으면 0이며, 더 크면 양수입니다.
직접 해보기
int compare_ints(int a, int b) {
// 여기에 코드를 작성하세요
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.