About Swift – “first class object, 1급 객체”

About Swift – “first class object, 1급 객체”

10월 2, 2021

First class object, 1급 객체란?

  1. 변수에 저장할 수 있고,
  2. 매개변수로 전달할 수 있고,
  3. 리턴값으로 사용할 수 있는 것

들을 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)

첫째로, kglbs로 바꾸어주는 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의 자료형으로 리턴해준다고 합니다. 여기서 알 수 있는 것은 함수 자체가 함수의 반환값이 될 수 있다는 것입니다.

제가 이해한 함수의 일급 시민, 일급 객체 관련 정리입니다.

Leave A Comment

Avada Programmer

Hello! We are a group of skilled developers and programmers.

Hello! We are a group of skilled developers and programmers.

We have experience in working with different platforms, systems, and devices to create products that are compatible and accessible.