오늘은 클로저에 대해 공부해 보았다.
Closure(클로저)
가 무엇인가?
"익명함수" 즉, 특별히 명명된 함수 생성없이 실행되는 코드 그룹, 함수와 유사하게 특정 작업을 수행하는 코드 블록을 의미한다고 볼 수 있다.
Function에서 4가지의 요소가 있다면, closure은이름
을 제외한파라미터
,반환타입
,구현부
로 구성되어있다.
# 함수 : 이름이 있는 코드 묶음 -> 다른 코드가 함수 이름을 호출하기 위함
# 클로저 : 이름이 없는 코드 묶음 -> 굳이 이름이 없어도 호출할 수 있는 형태로 사용 가능
함수
는 변수에 할당할 수 있다.함수
를 파라미터로 사용할 수 있다.함수
를 리턴할 수 있다.let closure: (Int) -> Int // 파라미터 Int 타입과 리턴 타입 Int
let closure: (Int, String) -> Int // 파라미터 (Int, String)와 리턴 타입 Int
let closure: (Int) -> Void // 파라미터 Int 타입과 리턴값 없는 Void
let closure: (Int, String) -> Void // 파라미터 (Int, String)와 리턴값 없는 Void
let closure: () -> Void // 파라미터 없고 리턴값 없는 Void
let optionalClosure: ((Int) -> Int)? // 물론 옵셔널 타입도 가능하다.
클로저는 익명 함수로 구현 시에는 in
키워드가 들어가 파라미터와 구현부분을 구분한다.
그러면 간단하게 클로저의 형태를 보자
// 기본적인 구현 방법 ( in을 기준으로 파라미터와 구현 부분을 구분한다.
{ 파라미터 이름 in
// 구현 부분
}
// 주로 사용하는 클로저 형태 (파라미터 -> 리턴타입)
{(a: Int, b: Int) -> Int in
let sum = a + b
return sum
}
// 변신 (파라미터)
{(a, b) in
let sum = a + b
return sum
}
클로저를 변수나 상수에 저장했다면 함수처럼 이름뒤에 괄호를 붙이면 된다.
let closure: (Int, String) -> Void = { intValue, stringValue in
print("intValue : \(intValue), stringValue : \(stringValue)")
}
closure(10, "20") // 출력 -> intValue : 10, stringValue : "20"
}
옵셔널 변수에 저장한 클로저는 변수이름?()
형식으로 사용하면 된다.
// 옵셔널 변수에 저장한 클로저 호출
let optionalClosure: ((Int) -> Int)? = {
return $0 * 2
}
print(optionalClosure?(10)) // 출력 -> Optional(20)
// 옵셔널 상수 optionalClosure의 클로저를 호출
// 상수의 타입이 optional이기 때문에 결과값이 Optional로 나옴
구현하고 즉시 호출한 결과값을 저장하고 싶다면 {} 뒤에 ()를 사용하면 된다.
// 구현하고 바로 호출
let helloClosure = {
return "안녕하세요!"
}()
print(helloClosure) // 출력 -> 안녕하세요!
후행(trailing) 클로저 : 함수의 마지막 인수로 함수에 클로저 표현식을 전달해야하고 클로저 표현식이 긴 경우 사용한다.
// 기본형태
closureFunc(closure: {
print("end")
})
// 후행 클로저 형태
closureFunc {
print("end")
}
파라미터 생략, 간소화
// 기본 형태
addClosure(closure: {(a: Int, b: Int) -> Int in
return a + b
})
// 간소화 형태
addClosure { $0 + $1 } // $0은 첫번째 파라미터, $1은 두번째 파라미터를 의미
매번 명확하지 않아 사용하기 어렵고, 코드를 보더라도 잘 이해가 안갔지만 이번에 이렇게 정리를 하면서 클로저의 형태에 좀 익숙해지는 기회가 된거 같다. 물론 이 정리가 아직 완벽하지는 않다. 더 공부를 해서 부족한 부분을 채워 기초가 튼튼해지도록 노력해야겠다.
오 그럼 고차함수 map 같은 게 클로저를 활용한 추상화로 OCP를 지킨 사례인가여?