Swift/문법
스위프트(Swift) - 함수(Function) Ⅷ. 클로저(Closure)
전 포스팅에서 마지막에 언급한 클로저는 지금 말하는 클로저와 조금 다른 의미의 객체이다. 실제로 스위프트에서 클로저(Closure)라 객체를 지칭하는 것은 대부분 지금부터 이야기할 클로저를 의미한다. 스위프트에서 클로저는 '일회용 함수'를 작성할 수 있는 구문이다. 일회용 함수란 한 번만 사용할 구문들의 집합이며, 그 형식은 함수로 작성되어 있어야한다는 제약조건이 있을 때 사용하는 함수로 굳이 함수의 이름을 작성할 필요가 없다는 특징을 가져 익명(Anonymous) 함수라고 부르기도 한다. 스위프트에서 제공하는 클로저는 이전 포스팅에서 학습했던 클로저와 그렇게 다른 개념은 아니다. 앞에서 학습했던 개념을 모두 포함한다고 생각하면 된다. 따라서 클로저는 자신이 정의되었던 문맥(Context)으로부터, 모든..
스위프트(Swift) - 함수(Function) Ⅶ. 함수의 중첩
스위프트에서 함수는 중첩하여 사용이 가능하다. 함수 내에 다른 함수를 작성해 사용할 수 있다는 뜻이다. 이렇게 작성된 함수를 중첩함수(Nested Function)라고 하고 중첩함수 중 함수의 내부에 작성된 함수를 내부함수(Inner Fuction), 내부 함수를 포함하는 바깥 함수는 외부함수(Outer Function)으로 구분한다. 함수를 중첩해서 정의하면 내부함수는 외부함수가 실행되는 순간 생성되고, 종료되는 순간 소멸하게된다. 외부함수는 프로그램이 실행될 때 생성되고 프로그램이 종료될 때 소멸하지만, 내부함수는 외부함수의 실행과 종료 사이에서 생겼다가 사라진다. 즉, 외부함수가 종료되면 내부함수도 더는 존재하지 않는 것이다. 이것이 내부 함수의 생명주기(Life Cycle)이다. 내부함수는 일반적..
스위프트(Swift) - 함수(Function) Ⅵ. 일급 함수의 특성
스위프트는 객체지향 언어이자 동시에 함수형 언어이다. 함수형 언어를 학습하면 반드시 일급 객체(First-Class Object)라는 용어를 접하게 되는데 객체가 다음의 조건을 만족하는 경우 이 객체를 일급 객체로 간주한다. 객체가 런타임에도 생성이 가능해야 한다. 인자값으로 객체를 전달할 수 있어야한다. 반환값으로 객체를 사용할 수 있어야한다. 변수나 데이터 구조 안에 저장할 수 있어야한다. 할당에 사용된 이름과 관계없이 고유한 구별이 가능해야한다. 함수가 이런 조건을 만족하면 이를 일급 함수(First-Class Function)라고 하고 그 언어를 함수형 언어로 분류한다. 즉, 함수형 언어에서는 함수가 일급 객체로 대우받는다는 뜻이다. 지금부터 일급함수의 특성에 대해 하나씩 살펴보자. ✅ 일급함수의..
스위프트(Swift) - 함수(Function) Ⅴ. 변수의 생존 범위와 생명 주기
프로그래밍에서 변수와 상수는 정의된 위치에 따라 사용할 수 있고, 생존할 수 있는 일정 영역을 부여받는다. 이를 변수의 생존 범위, 또는 스코프(Scope)라고 한다. 영역을 기준으로 변수를 구분해 보면 크게 전역변수와 지역변수로 나눌 수 있다. 전역변수는 글로벌(Global) 변수라고도 하는데, 프로그램의 최상위 레벨에서 작성된 변수를 의미한다. 이 변수는 프로그램 내 모든 위치에서 참조가 가능하며, 특별한 일이 없으면 프로그램이 종료되기 전까지는 삭제되지 않는다. 반면, 로컬(Local) 변수라고도 불리는 지역변수의 경우 특정 범위 내에서만 참조하고 사용할 수 있는 변수를 뜻한다. 조건문이나 함수 구문 등 특정 실행 블록 내부에서 선언된 변수는 모두 지역변수이며 선언된 블록 범위 안에서만 이 변수를 ..
스위프트(Swift) - 함수(Function) Ⅳ. InOut 매개변수
스위프트에서 함수 내부에서 발생하는 사건은 함수 외부에 영향을 미칠 수 없다. 함수 내부와 외부에 동일한 인자값이 존재하지만 함수 내부에서 변경된 인자값은 함수 외부의 인자값에 아무런 영향도 끼칠 수 없다. 이는 단순히 같은 값을 가지고 있을 뿐, 둘은 단절된 서로 다른 객체이기 때문이다. var cnt = 30 func autoIncrement(value: Int) -> Int { var value = value value += 1 return value } print(autoIncrement(value: cnt)) // 함수 내부의 value 값 : 31 print(cnt) // 외부에서 정의된 cnt 변수값 : 30 cnt 변수를 autoIncrement(value:) 함수의 인자값으로 입력하면 3..
스위프트(Swift) - 함수(Function) Ⅲ. 가변인자, 기본값, 수정
가변인자 보통 함수는 정의된 형식과 개수에 맞는 인자값만 처리하지만, 때에 따라서 가변적인 개수의 인자값을 입력받아야할 경우도 분명 존재한다. 스위프트에선 인자값의 입력 개수를 제한하지 않도록 하는 함수 정의 형식을 제공하는데, 함수를 정의할 때 매개변수명 다음에 '...' 연산자를 추가하면된다. func 함수명(매개변수명 : 매개변수타입...) 이런식으로 정의된 매개변수는 가변인자로 인식되며 개수를 제한하지 않고 인자값을 입력받게된다. 이렇게 입력된 인자값을 스위프트는 배열로 처리하게 된다. 다음 예시를 살펴보자. func avg(score: Int...) -> Double { var total = 0 // 점수 합계 for i in score { // 배열로 입려된 값들을 순회하며 점수 합산 tota..