클로저와 친해지기

7과11사이·2023년 9월 1일
0

스파르타코딩클럽

목록 보기
45/90
post-thumbnail

오늘의 학습

후발대 수업에서 클로저를 다뤘다.
악명(?)은 이미 잘 알고 있었지만, 나름 이해가 되는 시점이 종종 있었다.

Closure

클로저는 흔히 이름없는 함수 라고 한다.
*하지만, 클로저가 있기에 함수가 존재한다고 할 수 있는만큼 정말 중요한 구성원이다.

let newClosure: (String) -> (String)

위의 코드가 클로저를 의미한다.
자세히 보면 함수에서 사용하는 파라미터와 비슷한데, 정확하다!


클로저는 익명 함수로써 다양한 특징들을 가지고 있는데,
1. 변수에 할당이 가능
2. 파라미터로 전달 가능
3. 함수에서 함수를 반환시킬 수 있음

1,2번 같이 여러 곳에서 사용이 가능한, 던져질 수 있는 함수이기에
1급 객체(first citizen)라고 불리기도 한다.

변수에 할당 가능한 클로저

// 함수
func newFunction(_ param: String) -> String {
	return param + "!!!"
}

// 클로저
var a: (String) -> String = newFunction
a("HI")

// prints 'HI!!!'

위의 함수 구조를 보면, 넣어진 파라미터를 사용하여 !!!를 더한 String 값을 반환하고 있다.

클로저는 복잡해 보이지만, 쉽게 이해할 수 있는 포인트가 존재한다!
'='을 기준으로 잡으면 이해하기 쉬울 듯하다.

1. 수학과 달리 코딩의 기본은 "'=' 우측에 있는 값을 왼쪽에 대입한다".
2. Swift를 포함한 모든 언어에서 타입을 사용하는데, 선언은 아래와 같이 한다.

let newString: String = "value"
//	변수명	 :   타입  = "값" 의 형식을 가진다.

이를 참고하면 클로저도 쉽게 이해가 될 수 있다.
(String) -> String 타입을 가진 'a'라는 변수에게 newFunction이라는 값을 할당한다.

하지만 newFunction은 함수로, 파라미터로 넣는 값과 반환 값이 일치해야만 할당할 수 있다는 점!
따라서 함수를 변수가 머금고 있기에 변수 뒤에 () 실행 구문을 넣으면 값이 반환되는 것이다.


예전보다 조금은 더 쉽게 이해가 되고 있는 중이다.

다양한 간소화 방식

func performClosure(param: (String) -> Int) {
	param("Swift")
}

//1 parameter 타입 제거
performClosure(param: { str in
	return str.count
}

//2 parameter 표시 제거
performClosure { str in
	return str.count
}

//3 활용 값 대신 
performClosure {$0.count}
  • 여러 강의에서도 그리고 개인적으로 느끼고 있지만, 간소화가 정말 좋다고 느끼지는 않는다.
    오히려 복잡해지는 경향이 있다보니 적절하게 사용하는 방향이 가장 좋은 것 같다.

*별도로 중요했던 Escaping Closure에 대해서 내용이 있었는데, 이건 내일 멀끔한 정신 상태로 정리해보도록 하겠다!

0개의 댓글