Swift `Closure'를 간단하게 정리해보고 다른 언어들과 비교해보자
1. Swift 클로저
- 캡처의 자동성
- Swift의 클로저는 변수 캡처를 기본으로 지원하며, 외부 변수나 상수의 참조를 자동으로 저장
- @escaping과 non-escaping
- 클로저가 함수 실행 범위를 벗어나는지에 따라 명시적으로 @escaping을 선언
- 간결한 구문
- 파라미터 타입, 반환 타입, 그리고 in 키워드를 생략하거나 단축 표현 ($0, $1)을 사용할 수 있음
- 최적화된 성능
- Swift 클로저는 컴파일러가 최적화를 위해 설계되어 성능적으로 우수
let numbers = [1, 2, 3, 4, 5]
let squared = numbers.map { $0 * $0 }
print(squared)
2. Python Lambda
- 익명 함수
- lambda 키워드를 사용하여 익명 함수를 정의
- 한 줄 제한
- Lambda는 단일 표현식만 포함할 수 있어 Swift 클로저처럼 복잡한 코드 블록을 표현하기 어렵다.
- 캡처
- Lambda도 주변 스코프를 캡처할 수 있지만, 읽기 전용으로 동작
squared = list(map(lambda x: x * x, [1, 2, 3, 4, 5]))
print(squared)
차이점
- Python Lambda는 한 줄로 제한되지만, Swift 클로저는 복잡한 코드를 포함
- Python Lambda에는 Swift처럼 @escaping과 같은 제한 조건이 없음
3. JavaScript Functions
- First-Class Functions
- JavaScript에서 함수는 일급 객체로 클로저와 동일한 역할을 수행
- Lexical Scoping
- Swift와 마찬가지로 외부 스코프의 변수를 캡처
- 화살표 함수(Arrow Function)
- JavaScript의 화살표 함수는 Swift의 간단한 클로저 표현식과 비슷하지만, this 컨텍스트가 고정되는 차이점이 있음
const numbers = [1, 2, 3, 4, 5];
const squared = numbers.map(x => x * x);
console.log(squared);
차이점
- JavaScript 화살표 함수는 this를 고정하지만, Swift 클로저는 명시적으로 [weak self]를 사용해야 함
- JavaScript는 비동기 작업에서 일반적으로 Promises와 함께 클로저를 많이 사용함
4. Java 람다 표현식
- 타입 추론 지원
- Java 8부터 람다 표현식을 도입하여 간결한 익명 함수 구현이 가능하지만, 여전히 Swift만큼 간결하지는 않음
- 상위 스코프 변수의 캡처
- Java 람다는 외부 변수(스코프)의 읽기 전용 캡처만 허용합니다. 수정이 필요하면 final 키워드로 명시해야함
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> squared = numbers.stream()
.map(x -> x * x)
.collect(Collectors.toList());
System.out.println(squared);
차이점
- Java 람다는 읽기 전용 캡처만 허용되며, Swift는 값과 참조 모두 캡처 가능
- Java는 Swift처럼 @escaping 개념이 없음
5. Kotlin 람다
- 유사한 문법
- Kotlin의 람다는 Swift 클로저와 유사한 문법을 가짐
- it 키워드
- 파라미터가 하나인 경우, it 키워드로 암시적 참조가 가능
- 캡처
- Kotlin 람다도 외부 변수를 캡처하지만, Swift처럼 명시적으로 메모리 관리(예: weak 참조)를 다루지는 않음
val numbers = listOf(1, 2, 3, 4, 5)
val squared = numbers.map { it * it }
println(squared)
차이점
- Kotlin 람다는 Swift와 매우 유사하지만, Swift에서는 escaping 여부를 명시해야 하는 반면 Kotlin에서는 이러한 구분이 없음
C언어는 절차적 언어여서 함수가 변수처럼 일급 객체로 취급되지 않는다고 한다. 함수 포인터와 컨텍스트 구조체를 조합하여 클로저와 유사한 기능을 구현할 수 있다고 한다.