1급 객체 (first class object) 또는 1급 시민 (first class citizen)
Swift의 함수는 1급 객체 또는 1급 시민입니다. 아마 1급 객체 라는 용어에 대해서 낯서실 겁니다. 1급 객체에 대해서 먼저 알아보도록 하겠습니다.
Swift에서 "1급 객체" 또는 "1급 시민" (first-class object/citizen)은 다음과 같은 특성을 가진 개체를 가리킵니다:
- 변수에 할당 가능 : 1급 객체는 변수에 할당할 수 있습니다. 즉, 함수나 값 등을 변수에 저장하고 전달할 수 있습니다.
- 함수의 매개변수로 전달 가능 : 1급 객체는 다른 함수의 매개변수로 전달될 수 있습니다. 즉, 함수를 다른 함수의 인자로 사용할 수 있습니다.
- 반환값으로 사용 가능 : 1급 객체는 다른 함수의 반환값으로 사용될 수 있습니다. 즉, 함수가 다른 함수를 반환할 수 있습니다.
- 데이터 구조에 저장 가능 : 1급 객체는 배열이나 딕셔너리와 같은 데이터 구조에 저장될 수 있습니다.
- 익명으로 정의 가능 : 1급 객체는 이름 없이 익명으로 정의될 수 있는 람다식(클로저)과 같은 형태로 표현될 수도 있습니다.
Swift에서 클로저(closure)와 일반적인 함수 모두 아까 위에서 말했던 거처럼 1급 객체입니다. 이들은 위에서 언급한 특성을 모두 가지며, 변수에 할당하거나 매개변수 및 반환값으로 사용할 수 있는 등 유연한 방식으로 처리할 수 있습니다.
1급 객체 or 1급 시민의 특징
그럼 이제 각 특징별로 소스 코드와 함께 보도록 하겠습니다.
변수에 할당 가능
먼저 변수에 할당 가능한 특징부터 소스로 살펴보겠습니다.
func inchesToFeet (inches: Float) -> Float {
return inches * 0.0833333
}
let toFeet = inchesToFeet //함수를 자료형처럼 사용
print(inchesToFeet(inches:10))
print(toFeet(10)) //주의 : argument label인 (inches:) 안 씀
원래는 상수 또는 변수에 자료형을 할당하게 되지만 Swift에서는 함수도 자료형처럼 변수에 할당할 수 있습니다. 위 코드에서 toFeet 라는 상수에 inchesToFeet라는 함수를 넣은 것처럼 말이죠.
함수를 매개변수로 사용
다음은 함수를 매개변수로 사용하는 특징입니다.
func inchesToFeet (inches: Float) -> Float {
return inches * 0.0833333
}
let toFeet = inchesToFeet
이 코드는 inchesToFeet라는 함수를 정의합니다. 이 함수는 Float 타입의 inches라는 하나의 인자를 받습니다. 이 함수는 1피트에 12인치가 들어가기 때문에 인치를 피트로 변환하기 위해 인치 수를 0.0833333 (즉, 1/12)로 곱합니다. 그리고 그 결과를 Float로 반환합니다.
그리고 'inchesToFeet 함수를 toFeet라는 상수에 할당합니다. Swift에서 함수는 1급 객체이기 때문에 함수를 변수나 상수에 할당할 수 있습니다. 이 경우에는 inchesToFeet 함수에 대한 별칭을 만들어서 toFeet 상수로 사용할 수 있도록 합니다.
함수를 return 값으로 사용
다음은 함수를 리턴값으로 사용하는 특징입니다.
func inchesToFeet (inches: Float) -> Float {
return inches * 0.0833333
}
func inchesToYards (inches: Float) -> Float {
return inches * 0.0277778
}
let toFeet = inchesToFeet
let toYards = inchesToYards
이 코드는 inchesToFeet 함수와 inchesToYards 함수를 정의합니다. 이 두 함수는 Float 타입의 inches라는 하나의 인자를 받습니다. inchesToFeet 함수는 인치를 피트로 변환하고, inchesToYards 함수는 인치를 야드로 변환합니다. 변환 계수는 각각 0.0833333 (즉, 1/12)와 0.0277778 (즉, 1/36)로 설정되어 있습니다.
7~8행 부분은 inchesToFeet 함수를 toFeet 상수에, 그리고 inchesToYards 함수를 toYards 상수에 할당합니다. 이렇게 하면 각 함수를 나중에 이 별칭 상수를 사용하여 호출할 수 있게 됩니다.
데이터 구조에 저장 가능
다음은 데이터 구조에 저장 가능한 특징입니다.
var operationsArray: [(Int, Int) -> Int] = []
func add(a: Int, b:Int ) ->Int {
return a + b
}
operationsArray.append(add)
let result = operationsArray[0](10 ,5)
print(result) // 출력 결과 : 15
먼저 operationsArray라는 배열을 정의합니다. 이 배열은 함수를 저장하기 위한 배열로, 함수 시그니처가 (Int, Int) -> Int인 함수를 저장할 수 있도록 선언됩니다. 이 함수 시그니처는 두 개의 Int 인자를 받고, Int를 반환하는 함수를 의미합니다.
그리고 add라는 함수를 정의합니다. 이 함수는 두 개의 Int 타입 인자 a와 b를 받아서 더한 결과를 Int로 반환합니다. 그 후 add 함수를 operationsArray 배열에 추가합니다. 이렇게 하면 add 함수가 배열 안에 저장됩니다.
operationsArray 배열의 첫 번째 요소, 즉 add 함수를 호출합니다. 이 때, 10과 5가 add 함수의 a와 b로 전달됩니다. 함수를 호출하면 두 숫자를 더한 결과가 result에 저장됩니다.
마지막으로, result를 출력합니다. 이 코드에서 add 함수가 호출되어 10과 5를 더한 결과인 15가 출력됩니다.
익명으로 정의 가능
다음은 마지막 특징인 익명으로 정의 가능한 특징입니다.
let squareClosure = { (number:Int ) in number * number }
let squaredValue = squareClosure(5)
print(squaredValue) // 출력 결과 : 25
위 코드에서 squareClosure라는 변수에 익명의 클로저가 할당되었습니다. 이 클로저는 하나의 매개변수 number를 받고, 해당 숫자의 제곱 값을 반환합니다.
클로저 정의 형식은 다음과 같습니다.
{ (매개변수들) -> 반환타입 in
// 실행 코드
}
따라서 위 예제에서는 (number: Int)이 매개변수 형식이고, Int가 반환 타입입니다. 중괄호 {} 안에 있는 실행 코드에서는 매개변수 number를 사용하여 계산을 수행하고 그 결과를 반환합니다.
클로저는 익명 함수처럼 동작하며, 변수에 할당된 후 호출할 수 있습니다. 위 예제에서 squareClosure(5)와 같이 클로저를 호출하여 인자값으로 5를 전달하면, 내부적으로 클로저 실행 코드가 실행되어 숫자 5의 제곱 값을 계산한 후 반환됩니다. 이 값인 25가 squaredValue 상수에 저장되어 출력문을 통해 화면에 출력됩니다.
감사합니다.
틀린 부분이 있거나 더 좋은 내용 훈수 환영합니다!
공감과 댓글 부탁드립니다.
'Apple > Swift' 카테고리의 다른 글
[Swift] 클로저 개념 완벽 이해하기 (0) | 2023.10.17 |
---|---|
[Swift] 클로저(Closure) (0) | 2023.10.16 |
[Swift] 가변 매개변수, call by address 구현 (0) | 2023.10.12 |
[Swift] guard~let, 디폴트 매개변수 정의, 함수 응용 (0) | 2023.10.11 |
[Swift] Raw Values (원시 값) (0) | 2023.10.10 |