안녕하세요. 린다입니다.
최근에 하나 과제를 진행하면서 클로저에 대한 이해를... 정말 확실히 하고
싹 정리를 해야겠다고 다짐해서 공부하고 정리하는 글이에요!
사실 다 이해한 줄 알았는데 알고보니 외워서 쓰는 꼴이더라.. 싶어서 정리하러 왔습니다.
제가 우선 헷갈렸던 함수는 함수타입을 파라미터로 갖는 함수, @escaping이 헷갈렸는데요.
이부분을 집중적으로 정리했습니다!
클로저, 함수, 파라미터, 아규먼트 헷갈린다.. 싶으시다면 참고가 되면 좋겠어요!!!
그럼 예시로 시작해볼게요
func doSomething(_ name: () -> ()) {
name()
}
여기서 " : " 뒤에 있는 것이 뭐다? Type 입니다.
지금 " : " 뒤에는 () → () 가 있음
즉, doSomething 함수의 파라미터 타입도 함수라는 것
여기서 () → () 는 파라미터도 리턴 타입도 없는 함수잖아요?
그러니까 doSomething 함수를 호출할 때, 함께 전달해야하는 값이 함수임을 의미합니다.
여기서 이제 전달할 수 있는 함수에는 이름이 있는 함수인 func와 이름이 없는 함수인 closure클로저 둘 다 가능!
+) 여기서 헷갈리지 말아야 하는 점!
지금 해당 함수는 Argument를 wildCard Patter을 사용하였기 때문에
호출 시 파라미터가 생략이 가능하다는 점을 기억하고 있어야함!!!
먼저 이름이 있는 함수를 전달하는 방법을 보자면,
원래 하던 대로 이름이 있는 함수를 정의하고 함수 호출 시 넣어주면 됩니다.
func inside() {
print("inside!")
}
doSomething(inside)
이제 이름이 없는 함수는 클로저를 함깨 전달하는 방법을 보자면...
우리는 지금 _를 통해서 인자값을 생략했기 때문에 … 함수를 호출하면 모든 것이 생략된채로 보여집니다.
모든 것이 생략되었기 때문에.. 이름이 없는 함수의 모양새를 가진 채로 바로 보여짐
다시 돌아와서 이름이 없는 함수가 머였죠?
func () { } 이런거, let closure = { print(”hello”) } 이런 것라서 저렇게 나오는거에요.
헷갈리죠…? 그래서 다시 보면..
우리는 지금 doSomething 함수를 호출 할 때 { } 만 사용하고 있습니다.
왜? 아무것도 없지? 싶지만.. 말 그대로 doSomething 함수 안에서
name이라는 파라미터를 가진 함수를 “호출” 하겠다는 말이에요.
그래서 함수 자체를 호출하기 때문에.. { } 인 것이며,
name 파라미터는 함수로써 doSomething 함수 안에서 사용되기 때문에
doSomething 함수 안에서 사용 시에는 ()를 붙여줘야 하는 겁니다!!
함수의 실행이 이루어져야 하니까욥
지금 주석에 써놓은 함수 안에서 함수라고? 의 의미는…
name을 파라미터로 갖는 doSomething 함수를 실행 시에는, name 파라미터 타입이 함수이기 때문에..
doSomething함수를 호출하면 2번의 함수가 실행이 되겠죠?
그래서 함수 안에서 함수를 실행하는 꼴이라고 써놓은 겁니다!
쉽게쉽게 출력문까지 있는 예제를 보면.
지금 doSomething을 호출할 때, name이라는 함수를 “name 함수입니다”
라는 문장이 나오도록 정의를 해놓았죠?
그렇기 때문에 호출한 결과가 먼저 doSomething 함수 안에 정의 되어있는 print문을 출력하고
그 다음 파라미터로 들어와서 정의된 클로저를 실행하기 때문에
doSomething 내부
name 함수입니다.
라고 출력되는 겁니다.
(순서를 바꾸면 실행되는 순서가 바뀌니까 뒤집혀서 나오는거구요!)
그렇다면 혹시 만약에 파라미터가 있다면???
당연히 파라미터를 함수 내부에서 사용해야 하니까
이런식으로 코드가 풀어지겠죵?
근데 사실.. 위의 예제를 ({ }) 이런 식으로 코드를 작성해도 됩니다. 당연한 말이에요.
그치만 이건 밑에 글을 읽으면 다 똑같아 보이실거에요... ^_^
2) 인자값까지 있거나 파라미터만 있으면 어떻게 되나요?
이렇게 2가지가 생성됩니다.
아래꺼를 선택하고 저 상태에서 Enter를 한번 더 누르면 오른쪽처럼 됩니다. (위에꺼 선택하면 바로 이렇게 나옴)
3) 파라미터만 있다면?
4) 근데 사실 이렇게도 가능해요!
??? 머징 ??? 싶죠…
사실 이 부분은 모두 후행 클로저, 클로저의 경량화와 관련이 있어요...
이거는 다음 게시물에서 더 자세하게 정리해볼게요!
일단 아 이런 흐름이구나를 보고 후행클로저와 경량화를 봐야 이해가 빠르기 때문에
이렇게 정리해놓았어요.
혹시나 틀린게 있다면 말씀 부탁드립니다~!!!
'Swift > Swift 기초문법' 카테고리의 다른 글
Swift의 ARC 톺아보기 (feat. CFGetRetainCount) (1) | 2024.04.18 |
---|---|
Swift 기초 문법, 함수와 클로저를 톺아보자 ... 2번째 (1) | 2024.02.06 |
DispatchQueue(GCD)를 알아보자2, GCD 사용시 주의해야할 사항 (0) | 2023.11.08 |
DispatchQueue(GCD)를 알아보자, 이제 동기/비동기, 동시/직렬을 곁들인.. (2) | 2023.11.03 |
[Swift 기초문법] Error Handling을 알아보자 (0) | 2023.07.17 |