[iOS_Swift] 클로저(2) - 기본 클로저

2021. 11. 3. 00:37Programming/iOS_Swift

1편에서 클로저를 이해하기 위해 1급 객체에 대해 알아봤으니 본격적으로 클로저를 이해하고 어떻게 사용하면 좋을지 알아보려고 한다. 우선 클로저란 사용자의 코드에서 전달 및 사용할 수 있는 독립된 기능 블록이라고 한다. 이해가 잘 안가는 말인데 쉽게 생각하면 앞으로 사용하고 부르게 될 클로저들은 '이름 없는 함수'로 생각하면 편할 것 같다. 정확한 설명은 절대아니다! 이해의 편의를 위해..

 

정확하게 클로저에 대해 분류를 하면 Named Closure, Unnamed Closure로 나눠 진다. 여기서 Named Closure가 우리가 흔히 알고 사용하는 함수이다. 즉 함수는 클로저의 일종인 것이다! Unnamed Closure가 바로 앞으로 계속 다루게 될 녀석이다. 즉 앞으로 언급하는 클로저는 전부 앞에 Unnamed가 생략된 것으로 이해하자.

 

그러면 왜 이렇게 설명하기도 힘든 친구를 이해하고 써야할까. 사실 학습자의 입장에서 제일 이해하기가 힘들었다. 그냥 멀쩡하게 있는 쉽고 편한 func 쓰면 안되나? 싶었다. 물론 그렇게 해도 되지만 코드의 양을 줄일 수 있고 직관적으로 이해할 수 있다는 점에서 클로저는 이름 있는 클로저(func)보다 효과적이다. 예시를 통해 보자.(항상 예시 만드는게 개념 이해하는 것보다 오래걸린다,,)

 

함수를 총 2개를 만들어줬다. 신체데이터를 Int타입으로 반환해주는 함수 1개와 어떤 사람의 데이터를 String타입으로 반환해주는 함수 1개를 만들었다. 상수 인스턴스 park의 경우 매개변수 body에 heightPlusWeight라는 함수를 넣어 줌으로써 bodyStatus를 구했다.

 

반면 상수 인스턴스 kim의 경우 매개변수 body에 클로저를 활용해서 간단하게 bodyStatus를 구했다.

 

두 인스턴스의 리턴값 연산과정은 똑같지만 차이점을 보면 park의 경우 함수가 2개가 필요했고 또 heightPlusWeight함수가 어떤 내용인지 모르기때문에 해당 함수를 찾아가서 확인해야한다는 불편함이 존재한다. 그러나 kim의 경우 클로저를 활용함으로써 보다 직관적으로 어떤 연산이 활용됐는지 확인이 가능하다는 점에서 무척 편해진다.

 

클로저의 형태가 조금 난해할 수 있는데 자세히 쪼개서 확인해보자.

클로저의 기본적인형태는  {  (매개변수) -> 반환타입   in   실행코드  } 이다. 즉 인스턴스 kim의 경우 a와 b가 매개변수이고 반환타입은 Int이며 실행코드는 a+b라는 뜻이다.

 

생각보다 길고 잘 이해가 안가는 코드라고 생각할 수 있는데 클로저의 또 다른 장점은 축약이 가능하다는 것이다. 한번 예시를 통해 축약해보자.

먼저, 클로저 매개변수들의 타입을 생략해줬다. -> 클로저의 반환타입과 소괄호를 생략해줬다. -> return을 생략해줬다.(단, 클로저 내부의 실행문이 한 줄일때 사용이 가능하며, 이는 암시적으로 해당 실행문을 반환한다는 뜻이다.) -> 매개변수 a, b 대신에 0번째 단축 인자, 1번째 단축 인자인 $0과 $1을 써주고 in을 생략했다.

 

결과는 옆에서 확인할 수 있듯이 모두 동일하다. 처음과 비교해서 엄청 축약이 됐고 코드가 한 눈에 잘 들어온다!