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가 추천됩니다.

 

 

 

 

 

+ Recent posts