저번주 5주차에 함수에 대해서 다뤘습니다. 이번에는 6주차 내용인 일급객체와 클로저에 대해서 알아보도록 하겠습니다.
[1급 객체]
1급 객체(1급 시민)란? 1. 변수를 저장할 수 있어야 하고, 2. 매개변수를 전달할 수 있고, 3. 리턴값을 사용해 이 세가지의 조건을 충족하는 것들을 1급 객체 혹은 1급 시민이라고 부릅니다.
1급 객체를 예시로 함수로 예를 들 수 있는데요. 그 이유는 함수를 데이터 타입처럼 처리할 수 있고, 매개변수의 값을 받고 그 값을 바탕으로 다시 리턴을 할 수 있기 때문에 swift에서는 함수를 1급 객체로 예를 들 수 있습니다.
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)
upDown(Fun : toDown, value : 10) //함수를 통해서 변수를 저장하고(1),
//매개변수로 값을 전달함. (2)
func decideFun(x : Bool)->(Int)->Int{
if x {
return toUp //리턴값을 사용함 (3)
} else{
return toDown //리턴값을 사용함 (3)
}
}
let r = decideFun(x : true)
print(type(of:r))
print(r(10))
해당 소스처럼 swift에 함수는 1급 객체인것을 알 수 있습니다. 그 이유에는 세 가지의 조건이 포함이 되어야 하는데.
(1) 변수를 저장할 수 있다.
(2) 매개변수로 전달할 수 있다.
(3) 리턴값을 사용할 수 있다.
이 세 가지가 모두 충족이 돼서 해당 실습 소스에서는 함수가 1급 객체인것을 알 수 있습니다.
[클로저]
클로저란? 특정 작업(함수)과 그 작업이 일어난 곳(함수 블록 안에 환경 또는 상태)을 모두 기억하고 있는 도구.
swift에서는 클로저라고 부릅니다. 익명함수라고 생각할 수 있는데 익명함수보다는 큰 개념이라고 생각하면 될것 같습니다.
원래 평상시에 함수를 정의하고 사용하는 방법은
func add(x: Int, y: Int) -> Int {
return(x+y)
}
print(add(x:10, y:20))
print(type(of:add))
이러한 방식으로 사용할 수 있습니다.
이렇게 함수를 정의해서 매개변수 값으로 x의 10과 y의 20의 값을 매개변수로 전달하고 그 값을 더해서 연산한 값을 다시 리턴하는게 원래의 프로그래밍하는 방식이라면
클로저 표현식은
클로저 표현식은 매개변수를 받거나, 값을 반환하도록 만들 수도 있음
{(<매개변수 이름>: <매개변수 타입>, … ) -> <반환 타입> in // 클로저 표현식 코드 }
(출처 - youtube : SmileHan closer 기초
https://www.youtube.com/watch?v=KyBFD3OTIQ8)
let add1 = { (x: Int, y: Int) -> Int in
return(x+y)
}
print(add1(10, 20))
print(type(of:add1))
익명함수 처럼 함수명을 정의되어 있지않고 변수명으로 저장을 합니다. 또, 클로저 표현방식으로 데이터 타입을 지정하고 나서 블록({}) 을 여는것이 아니라 " in " 을 사용함으로 블록을 여는것과 같은 방식을 사용할 수 있습니다.
하지만 기존에 사용하던 소스 방식과는 다른점은 add1이 함수가 아닌 변수 즉, 상수 변수로 값을 넣었기 때문에
출력문에서 다른것을 알 수 있습니다.
예를 들어서
let add1 = { (x: Int, y: Int) -> Int in
return(x+y)
}
print(add1(x:10, y:20))
해당 소스처럼 함수를 호출하듯이 출력문을 작성하게 되면
사진 처럼 오류가 나오는것을 알 수 있습니다.
해당 문제점은 "변수명으로 선언을 했는데 왜 값을 x:, y: 처럼 레이블을 이용해서 인자를 보내냐"에 문제인데
이것을 해결할려면
레이블(x: , y:)를 추가하지않고 그냥 값만 넘기면 해결되는 문제입니다.
let add1 = { (x: Int, y: Int) -> Int in
return(x+y)
}
print(add1(10, 20))
print(type(of:add1))
해당 소스처럼 그냥 레이블을 넣지 않고 값만 넘기면 출력이 되는것을 알 수 있고, 리턴형은 기존 프로그래밍 방식과 비슷하게 Integer 형으로 출력이 되는것을 알 수 있습니다.
이것으로 이번주에 1급 객체(1급 시민)과 클로저 기초에 대해서 알아봤습니다.
다음 시간에는 클래스에 대해서 알아보도록 하겠습니다. 감사합니다 :)
'iOS 프로그래밍 기초' 카테고리의 다른 글
[iOS프로그래밍 기초] 7주차 (3) | 2024.10.17 |
---|---|
[iOS 프로그래밍 기초] 6주차 클래스/ failable/ initialize (4) | 2024.10.10 |
[iOS 프로그래밍 기초] 4주차 (1) | 2024.09.26 |
[iOS 프로그래밍] 3주차 (0) | 2024.09.19 |
[iOS 프로그래밍 기초] 2주차 (0) | 2024.09.12 |