seong_hye, the developer

Swift) 고차함수가 메모리 측면에서 이득인가? 본문

IOS/SwiftUI

Swift) 고차함수가 메모리 측면에서 이득인가?

seong_hye 2022. 7. 26.

 

 

고차함수에 대해 공부하고 사용하다가 보니

for문을 사용해도 되는 걸 고차함수로 사용하는 게 이득인가? 라는 생각을 하게 되었다.

https://programming-seonghye.tistory.com/25

 

Swift)문법 정리 - 고차함수

📘 Swift 문법 정리: 고차함수Swift 문법 중 고차함수에 대해 정리한 글입니다. 🔹 1. 문법 설명Swift에서 매우 핵심적인 개념으로 컬렉션 처리 (Array, Set, Dictionary) 에 자주 사용됩니다.다른 함수를

programming-seonghye.tistory.com

 

 그런 이유로 한 번 알아보자.

📘 고차함수 사용이 메모리 측면에서 이득인가?


🔹 결론 먼저 요약

Swift에서 고차함수(map, filter, reduce 등)는 가독성과 표현력은 뛰어나지만,

메모리 사용이나 성능 면에서는 항상 더 유리하다고  볼 수는 없다.


🔍 메모리 측면에서의 장단점


✅ 장점

1. 코드가 간결해져서 유지보수가 쉬움

     - 클로저와 고차함수를 쓰면 코드 길이가 짧아지고 오류 가능성이 줄어듭니다.

     ~> 개발자 생산성에는 이득이 있어요

 

2. 지연 평가를 통해 메모리 절약 가능 (조건부)

    - lazy 키워드를 사용하면 실제로 값을 즉시 계산하지 않고, 필요할 때 계산해 메모리 사용이 줄어들 수 있습니다.

let result = numbers.lazy.filter{...}.map{...}

 

✅ 단점

1. 중간 배열이 계속 생성됨( 기본 map/filter 등 사용 시)

     ex) array.map{...}.filter{...} 처럼 체이닝할 경우, 각각의 연산에 중간 배열이 메모리에 생성됨

 

2. 클로저 캡처 비용

     - 클로저 내부에서 외부 변수를 캡처하는 경우, 해당 변수는 클로저가 살아 있는 동안 메모리에 유지됨

 

3. 디버깅이 어려울 수 있음

     - 가독성은 좋지만, 내부 동작 추적이나 성능 튜닝 시엔 for문보다 복잡할 수 있음


🔹 성능 비교 예시

let numbers = Array(1...10_000)

let reulst1 = numbers.map{ $0 * 2 }.filter{ $0 % 3 == 0 }

let reulst2: [Int] = []
for number in numbers {
	let doubled = number * 2
    if doubled % 3 == 0 {
    	result2.append(doubled)
    }
}

📌 설명

- result1 : 고차함수 (map -> filter)  ~> 중간 배열 2개 생성

- result2: for문 ~> 중간 배열 없이 직접 결과 리스트에 추가

 

➡️ 대량 데이터에서는 for문이 더 메모리 효율적일 수 있음


🔹 최적화 포인트: lazy 사용

let result = numbers.lazy,map{$0 *2}.filter{$0 % 3 == 0}

📌 설명

lazy를 사용해 연산이 필요할 때만 수행됨

중간 배열 생성을 방지해 메모리 사용이 감소함


🔹 정리 요약

항목 고차함수 for문
가독성 뛰어남 낮음
디버깅 편의성 복잡 명확
성능 중간 배열 많은 경우 불리 메모리 효율적
최적화 lazy 사용 시 개선 가능 직접 제어 가능

🔹 결론

- 작고 간단한 연산 -> 고차함수 추천 (가독성과 생산성이 높음)
- 대용량 데이터 처리, 고성능 요구 -> for문 or lazy 고차함수 고려
Comments