클로저에 대해서

이하연·2021년 9월 16일
0

[Swift] 스위프트

목록 보기
13/27

Swift 언어의 특징 중 하나는 "함수형 프로그래밍"이라는 점입니다.

이 함수형 프로그래밍을 이해하기 위해서 필요한 개념이 "클로저"입니다,


함수형 프로그래밍

정의

기존에 있던 객체지향 프로그래밍이나 C언어에서는 어떤 값이나 상태 변화를 중요하게 여기지만,

함수형 프로그래밍에서는 어떤 함수 자체를 활용해서 변하는 결과를 중요시 하는 것이 가장 큰 차이입니다.

예시

예를 들면,

어떤 인자를 주고 받는 과정에서 여러 처리가 되는 동안 같은 인스턴스에 접근하게 되면 어떻게 될까?

객체지향, 절차지향 프로그래밍의 프로그램 처리 과정에서는 결과에 큰 영향을 미칠 것 입니다.

함수형 프로그래밍에서는 순수하게 함수에 전달되고 그에 의해 처리 된 결과만을 중요하게 생각할 것 입니다.

이렇게 됬을 경우 어떤 많은 처리가 필요할 때 서로에게 독립적으로 작동하기에 부작용이 없어지게 될 것 입니다.

이렇듯 함수형 프로그래밍 패러다임을 차용하면 병렬처리에서 큰 강점이 있습니다.


클로저

정의

클로저란 어떤 기능을 하는 코드를 하나의 블럭으로 모아놓은 것을 의미합니다.

따라서 함수도 클로저의 한 형태라고 볼 수 있습니다.

특징

  • 클로저의 가장 큰 특징은 클로저가 선언된 위치가 있을 것 입니다.
    그 위치에서 어떤 상태를 캡쳐하고 참조를 얻을 수 있다는 것 입니다.
  • 클로저는 일급 객체입니다. ( 아래 참조 )
  • 클로저는 문맥을 이용하여 좀 더 간결하게 표현이 가능
    • 반환 타입 유추, 매개변수 타입 유추, 매개변수 생략, return 키워드 생략

형태

{ (매개변수) -> 반환타입 in
    코드 블럭
}

예시

// 이름 변수
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]

// 함수 형태
func backward(_ s1: String, _ s2: String) -> Bool {
    return s1 > s2
}

let reversedNames = names(by: backward)

// 클로저 사용
let reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in
    return s1 > s2
})
// 반환 타입 유추, 매개변수 타입 유추 경우 
let reversedNames = names.sorted(by: { (s1, s2) in
    return s1 > s2
})

// 매개변수 생략
// $0, $1, $2, $3, .... 등을 이용해 매개변수를 선언할 필요도 없음
// 이렇게 되면 실행 코드와 매개변수 구분을 위해 사용했던 in을 사용할 필요도 없음
let reversedNames = names.sorted(by: {
    return $0 > $1
})

// return 키워드 생략 
// return 키워드 조차 문맥을 통해 마지막 줄이 return으로 유추 가능
let reversedNames = names.sorted(by: { $0 > $1 })

// 후행 클로저
// (by: ) 소괄호를 없앰
let reversedNames = names.sorted { $0 > $1 }

일급 객체란

  • 전달인자로 전달 할 수 있음
  • 동적 프로퍼티에 할당이 가능
  • 변수나 데이터 구조 안에 담을 수 있음
  • 반환 값으로 사용 가능
  • 할당할 때 사용된 이름과 관계없이 고유한 객체로 구별가능

참조

[SWIFT] Closure(클로저)

0개의 댓글