var number = 10
let closure = { number += 5 }
closure()
print(number) // 15
→ 외부 변수 number를 캡처하여 클로저 내부에서 사용 - number 값이 변화
⇒ 이는 참조 카운트를 증가 시키므로 강한 순환 참조가 일어날 가능성이 있음!
➡︎ 순환 참조 발생 시 캡처리스트 사용
class Counter {
var number = 10
lazy var closure = { [weak self] in
guard let self else { return 0 }
self.number += 5
return self.number
}
}
→ weak 혹은 unowned는 참조 타입에만 사용 가능하므로 클래스 생성
→ [weak self]로 클래스를 약한 참조하여 강한 순환 참조를 방지
→ [weak self] 사용 시, 클로저 내부에서 self는 옵셔널 타입이므로 guard문 사용
→ [weak self]와 guard let self = self else { return 0 }은 너무 많이 사용하는 문법이라 위처럼 축약하여 사용
→ 클로저 생성 시점에 self는 아직 존재하지 않으므로 lazy var로 선언
class Animal { // 하나의 클래스로 캡슐화
var name: String
init(name: String) {
self.name = name
}
func makeSound() {
print("Some generic sound")
}
}
class Dog: Animal { // Animal 클래스를 상속
override func makeSound() { // makeSound() 메소드를 override하여 다른 방식으로 동작하게 함(다형성)
print("Bark!")
}
}
// 위에 구현했던 내용들이 실제 호출 시에는 일일이 보이지 않음(추상화)
let dog = Dog(name: "Buddy")
dog.makeSound() // "Bark!"
가. 간단한 클로저 구현
var arr = [1, 2, 3, 4, 5]
let someClosure = { arr = arr.map { $0 * 2 } }
someClosure()
print(arr) // [2, 4, 6, 8, 10]
나. 클로저 캡처 이해
var counter = 0
let incrementCounter = { counter += 1 }
incrementCounter() // counter == 1
incrementCounter() // counter == 2
print(counter) // 출력 2
가. 동물 클래스 설계
Animal 클래스 생성class Animal {
var name: String
init(name: String) {
self.name = name
}
func makeSound() {
print("some Sound")
}
}
Animal 클래스를 상속하는 Dog, Cat 클래스 생성class Dog: Animal {
override func makeSound() {
print("Bark!")
}
}
class Cat: Animal {
override func makeSound() {
print("Meow!")
}
}
나. 다형성 확인
let dog = Dog(name: "Doggy")
let cat = Cat(name: "Kitty")
dog.makeSound() // "Bark!"
cat.makeSound() // "Meow!"
→ override하여 덮어쓴 대로 makeSound() 메소드가 동작함
접근 제어(Access control) : 소스 파일과 모듈의 코드 접근을 제한하는 것
→ 은닉화를 위해 사용 - 외부에 코드 세부 사항을 노출하지 않기 위해
→ 공익 목적으로 코드를 공유하기 위해 사용하기도 할 것 같음
💡 모듈(module) : 코드 배포의 단일 단위
→ 프레임워크(Framework), 애플리케이션(Application)과 같이 import 키워드로 다른 모듈에서 가져올 수 있는 것
open 접근과 public 접근의 차이
- open 접근은 외부 모듈에서 하위 클래스와 재정의를 허용
- public은 불가 - public 클래스는 외부 모듈에서 해당 클래스를 상속하여 하위 클래스를 생성할 수 없음! 재정의도 불가
➡︎ open > public > internal > file-private > private 순서로 제한적임 (private이 가장 제한적)