[swift]TIL_Closures

Jeff·2024년 10월 28일
2

오늘은 클로저에 대해 공부해 보았다.

Closure(클로저)가 무엇인가?
"익명함수" 즉, 특별히 명명된 함수 생성없이 실행되는 코드 그룹, 함수와 유사하게 특정 작업을 수행하는 코드 블록을 의미한다고 볼 수 있다.
Function에서 4가지의 요소가 있다면, closure은 이름을 제외한 파라미터,반환타입,구현부로 구성되어있다.

# 함수 : 이름이 있는 코드 묶음 -> 다른 코드가 함수 이름을 호출하기 위함
# 클로저 : 이름이 없는 코드 묶음 -> 굳이 이름이 없어도 호출할 수 있는 형태로 사용 가능

클로저는 함수 즉 타입이다

  • 함수는 변수에 할당할 수 있다.
  • 함수를 호출할때, 함수를 파라미터로 사용할 수 있다.
  • 함수에서 함수를 리턴할 수 있다.
  • 타입으로 사용할 때 : (파라미터 데이터 타입) -> 리턴 타입
    • let closure: (Int) -> Int         			// 파라미터 Int 타입과 리턴 타입 Int 
       let closure: (Int, String) -> Int 			// 파라미터 (Int, String)와 리턴 타입 Int 
       let closure: (Int) -> Void        			// 파라미터 Int 타입과 리턴값 없는 Void
       let closure: (Int, String) -> Void			// 파라미터 (Int, String)와 리턴값 없는 Void 
       let closure: () -> Void          		 	// 파라미터 없고 리턴값 없는 Void
       let optionalClosure: ((Int) -> Int)? 		// 물론 옵셔널 타입도 가능하다.			

클로저의 표현 방법

클로저는 익명 함수로 구현 시에는 in 키워드가 들어가 파라미터와 구현부분을 구분한다.
그러면 간단하게 클로저의 형태를 보자

  •   // 기본적인 구현 방법 ( in을 기준으로 파라미터와 구현 부분을 구분한다.
      { 파라미터 이름 in
       // 구현 부분
      }
      
      // 주로 사용하는 클로저 형태 (파라미터 -> 리턴타입)
    {(a: Int, b: Int) -> Int in 
    	let sum = a + b
        return sum
    }
    
     // 변신  (파라미터) 
    {(a, b) in 
    	let sum = a + b
        return sum
    }

클로저를 사용(호출)하는 방법

  • 클로저를 변수나 상수에 저장했다면 함수처럼 이름뒤에 괄호를 붙이면 된다.

    •  let closure: (Int, String) -> Void = { intValue, stringValue in
          print("intValue : \(intValue), stringValue : \(stringValue)")
      }
      
      	closure(10, "20")		// 출력 -> intValue : 10, stringValue : "20"
      }
  • 옵셔널 변수에 저장한 클로저는 변수이름?() 형식으로 사용하면 된다.

    •  // 옵셔널 변수에 저장한 클로저 호출
      let optionalClosure: ((Int) -> Int)? = { 
          return $0 * 2
      }
      print(optionalClosure?(10))	 	// 출력 -> Optional(20)
      								// 옵셔널 상수 optionalClosure의 클로저를 호출
      								// 상수의 타입이 optional이기 때문에 결과값이 Optional로 나옴
  • 구현하고 즉시 호출한 결과값을 저장하고 싶다면 {} 뒤에 ()를 사용하면 된다.

    • // 구현하고 바로 호출
      let helloClosure = {
         return "안녕하세요!"
      }()
      print(helloClosure) // 출력 -> 안녕하세요!
      

클로저 간소화

  • 후행(trailing) 클로저 : 함수의 마지막 인수로 함수에 클로저 표현식을 전달해야하고 클로저 표현식이 긴 경우 사용한다.

    • // 기본형태
      closureFunc(closure: {
      print("end")
      })
      
       // 후행 클로저 형태
      closureFunc {
      print("end")
      }
  • 파라미터 생략, 간소화

    •   // 기본 형태
       addClosure(closure: {(a: Int, b: Int) -> Int in 
          return a + b
      })
      
       // 간소화 형태
       addClosure { $0 + $1 }			// $0은 첫번째 파라미터, $1은 두번째 파라미터를 의미

마치며

매번 명확하지 않아 사용하기 어렵고, 코드를 보더라도 잘 이해가 안갔지만 이번에 이렇게 정리를 하면서 클로저의 형태에 좀 익숙해지는 기회가 된거 같다. 물론 이 정리가 아직 완벽하지는 않다. 더 공부를 해서 부족한 부분을 채워 기초가 튼튼해지도록 노력해야겠다.

profile
기본에 충실한 개발자가 목표!

3개의 댓글

comment-user-thumbnail
2024년 10월 28일

오 그럼 고차함수 map 같은 게 클로저를 활용한 추상화로 OCP를 지킨 사례인가여?

답글 달기
comment-user-thumbnail
2024년 10월 28일

클로저도 옵셔널이 있었군요... 하나 배워갑니다

답글 달기
comment-user-thumbnail
2024년 10월 28일

굿 잡 보이

답글 달기