개발/Swift

[Swift] 익명 함수와 클로저

BLEV 2025. 4. 22. 21:11

 
모든 개발 언어에서 '익명 함수 (Anonymous Function)'라는 개념이 존재한다.
 
개발을 시작하고 약 1년은 Kotlin으로 Android를 개발했었는데,
당시에는 익명함수, 람다를 전혀 이해하지 못했고, 너무 어려워했던 기억이 난다.
 
시간이 조금은 지난 지금, 람다뿐 아니라 어느 정도 개발에 익숙해진 시점에서 그때를 떠올려 보면,
그렇게 힘들어했던 것도 이해가 되지만, 왜 그렇게 어렵게 느꼈었는지, 어렵게 공부했었는지 아쉬운 생각도 든다.
아마 나보다 더 오래된 개발자들도 비슷한 감정을 느껴본 적 있지 않을까 싶다.
 
그래서, 그때의 나를 위로하는 마음으로 익명 함수, 클로저에 대해 정리해보려 한다.
물론, 이거 말고도 힘들어 한게 한 둘이 아니긴 하다.. (지금도 힘든거 많ㅇ)
 


 

익명 함수? 클로저?

익명 함수란 말 그대로 이름이 없는 함수이다.
 

이름이 없는 함수 '익명 함수'

 
대부분의 언어에서 익명 함수를 지원한다.
Swift에서는 클로저(Closure), Kotlin에서는 람다(Lambda)로 표현한다.
 
여기서 중요한 점은, 클로저나 람다는 익명 함수를 표현하는 방식, 즉 구현 문법일 뿐이라는 것이다.
 

Swift에서는 익명 함수를 표현하기 위해 클로저라는 방법을 사용한 것이다.

 


Swift에서는 익명 함수를 클로저 문법을 통해 표현한다.
클로저는 중괄호 {}를 사용해서 코드 블록을 정의하는 것을 말한다.
 
만약 다음과 같다면?

{
  let x: Int = 3
  let y: Int = 8
  return x + y
}

 
이것이 익명 함수고 클로저 문법으로 작성한 것이다.
 
하지만 이렇게 선언만 해서는 사용할 수 없다.
함수는 결국 호출을 해서 사용을 해야 하기 때문에, 익명 함수도 호출할 수 있는 방법이 있어야 하고,
 

var add: () -> Int = {
  let x: Int = 3
  let y: Int = 8
  return x + y
}

let sum = add() // 사용

 
위와 같이 변수에 클로저 참조를 담아 사용한다.
 

'add'라는 이름이 있는 것 아닌가요?

 
 
위 내용을 보고 바로 들었던 생각이다.
'add'라는 이름이 있는 것 같은데 익명 함수란다.
 
이 부분이 헷갈릴 수 있지만, 핵심적인 내용이다.
add는 단지 저장 공간일 뿐이고, 우리가 정의한 익명 함수(클로저)는 여전히 이름이 없다.
 
함수가 되기 위해서는 func 키워드와 함께 이름이 붙어야 한다.
 

// 클로저
let addClosure: (Int, Int) -> Int = { x, y in
  return x + y
}

// 일반 함수
func addFunction(_ x: Int, _ y: Int) -> Int {
  return x + y
}

// 호출
let resultFromClosure = addClosure(5, 6)
let resultFromFunction = addFunction(5, 6)

 


 
실제로 어떻게 쓰이는지는 다음 포스팅에서 해야겠다.
일급 객체, 고차 함수 내용을 담게 되면 내용이 너무 많아질 것 같다.