안녕하세요 오늘은 1급 객체에 대해 공부해 보겠습니다.
Swift에 대해 공부하다 보면 클로저 등에서
함수형 프로그래밍, 1급 객체라는 용어들이 등장합니다.
그래서 추후 다른 개념들을 공부하기 전에
먼저 확실히 알아두려고 합니다.
1. 함수형 프로그래밍
함수형 프로그래밍은 말 그래도 함수 중심으로 프로그래밍을 한다는 것입니다.
조금 더 정확히 하면,
상태 변경(Side Effect)을 최소화하고, 순수 함수(Pure Function)를 조합해서 문제를 해결하는 프로그래밍 패러다임입니다.
말이 어렵기에 코드로 예시를 들어보겠습니다.
var total = 0
func add(_ x: Int) {
total += x
}
add 함수는 정수 값을 받아서 total 더해주는 함수입니다.
이 함수는 total값의 변동 즉 상태 변화(Side Effect)를 일으킵니다.
이러한 함수의 문제점이 무엇일까요?
var total = 0
func add(_ x: Int) {
total += x
}
func minus(_ x: Int) {
total -= x
}
이번엔 minus 함수가 추가되었습니다.
minus 함수는 정수 값을 받아 total 값을 빼 줍니다.
그런데 만약 total의 값에 변동이 생겼다면,
어떤 함수가 total의 값을 변화시켰을까요?
이렇게 total을 다루는 함수가 많아진다면
어떤 함수가 total의 값을 변동시켰는지 추적하기 어렵습니다.
또한 add함수가 여러 곳에서 동시에 실행된다면
멀티 스레드 환경에서 값이 꼬일 수도 있습니다.
이러한 문제점들을 보완하는 함수가 순수함수(Pure function)입니다.
func add(_ a: Int, _ b: Int) -> Int {
return a + b
}
이런 식으로 외부 상태를 변경하지 않고(외부 변수에 값을 변동시키는 것이 아닌 return으로 값을 반환)
외부 상태를 변동시키지 않기에 상태 변화를 일으키지 않기에 스레드 문제 등이 일어나지 않는다는 장점이 있습니다.
3. 1급 객체(First-Class Object)
1급 객체는 이러한 특징이 있습니다.
1. 객체가 런타임에도 생성 가능하다
2. 객체를 인자 값으로 전달할 수 있어야 한다.
3. 객체를 반환 값으로 사용할 수 있어야 한다.
4. 데이터 구조 안에 저장할 수 있어야 한다.
코드를 보면서 알아보겠습니다.
func greet() {
print("Hello")
}
let f = greet
f() // Hello
greet라는 함수를 변수에 저장해서 사용하는 모습을 보실 수 있습니다.
이렇게 함수 자체를 변수에 담는 것이 가능합니다.
func run(_ action: () -> Void) {
action()
}
func sayHi() {
print("Hi")
}
run(sayHi)
run 함수를 만들 때 함수의 매개변수로 함수를 전달하고 있습니다.
이처럼 함수의 인자로 전달이 가능합니다.
func makeMultiplier(_ x: Int) -> (Int) -> Int {
return { y in
return x * y
}
}
let double = makeMultiplier(2)
double(5) // 10
makemultiplier 함수는 반환값으로 함수를 반환하고 있습니다.
(클로저를 반환하고 있습니다 클로저 또한 함수이기에 함수라고 지칭하겠습니다.)
이렇게 함수의 반환값으로 함수를 반환할 수 있습니다.
'Swift' 카테고리의 다른 글
| Swift - 클래스(Class) (0) | 2026.04.15 |
|---|---|
| Swift - 옵셔널(Optional) (0) | 2026.03.27 |
| Swift -Async Await (0) | 2026.03.26 |
| Swift - Generic (0) | 2026.02.27 |
| Swift - ARC(Automatic Reference Counting) (0) | 2026.02.26 |