1. float로 구성된 Array에서 max, min 값 찾기 구현 방법 3가지
a. for 루프를 사용한 방법
NSArray *floatArray = @[@(1.0f), @(2.5f), @(3.7f), @(0.8f), @(5.4f)];
float minFloat = FLT_MAX;
float maxFloat = FLT_MIN;
for (NSNumber *number in floatArray) {
float floatValue = [number floatValue];
if (floatValue < minFloat) {
minFloat = floatValue;
}
if (floatValue > maxFloat) {
maxFloat = floatValue;
}
}
NSLog(@"최소값: %f", minFloat);
NSLog(@"최대값: %f", maxFloat);
b. KVC(Key-value coding)를 사용한 방법
NSArray *floatArray = @[@(1.0f), @(2.5f), @(3.7f), @(0.8f), @(5.4f)];
NSNumber *minNumber = [floatArray valueForKeyPath: @"@min.self"];
NSNumber *maxNumber = [floatArray valueForKeyPath: @"@max.self"];
float minFloat = [minNumber floatValue];
float maxFloat = [maxNumber floatValue];
NSLog(@"최소값: %f", minFloat);
NSLog(@"최대값: %f", maxFloat);
c. 블록 기반 루프(NSEnumerateObjectsUsingBlock)를 사용한 방법
NSArray *floatArray = @[@(1.0f), @(2.5f), @(3.7f), @(0.8f), @(5.4f)];
__block float minFloat = FLT_MAX;
__block float maxFloat = FLT_MIN;
[floatArray enumerateObjectsUsingBlock:^(NSNumber *number, NSUInteger index, BOOL *stop) {
float floatValue = [number floatValue];
if (floatValue < minFloat) {
minFloat = floatValue;
}
if (floatValue > maxFloat) {
maxFloat = floatValue;
}
}];
NSLog(@"최소값: %f", minFloat);
NSLog(@"최대값: %f", maxFloat);
2. max, min 값 찾기 실습 관련 설명
배열의 크기가 클 때, KVC(Key-Value Coding)를 사용하는 것이 더욱 효율적입니다. 이유는 다음과 같습니다.
내부 최적화된 메소드 사용: KVC는 내부적으로 최적화된 메소드를 사용해 최대값이나 최소값을 찾습니다. 이를 통해 더 효율적으로 배열을 처리할 수 있습니다.
가독성과 유지 보수성: KVC를 사용하면 코드가 간결해지고 가독성이 높아지기 때문에 유지 보수성이 향상됩니다. 특히, 복잡한 연산이 필요한 경우에는 KVC가 더 효율적으로 코드를 관리할 수 있습니다.
Muti-thread 환경에서의 안정성: 배열의 크기가 클 경우 for 루프를 사용하여 순차적으로 처리할 경우, 멀티스레드 환경에서 이를 적용하기 어려울 때가 있습니다. 하지만, KVC(Key-Value Coding)는 내부적으로 최적화된 메소드를 이용해 병렬처리(multi-thread)가 가능합니다. 이를 통해 속도의 개선과 동시성 문제를 해결할 수 있습니다.
따라서, 배열의 크기가 클 때는 KVC를 사용하는 것이 보편적으로 성능 및 유지보수性면에서 더 좋은 선택입니다. 그러나 매우 작은 배열일 경우 둘의 차이는 크지 않을 수 있으므로 해당 프로젝트와 상황에 맞게 선택하는 것이 중요합니다.
하지만, 위 사례를 참조해 작은 배열을 사용하는 경우에도 KVC(Key-Value Coding)를 더 추천합니다.
a. 코드 간결성: KVC를 사용하면 단 두 줄의 코드로 최소값과 최대값을 찾을 수 있습니다. 간결한 코드는 가독성을 높여 유지 관리가 더 쉽습니다.
b. 확장성: KVC를 사용하면 다양한 컬렉션 연산(@avg, @sum, @count 등)을 쉽게 적용할 수 있습니다. 이를 사용하면 애플리케이션에 추가 기능을 쉽게 통합할 수 있습니다.
물론 상황이나 요구 사항에 따라 for루프가 KVC보다 성능상 더 추천되는 경우도 있습니다.
a. 커스텀 알고리즘: for루프를 사용하면 배열 요소에 대한 개별 처리나 처리 순서를 정확하게 제어할 수 있습니다. 예를 들어, 홀수 인덱스에 있는 값만 찾거나, 특정 조건을 충족하는 요소만 비교하는 등의 커스텀 알고리즘을 적용하려면 for 루프가 더 적합합니다.
b. 최적화: for루프를 사용하면 KVC를 사용할 때보다 시스템 자원을 아낄 수 있는 경우도 있습니다. 예를 들어, 특정 조건이 충족되면 배열 순회를 중단해야 하는 경우 for루프가 더 효율적입니다. KVC의 경우, 배열의 모든 요소를 한 번에 처리해야 하기 때문에 시간 또는 시스템 자원을 덜 효율적으로 사용할 수 있습니다.
이처럼 성능 및 적합성에 관한 문제는 개별 프로젝트와 개발자의 선호에 따라 달라질 수 있습니다. 큰 성능 차이가 없는 경우 개발자의 경험과 기계어로 작성된 메소드와 직접 작성한 코드 간의 적절한 절충 방안을 선택하는 것이 중요합니다.
본 실습의 경우 단순히 max, min을 찾아내는 것에 집중했으며 이외 요소(중간에 중단해야하는 등)가 들어가지 않기 때문에 KVC가 추천됩니다.
'Development > iOS' 카테고리의 다른 글
[Objective-C] 앱 만들기 입문 - 13 : 특정 거래소 불필요 가격 정보(소수점 뒤에 0 나오는거) 삭제 & 출력되는 데이터 깔끔하게 가공 (0) | 2023.07.14 |
---|---|
[Objective-C] 앱 만들기 입문 - 12 : 미사용 변수 정리 및 spot별로 조건에 따라 노출 위치 수정 (0) | 2023.07.14 |
[Objective-C] 앱 만들기 입문 - 11 : 여러 개의 api call 결과 활용 및 디자인 변경 적용 (0) | 2023.07.13 |
[Objective-C] 앱 만들기 입문 - 10 : 앱 카드 디자인 변경 - 테두리 만들기 (0) | 2023.07.12 |
[Objective-C] 앱 만들기 입문 - 9 : 이모티콘 및 이미지 파일 띄우기 (0) | 2023.07.12 |