클로저
먼저, 클로저는 named clousre와 unnamed clousre로 나뉜다.
named clousre는 우리가 사용하는 함수를 말 하는데, 일반적으로 우리는 이를 클로저라고 부르지 않고 그냥 함수라고 부른 것 뿐이다.
(함수는 실제로 클로저에 속함)
func daesung() {
print("안농안농")
}
그리고 다음과 같이 이름을 붙이지 않고 사용하는 함수를 익명함수 unnamed clousre라고 부른다.
let closure = { print("나는 클로저~") }
따라서 위 말들을 정리해보면, 클로저는 named clousre 와 unnamed clousre 둘 다 포함하지만,
우리는 보통 unnamed clousre를 클로저라고 부른다.
그럼 이름 없는 함수인 클로저는 왜 필요한가? 라고 의문을 가질 수 있는데
답은 간단하다 '함수로 만들기 귀찮기 때문.'
자, 한 가지 더 중요한 사실!
클로저는 1급 객체 함수의 특성을 갖는다.
여기서!!~ 1급 객체 함수란?
함수가 다른 데이터 타입처럼 취급될 수 있다는 것을 의미하는데, 특징에 대해서 알아보자.
1. 변수나 상수에 할당할 수 있다.
2. 함수의 매개변수로 전달할 수 있다.
3. 함수의 반환 값으로 사용할 수 있다.
클로저의 표현식은 다음과 같다
{ (매개변수 이름: 매개변수 타입) -> 반환타입 in // 헤드
실행구문 // 바디
}
일반적인 함수와 표현은 비슷하다. in이라는 키워드만 추가 되었는데,
in은 헤드와 바디를 구분지어 주는역할을 한다.
자자 역시 글로만 봐서는 이해가 1도 안 간다.. 예제를 찾아보자
1. Parameter와 return type이 둘 다 없는 클로저
let test = { () -> () in // input으로는 void인 ()가, output으로는 void인 ()를 갖게 된다.
print("test")
}
test() // tset라고 출력 됨
2. Parameter와 return type이 있는 클로저
let test = { (name: String) -> String in
return "Hello, \(name)"
}
요건 첫 번째 예제와는 달리 함수와 비슷해 보여서 어려울 것 없어 보이지만,
한 가지 주의해야 할 것이 있다.
우리가 예전에 함수를 배웠을 때, 파라미터는
Argument Label과 Parameter Name으로 나누어져 있던 부분 혹시 기억 나시나요?
형태가 비슷하지만 우리 클로저에서는 Argument Label을 사용하지 않는다.
따라서, name 부분은 Parameter Name이 되겠다.
그렇기 때문에 나중에 호출하게 될 때 주의해야 한다.
test("대성")
test(name: "대성") // 에러발생
'Swift' 카테고리의 다른 글
기본 문법 <제네릭> (0) | 2024.06.15 |
---|---|
의존 관계 역전 원칙(Dip, Dependency Inversion Principle) (0) | 2024.06.14 |
기초 문법 타입 캐스팅 (1) | 2024.06.12 |
내가 볼려고 만든 SOLID정리 (0) | 2024.06.07 |
문법 기초 공부 (객체 지향) (1) | 2024.06.05 |