오늘은 클로저(Closure) 를 실습하며 클래스를 활용하는 방법을 학습했다.
클로저(Closure) 는 코드에서 전달 및 사용할 수 있는 독립적인 기능 블록으로, 다른 함수나 변수에 저장될 수도 있고, 함수의 매개변수로 전달될 수도 있다.
Swift에서 일급 객체(First-Class Citizen) 이므로 변수, 상수에 저장되거나 함수의 매개변수로 전달 가능하다.
🔹 클로저의 기본 형태
{ (매개변수 목록) -> 반환타입 in
실행할 코드
}
Test 클래스를 생성 private 접근제어자 사용 myClosure Void "MyClosure를 설정"을 출력 Int 타입의 숫자 2개, 연산을 담당하는 클로저 Int 2개를 받아 Void를 반환 class Test {
private var myClosure: (() -> Void) = {} // 클로저 변수 생성
func setMyClosure(_ closure: @escaping (() -> Void)) {
self.myClosure = closure // 클로저 변수 설정
myClosure() // 설정한 클로저 실행
}
func calculator(_ num1: Int, _ num2: Int, _ operate: (Int, Int) -> Void) {
operate(num1, num2) // 클로저 실행
}
}
// 클래스 인스턴스 생성
let test = Test()
// 클로저 설정
test.setMyClosure { print("MyClosure를 설정") }
// 덧셈 연산 (클로저 축약 전)
test.calculator(10, 20, { (num1: Int, num2: Int) -> Void in
print(num1 + num2)
})
// 덧셈 연산 (클로저 축약 후)
test.calculator(10, 20) { print($0 + $1) }
// 뺄셈 연산
test.calculator(10, 20) { print($0 - $1) }
튜터님께 받은 피드백을 통해 불필요한 코드 정리 및 self 사용 습관을 익힐 수 있었다.
init이 필요 없음 myClosure는 초기값을 이미 가지고 있기 때문에 굳이 init을 만들 필요 없음 self를 명시적으로 사용하는 습관 self.myClosure = closure처럼 명확하게 작성하면 가독성이 좋아짐 myClosure()를 할당과 동시에 실행할 필요 없음 class Test {
private var myClosure: (() -> Void) = {} // 클로저 변수 생성
func setMyClosure(_ closure: @escaping (() -> Void)) {
self.myClosure = closure // self 사용하여 클로저 설정
}
func calculator(_ num1: Int, _ num2: Int, _ operate: (Int, Int) -> Void) {
operate(num1, num2) // 클로저 실행
}
}
// 클래스 인스턴스 생성
let test = Test()
// 클로저 설정
test.setMyClosure { print("MyClosure를 설정") }
// 덧셈 연산 (클로저 축약 전)
test.calculator(10, 20) { (num1: Int, num2: Int) in
print(num1 + num2)
}
// 덧셈 연산 (클로저 축약 후)
test.calculator(10, 20) { print($0 + $1) }
// 뺄셈 연산
test.calculator(10, 20) { print($0 - $1) }
오늘의 실습을 통해 내가 클로저에 대해 얼마나 모르는지 알 수 있었다.
그로 인해서 이번 실습 때 생각보다 고생을 좀 했다!
그래도 클로저 활용 능력이 향상된 느낌이라 기분이 좋다!