티스토리 뷰

CS/Swift

[Swift]Closure

Napster 2017. 11. 1. 13:31

[Swift]Closure

스위프트에서 클로저를 활용하는이유는 함수중심으로 프로그래밍을 할 수 있기 때문이다. 메모리가 싸졌으니 메모리를 늘리는걸로 사용하자, 즉 비효율적일것 같은 코드도 신경을 쓰지 말고 사용하라는 취지.,..

==================

  • 함수가 제일 중요하다.

  • 함수를 타입으로 지정하거나,

  • 함수를 인자값으로 넘기거나,

  • 함수를 리턴값으로 받을 수 있다.

==================

Closure의 이름은 수학의 람다계산식(lamda Calculus)의 구현체이다. 그리고 Closure는 이름없는 함수로 작성가능하다. 하지만 이름없는 함수가 Closure 전체를 대신하지는 않는다.전통적으로 컴퓨터 계산기의 계산방식은 두가지 방식이있다.

Turing machine ->  절차지향, 컴퓨터구조 발전, 객체지향
Lamda Calculus -> 함수형프로그래밍

두가지가 합쳐진 방식이 요즘 추세를 이루고있다.

어떠한 함수가 함수 밖의 변수를 의존해서 값이 달라지는건 순수하지 않은 함수라고 표현한다.수학에서 이야기하는 함수는 수수해야함으로 프로그래밍방법도 순수한 함수를 작성해야한다.

temp: Int = 1
func multi(x: Int, y: Int) -> Int{
return x * y * temp
} //순수하지않다

var intValue = 10
let increment = {(n: Int) in
intValue = intValue + n
}
increment(5)
print(intValue) //15

let c10 = increment
intValue = 100
c10(10)
print(intValue) //110

위의 함수는 순수하지 않다. 클로저는 선언된 범위의 변수를 캡처해서 저장하고 닫는다.(변수의 값을 참조하지는 않는다. 그래서 위와같은 결과를 갖게됨) 변수를 닫아서 사용하는 개념 하지만 스위프트 클로저는 캡처한 변수를 참조할 뿐이다. 그래서 호출될때 전역변수처럼 사용된다. (스위프트의 클로저는 순수한 함수는 아니다.)

var intValue = 10
let increment = {
[intValue] (n: Int) in
print(intValue + n)
}//이건 값과 변수를 둘다 캡처한다. 즉 순수한 함수의 모양이다.

위와같은 방법으로 사용하면 스위프트에서도 순수한 함수의 모습을 가질 수 있다. 따라서 두가지 방법을 가질 수 있다는 것이다!

고차함수

매개변수로 함수를 넘길때 고차함수라고한다.

추상화가 일어나면 정보가 줄어들거나 차원이 줄어들어야한다. 추상화하고나면 정보가 그대로 남아있으면 안된다. 간접참조와 추상화의 개념은다르다. 참조의 개념은 값이 사라지지않고 한다리 걸쳐서 넘겨져 있는 것이다. 그만큼 복잡도가 올라간다. 상황에 따른 동작이 달라 질 수 있다.

밖에서 참조해야할 것은 무엇인지, 숨길것은 있는지 SOLID한지(객체의 순수함을 표현할때 사용) 구조체와 클래스 사용의 명확성을 알아야한다. Swift에서..

스위프트의 타입은 모든 것이 상속 없이 구조체입니다. 그 이유는 각 타입 간의 커플링을 가능한 한 느슨하게 하고 전체 타입 시스템에서 확장될 수 있도록 하기 위해서입니다. 덕분에 클린 아키텍처를 만들 수 있기때문이다.

Swift의 가장 좋은 점은 옵셔널이다.

'CS > Swift' 카테고리의 다른 글

[Swift]오늘의 이슈 - 예외처리관련  (0) 2017.11.05
[Swift]String 문자열 하나씩 쪼개기  (1) 2017.11.03
[Swift]함수  (0) 2017.11.01
[Swift]흐름제어  (0) 2017.11.01
[Swift]기본, 데이터 타입  (0) 2017.11.01
Comments