About Swift – “first class object, 1급 객체”
About Swift – “first class object, 1급 객체”
First class object, 1급 객체란?
- 변수에 저장할 수 있고,
- 매개변수로 전달할 수 있고,
- 리턴값으로 사용할 수 있는 것
들을 1급 객체(first class object) 혹은 1급 시민(first class citizen)이라고 합니다.
Swift에서 함수는 1급 객체입니다. 위의 조건들을 모두 충족한다는 것인데요, 하나하나 알아보도록 하겠습니다.
func kgTolbs (kg: Float) -> Float { // tolbs 함수를 정의
return kg*2.205
}
var tolbs = kgTolbs // tolbs라는 변수(let도 가능)에 저장
print(kgTolbs(kg:1.0)) // 일반적인 함수 호출
print(tolbs(2.0)) // 함수를 변수에 저장했을 때 호출, 매개변수명을 쓰지 않습니다.
함수를 상수 또는 변수에 할당하는 것이 가능하고, 함수를 호출하려면 할당된 상수나 변수의 이름으로 호출할 수 있는 예제입니다.
func kgTolbs (kg: Float) -> Float {
return kg*2.205
}
var tolbs = kgTolbs
func outputConversion(converterFunc: (Float) -> Float, value: Float) {
let result = converterFunc(value)
print("Result = \(result)")
}
outputConversion(converterFunc:tolbs, value: 10)
첫째로, kg
를 lbs
로 바꾸어주는 kgTolbs
함수는 Float형 매개변수를 받아 Float
형 결과를 반환하기에 함수의 자료형은 (Float)->Float
입니다. 매개변수로 함수를 받으려면, 함수를 받게 될 함수는 함수의 데이터 타입을 선언합니다.
코드를 보시면, outputConversion
이라는 함수를 새로 만들었는데, 이는 두 개의 매개변수를 받습니다. converterFunc
라는 변수는 함수의 데이터 타입인 (Float) -> Float
를 선언하면 되는 것입니다. 이렇게 하면, (Float) -> Float
자료형을 가지는 함수를 매개변수로 사용할 수 있습니다. outputConversion(converterFunc:tolbs, value: 10)
에서 converterFunc
의 변수 자료형을, 함수가 저장되어 있는 변수 tolbs로 하였네요.
func kgTolbs (kg: Float) -> Float {
return kg*2.205
}
var tolbs = kgTolbs
func kgTog (kg: Float) -> Float {
return kg*1000
}
var tog = kgTog
func decideFunction (a: Bool) -> (Float) -> Float
{
if a
{
return tolbs //함수를 리턴
}
else
{
return tog
}
}
let x = decideFunction(a:false)
print(x) // 함수를 반환합니다.
Boolean
매개변수의 값이 무엇인지에 따라, 함수가 반환될 수 있는 코드입니다. 위의 내용들을 한꺼번에 알아봅시다.
func up(num: Int) -> Int
{
return num + 1
}
func down(num: Int) -> Int
{
return num - 1
}
let toUp = up
print(up(num:10))
print(toUp(10))
let toDown = down
func upDown(Fun: (Int) -> Int, value: Int)
{
let result = Fun(value)
print("결과 = \(result)")
}
upDown(Fun:toUp, value: 10) //toUp(10)
upDown(Fun:toDown, value: 10) //toDown(10)
func decideFun(x: Bool) -> (Int) -> Int
{
if x
{
return toUp
}
else
{
return toDown
}
}
let r = decideFun(x:true) // let r = toUp
print(type(of:r)) //(Int) -> Int
print(r(10)) // toUp(10)
첫째로 up이라는 함수와 down이라는 함수는 매개변수에서 1을 더하거나 빼서 리턴해주는 함수입니다. 함수는 1급 객체이고, 그것은 변수나 상수에 대입할 수 있음을 의미하므로 up
이라는 함수와 down
이라는 함수는 toUp, toDown
이라는 상수에 저장할 수 있습니다.
16줄에 upDown
이라는 함수를 살펴봅시다. Fun
이라는 이름의 매개변수와, value
라는 이름의 매개변수를 가집니다. 그런데, Fun
이라는 이름의 매개변수의 자료형은 (Int)->Int
입니다. 함수의 자료형 자체가 매개변수형의 자료형이 되는 것이고, 함수 자체가 매개변수로 사용될 수 있음을 의미합니다. 그러므로, Fun(value)
의 의미는, “자료형이 (Int) -> Int
인 함수에 (value)
라는 매개변수를 가진다” 를 의미합니다. Updown
함수는 그 이후 result
의 값을 내보내는데, 그것이 무엇인지, 어떻게 되는지 22, 23번줄을 보시면 알 수 있을 것입니다.
다시 한번 정리해 봅시다. Updown
함수는 (Int)-
>Int
인 자료형을 가지는 Fun
이라는 매개변수와, Int
형을 가지는 value
라는 매개변수를 가집니다. upDown(Fun:toUp, value: 10)
코드로 upDown
함수를 호출했습니다. Fun
에는 toUp
이라는 상수를 대입했는데, 이 상수에는 up
함수가 저장되어 있습니다(11번 줄). 그러므로, Fun(value)
는 up(10)
으로 계산되는 논리의 순서가 되는 것입니다.
25줄의 decideFun
이라는 함수는 Bool
형을 가지는 x
라는 매개변수를 가지고, (Int)->Int
의 자료형으로 리턴해준다고 합니다. 여기서 알 수 있는 것은 함수 자체가 함수의 반환값이 될 수 있다는 것입니다.
제가 이해한 함수의 일급 시민, 일급 객체 관련 정리입니다.