[Swift 기초] ​클로저(Closure)란 - 클로저 1편

justdotheg·2024년 1월 13일
0
post-thumbnail

1. 클로저를 이해하기 위한 배경지식

1.1. 클로저(Closure)의 종류

'클로저(Closure)'에는 Named Closure와 Unnamed Closure가 있다. 우리가 그동안 func 키워드를 붙여 선언하였던 함수는 Named Closure이다.

  • 참고로 Closure의 단어 뜻에는 "종결"이라는 의미가 있다.
    어떠한 함수 즉, 펑션을 작성할 때 기능을 다 작성한 후 종결을 짓기 위해 { } 블럭을 추가한다.
  • Closure를 통해 정의하고자 하는 '기능'에 '종결'을 낼 때, 이름을 붙이냐 안 붙이냐에 따라 "이름이 있는 함수(Named Closure)"와 이름이 없는 함수 즉, "익명함수(Unnamed Clousre)" 두가지로 나뉜다.
  • 우리가 일반적으로 func 키워드를 붙여 정의하는 함수는 모두 Named Closure 즉, 이름이 있는 함수이다.
  • 그 말인즉슨 평소에 func 키워드를 통해 정의했던 함수들은 모두 클로저라는 사실이다!
  • 다만 클로저라고 하면.. 보통 익명함수(Unnamed Closure)를 생각하고 부르긴한다.

앞으로 이 포스팅에서 다룰 '클로저(Closure)'는 이름이 없는 '익명함수(Unnamed Closure)'이다.

1.2. 일급 객체(First-Class Citizen)

클로저를 제대로 이해하기 위해서는 '일급 객체' 개념을 알고 있어야 한다. Swift는 '함수형 프로그래밍 패러다임'을 따르고 있다. Swift가 지원하는 기능 중에 여러가지 이유가 있지만, 그 중에 중요한 이유는 함수를 '일급객체(First-Class Citizen)'로 취급하기 때문이다.

그리고 클로저도 이름 없는 함수 즉, '익명 함수(Unnamed Closure)'이기 때문에 일급 객체로 취급되고 그 특성을 따른다.

그렇다면 일급 객체는 무엇일까?

아래 조건을 만족하면 일급객체라고 할 수 있다.

1) 전달 인자로 객체를 전달 가능
2) 변수나 데이터 구조 안에 펑션을 저장 가능
3) return 값으로 펑션을 반환 가능

Swift의 펑션이 일급객체의 조건에 부합한다는 것을 보여주기 위해 예를 들어 보겠다. 이번 포스팅이 클로저가 주제이긴 하지만, 이해를 돕기 위해 쉬운 예시를 들어보았다.

1.2.1. 전달 인자로 펑션을 전달 가능

question(answer: firstClassCitizen(name: "just do the g"))

question 함수를 호출하면서 전달 인자로 firstClassCitizen이라는 펑션을 사용하는 것이 가능하다.

1.2.2. 변수나 데이터 구조 안에 펑션을 저장 가능

let conversation = question(answer: firstClassCitizen(name: "just do the g"))

conversation이라는 상수에 question 함수를 저장하였다.

1.2.3. return 값으로 펑션을 반환 가능

return "What's your name? " + firstClassCitizen(name: answer)
}

question 펑션의 return 부분을 보면 반환부분에 펑션을 적어줄 수 있는 것을 볼 수 있다.


⭐️ 제일 중요한 점은 예시를 보면서는 1.2.1.~1.2.3에서 가능했던 모든것들이 "클로저도 함수"이기 때문에 모두 적용 가능하다고 생각하면 될 것 같다.

  • 전달 인자로 클로저를 전달 가능
  • 변수나 데이터 구조 안에 클로저를 저장 가능
  • return 값으로 클로저를 반환 가능

클로저를 변수나 상수처럼 사용 가능하다고 이해하면 될 것 같다!

2. 클로저

(Closure)란
그래서 클로저는 어떤것인가?

'클로저(Closure)'는 이름이 없는 익명 함수(Unnamed Closure)라고 불린다. 반대로 말하면 평소에 우리가 쓰는 함수는 이름이 있는 함수라고 할 수 있다. 클로저는 중괄호로 { }으로 코드 블럭을 작성하면 된다.

Java의 Lamda function과 비슷하다.

클로저의 기본 구조가 어떻게 생겼는지 살펴보자.

{(파라미터의 Name: 파라미터의 Type) -> 리턴 Type in
	실행구문
}

'[Swift 기초] 클로저(Closure) 문법 경량화 - 클로저 2편'에서 클로저 구문을 간략하게 쓰는 방법 즉, 경량화 방법을 배울 것이다.

하지만 위의 기본 문법에 충실하여 클로저를 작성하다고 했을 때, in 뒤에는 수행하고자 하는 기능을 작성하면 된다.

참고로 '(파라미터 이름 : 파라미터 타입) -> 리턴 타입' 이 부분은 '클로저 헤드(Closure Head)'이다.
in 뒤의 실행구문 부분은 '클로저 바디(Closure Body)'라고 부른다.

언뜻 보면 함수와 굉장히 비슷하게 생긴 것 같다.

같은 기능을 하는 이름이 있는 일반 '함수(Named Closure)'와 ' 클로저(Unnamed Closure)'의 코드를 비교해서 작성해보도록 하겠다!

2.1. 일반 함수(Named Closure)

문자열을 파라미터로 받는 testFunc 이라는 함수를 작성하였다.
그리고 testFunc에 "just do the g"를 인자 값으로 주며 호출하였다.

2.2. 클로저(Unnamed Closure)

testClosure라는 상수에 name을 출력하는 기능을 담는 클로저를 대입하였다.
그리고 testClosure 라는 상수를 실행하였다.

이 둘의 차이점은 일반 함수는 함수를 호출하여 실행하지만, 클로저는 변수나 상수를 실행한다는 점이다.

0개의 댓글