Swift Academy · 강의

지연 평가와 즉시 평가의 절충

지연 평가가 도움이 될 때와 방해가 될 때를 파악합니다.

레슨 3/413개 단계

지연 평가와 즉시 평가의 절충은(는) CoddyKit의 무료 Swift Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Swift Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

공짜 점심은 없습니다

지연 평가가 항상 더 빠른 것은 아닙니다. 지연 평가는 미리 메모리를 할당하는 대신 접근할 때마다 추가 비용이 발생하고, 부수 효과가 실행되는 시점도 바꿉니다. 이러한 장단점을 알면 올바르게 선택할 수 있습니다.

지연 평가가 유리한 경우: 일부만 소비

대규모 변환 결과 중 일부 구간만 필요하다면 — 지연 평가는 나머지를 건너뜁니다:

let data = Array(1...1_000_000)
let top = data.lazy.map { $0 * 2 }.prefix(3)
print(Array(top))  // [2, 4, 6]  -- 999,997 transforms skipped

즉시 평가가 유리한 경우: 전체 재사용

결과를 여러 번 순회한다면 즉시 평가는 한 번만 계산하지만, 지연 평가는 순회할 때마다 다시 계산합니다:

let doubled = [1, 2, 3].map { $0 * 2 }  // computed once
print(doubled.reduce(0, +))  // 12
print(doubled.max()!)        // 6  -- no recompute

지연 평가는 다시 계산합니다

같은 지연 뷰도 순회할 때마다 작업을 다시 수행합니다:

var work = 0
let view = [1, 2, 3].lazy.map { (n: Int) -> Int in work += 1; return n }
_ = view.reduce(0, +)
_ = view.max()
print(work)  // 6  -- transformed twice

요소마다 발생하는 추가 비용

지연 평가의 각 단계는 시퀀스를 또 다른 형식으로 감싸고, 요소마다 클로저를 호출합니다. 아주 작은 배열에서는 이 추가 비용이 절약한 메모리 할당 비용보다 클 수 있습니다.

작은 배열에서는 즉시 평가도 괜찮습니다

요소가 몇 개뿐이고 모두 소비한다면 일반적인 즉시 평가 방식을 사용하세요 — 더 단순하고 메모리 할당도 사소합니다:

let nums = [3, 1, 2]
let sorted = nums.map { $0 + 1 }.sorted()
print(sorted)  // [2, 3, 4]

부수 효과의 실행 시점이 다릅니다

지연 평가에서는 클로저 본문이 클로저를 정의한 줄보다 나중에 실행됩니다. 지연 변환 안의 부수 효과에 의존하지 마세요:

var log: [Int] = []
let v = [1, 2].lazy.map { (n: Int) -> Int in log.append(n); return n }
print(log)        // []  -- nothing ran yet
_ = Array(v)
print(log)        // [1, 2]

즉시 평가를 강제하는 연산

일부 연산은 어차피 전체 시퀀스를 읽어야 하므로, 그런 경우에는 지연 평가의 이점이 없습니다:

let nums = Array(1...10)
print(nums.lazy.map { $0 * 2 }.sorted())  // sorted must see all -> [2,4,...,20]
print(nums.lazy.map { $0 }.count)         // count walks everything

지연 평가와 포함 검색

contains(where:)처럼 중간에 멈출 수 있는 연산은 입력이 클 때 지연 평가의 이점을 얻습니다:

let big = Array(1...1_000_000)
let found = big.lazy.map { $0 * 2 }.contains { $0 == 8 }
print(found)  // true  -- stops at element 4

판단 체크리스트

다음과 같은 경우 지연 평가를 사용하세요: 원본이 크고 AND 일부만 유지하며(prefix / first / 포함 검색) AND 한 번만 순회하는 경우입니다. 다음과 같은 경우 즉시 평가를 사용하세요: 배열이 작거나, 결과를 재사용하거나, 미세 최적화보다 가독성이 더 중요한 경우입니다.

let huge = Array(1...100_000)
let first = huge.lazy.filter { $0 % 9973 == 0 }.first
print(first!)  // 9973

추측하지 말고 측정하세요

성능에 대한 직감은 자주 틀립니다. 성능이 중요하다면 지연 평가를 적용하기 전에 실제 상황에 가까운 데이터로 두 버전을 모두 벤치마크하세요.

let nums = Array(1...50)
let eager = nums.filter { $0 > 25 }.count
let lazyC = nums.lazy.filter { $0 > 25 }.count
print(eager == lazyC)  // true -- same answer, profile for speed

빠른 확인

지연 평가보다 즉시 평가를 선택하는 편이 더 나은 경우는 언제인가요?

복습

다음과 같은 장단점을 배웠습니다:

  • 대규모 원본을 일부만 한 번 순회할 때는 지연 평가가 유리합니다
  • 작은 배열과 재사용되는 결과에는 즉시 평가가 유리합니다(지연 평가는 다시 계산합니다)
  • 지연 변환의 부수 효과는 나중에 실행되므로 이에 의존하지 마세요
  • 최적화하기 전에 측정하세요

다음: 사용자 지정 지연 시퀀스 만들기

무료로 시작

AI 튜터와 함께 Swift을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
122
레슨
409

자주 묻는 질문

“지연 평가와 즉시 평가의 절충” 강의는 무료인가요?

네 — “지연 평가와 즉시 평가의 절충” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Swift Academy 강의 전체를 잠금 해제할 수 있습니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“지연 평가와 즉시 평가의 절충”에서 뭘 배우나요?

지연 평가가 도움이 될 때와 방해가 될 때를 파악합니다. 브라우저에서 직접 실행하는 실습 코드로 Swift Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Swift Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Swift Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“지연 평가와 즉시 평가의 절충” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Swift Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Swift Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. lazy 속성
  2. 지연 map과 filter
  3. 지연 평가와 즉시 평가의 절충
  4. 사용자 지정 지연 시퀀스 만들기
← Swift Academy(으)로 돌아가기