Swift의 함수는 1급 객체입니다.
1급 객체(First-class object) 또는 1급 시민(First-class citizen)은 프로그래밍 언어에서
특정 개체 또는 요소에 부여되는 권한 및 특징을 나타내는 개념입니다.
이 개념은 프로그래밍 언어가 어떤 요소를 다루는 방식을 설명하고, 어떤 종류의 작업을 지원하는지를 나타냅니다.
다음 조건을 충족하는 객체를 1급 객체라고 합니다.
(1) 변수나 데이터 구조 안에 저장할 수 있어야 합니다.
(2) 함수의 매개변수로 전달할 수 있어야 합니다.
(3) 함수에서 반환값으로 사용할 수 있어야 합니다.
(4) 런타임(실행 시간)에 생성할 수 있어야 합니다.
Copy code
func add(_ a: Int, _ b: Int) -> Int {
return a + b
}
var operation: (Int, Int) -> Int = add // 함수를 변수에 할당
let result = operation(3, 4) // 변수를 통해 함수 호출
Copy code
func applyOperation(_ operation: (Int, Int) -> Int, _ a: Int, _ b: Int) -> Int {
return operation(a, b)
}
let sum = applyOperation(add, 5, 6) // 함수를 인수로 전달
func makeIncrementer(incrementAmount: Int) -> (Int) -> Int {
func increment(_ x: Int) -> Int {
return x + incrementAmount
}
return increment
}
let incrementByTwo = makeIncrementer(incrementAmount: 2)
let result = incrementByTwo(5) // 5 + 2 = 7
func makeMultiplier(_ multiplier: Int) -> (Int) -> Int {
return { value in
return value * multiplier
}
}
let timesTwo = makeMultiplier(2) // 런타임에 함수 생성
let result = timesTwo(4) // 4 * 2 = 8
클로저(Closure)는 코드 블록 또는 함수와 유사한 역할을 하는 익명 함수입니다.
클로저는 다른 함수로 전달하거나 변수에 할당할 수 있는 코드 조각으로, 주로 함수형 프로그래밍 패러다임을 지원하고,
코드를 모듈화하고 재사용 가능하게 만들기 위해 사용됩니다.
클로저는 다음과 같은 특징을 가지고 있습니다.
(1) 익명 함수: 클로저는 이름이 없는 함수로, 필요한 곳에서 직접 정의하여 사용할 수 있습니다.
(2) 변수나 상수에 저장 가능: 클로저는 변수나 상수에 할당하여 나중에 사용할 수 있습니다.
(3) 함수의 매개변수로 전달 가능: 다른 함수의 인수로 클로저를 전달할 수 있으며, 이를 통해 다양한 동작을 인수로 전달할 수 있습니다.
(4) 함수의 반환값으로 사용 가능: 함수는 클로저를 반환할 수 있으며, 클로저를 통해 다른 함수에서 생성된 로직을 반환할 수 있습니다.
(5) 주변 범위의 변수 및 상수 캡처: 클로저는 주변 범위에 있는 변수와 상수를 캡처하고 저장할 수 있으며, 나중에 사용할 때 해당 값에 접근할 수 있습니다.
스위프트에서 클로저의 일반적인 형태는 다음과 같이 생겼습니다:
{ (매개변수) -> 반환값 in
// 클로저의 실행 코드
}
예를 들어, 간단한 두 숫자를 더하는 클로저는 다음과 같이 작성할 수 있습니다:
let addClosure = { (a: Int, b: Int) -> Int in
return a + b
}
let result = addClosure(3, 4) // 클로저를 호출하여 결과를 얻음
클로저 표현식은 다른 함수의 인수로 전달되거나 변수에 할당할 때 주로 사용됩니다. 기본적인 형태는 다음과 같습니다
let closureName = { (매개변수) -> 반환타입 in
// 클로저의 실행 코드
}
예를 들어, 간단한 정렬을 위한 클로저를 사용한 코드
let numbers = [5, 2, 9, 1, 5, 6]
let sortedNumbers = numbers.sorted(by: { (a, b) -> Bool in
return a < b
})
후행 클로저는 함수의 마지막 인수로 전달되는 클로저를 깔끔하게 작성하는 방법입니다. 이것은 코드를 읽기 쉽게 만들어줍니다. 클로저 표현식을 사용할 때 중괄호 {}를 생략할 수 있습니다.
예를 들어, 위의 정렬 예제를 후행 클로저로 작성할 수 있습니다:
let sortedNumbers = numbers.sorted { (a, b) -> Bool in
return a < b
}
반환 타입이 명확하다면 생략할 수 있으며, 간단한 라인 클로저로 작성할 수도 있습니다:
let sortedNumbers = numbers.sorted { a, b in a < b }
더 간단하게, 연산자를 사용하여 클로저를 작성할 수도 있습니다:
let sortedNumbers = numbers.sorted(by: <)
클래스는 객체를 생성하기 위한 설계도 또는 템플릿입니다.
클래스는 속성(프로퍼티)과 동작(메서드)을 정의합니다.
예를 들어, "자동차" 클래스는 자동차의 특징(색상, 속도)과 행동(주행, 정지)을 정의할 수 있습니다.
객체는 클래스의 인스턴스로, 클래스를 바탕으로 실제로 생성된 것입니다.
객체는 클래스의 속성을 가지며, 클래스에서 정의한 동작(메서드)을 수행할 수 있습니다.
예를 들어, "플레이스테이션" 클래스로부터 생성된 실제 플레이스테이션 기기는 객체입니다.
인스턴스는 객체와 동의어로 사용되며, 클래스에서 생성된 실제 개체를 가리킵니다.
객체는 클래스의 인스턴스이며, 객체를 클래스의 인스턴스라고 부를 수 있습니다.
예를 들어, "아이언맨" 클래스에서 생성된 "토니 스타크" 객체는 "아이언맨" 클래스의 인스턴스 또는 "토니 스타크"의 인스턴스입니다.
메서드는 클래스나 객체에 속한 함수 또는 동작을 나타냅니다.
메서드는 클래스의 행동을 정의하며, 객체가 클래스의 동작을 수행할 수 있도록 합니다.
예를 들어, "자동차" 클래스의 메서드는 "주행" 또는 "정지"와 같은 동작을 정의할 수 있습니다.
// 클래스 정의
class Dog {
var name: String = ""
var age: Int = 0
// 메서드 정의
func bark() {
print("\(name)가 멍멍 짖어요!")
}
}
// 클래스의 인스턴스(객체) 생성
let myDog = Dog()
// 객체의 속성 설정
myDog.name = "뽀삐"
myDog.age = 2
// 객체의 메서드 호출
myDog.bark()