TIL은 편한 말투로 작성됩니다~
오늘은 새로 알게된 편의 이니셜라이저와 평상시에 다른 분들의 코드를 볼때 get, set, lazy 키워드가 있는 것들을 보고, 저건 어떤 내용일까 싶었는데 이번에 프로퍼티 부분에 강의를 보는데 갑자기 그 내용들이 나오길래 공부하여 정리해봤다.
편의 이니셜라이저 (Convenience initializer)
convenience init
은 class
에서만 사용 가능한 키워드로 직접 초기화하는게 아닌, 다른 이니셜라이저를 호출해서 초기화하는 보조 이니셜라이저라고 보면 된다.
반드시 같은 클래스 내의 지정 이니셜라이저(init
) 또는 상위 클래스의 지정 이니셜라이저를 호출해야한다.
간단히 지정 이니셜라이저에 비해 더 간단한 입력만으로 편하게 객체를 생성할 수 있게 도와주는 역할이라고 생각하면 좋을거같다.
class SomeClass {
var name: String
var age: Int
// 지정 이니셜라이저
init(name: String, age: Int) {
self.name = name
self.age = age
}
// 편의 이니셜라이저 (Convenience initializer)
convenience init(name: String) {
self.init(name: name, age: 0) // 기본 나이를 0으로 설정
}
// 또 다른 편의 이니셜라이저
convenience init() {
self.init(name: "Unknown", age: 0)
}
}
🧱 프로퍼티(Property)란?
프로퍼티란 클래스(class), 구조체(struct), 열거형(Enum)이 가지고 있는 값(데이터)을 나타내는 속성이다.
즉, 어떤 객체의 상태나 특징을 저장하거나 계산할 수 있도록 해주는 구성요소이다.
라고는 쓰여있는데, 그냥 어떠한 객체가 가지고 있는 변수나 상수를 생각하면 쉬울거같다.
✅ 프로퍼티의 종류
- 저장 프로퍼티 (Stored Property)
- 연산 프로퍼티 (Computed Property)
- 지연 저장 프로퍼티 (Lazy Stored Property)
- 타입 프로퍼티 (Type Property)
📌 1. 저장 프로퍼티 (Stored Property)
- 인스턴스의 값을 직접 저장하는 기본적인 프로퍼티
var
또는let
으로 선언- 클래스, 구조체에서 사용 가능
struct Person {
var name: String
let birthYear: Int
}
let user = Person(name: "Gwangyong", birthYear: 2000)
print(user.name) // Gwangyong
📌 2. 연산 프로퍼티 (Computed Property)
- 실제 값을 저장하지 않고, 계산된 값을 반환
get
으로 값을 반환,set
으로 값을 설정한다.- 클래스, 구조체, 열거형 등에서 연산 프로퍼티를 사용 가능하다.
예시
struct Circle {
var radius: Double
var diameter: Double {
get {
// 읽을 때 실행됨
// radius를 기반으로 값을 계산해서 돌려줌
return radius * 2
}
set {
// 쓸 때 실행됨
// 외부에서 받은 값을 기반으로 radius를 재계산해 저장함
radius = newValue / 2
}
}
}
var circle = Circle(radius: 5)
print(circle.diameter) // 10.0
circle.diameter = 20
print(circle.radius) // 10.0
🧐 newValue란?
- set 블록에서 프로퍼티에 새로 설정된 값을 의미하는 기본 매개변수 이름
- 따로 이름을 저장하지 않으면, Swift가 자동으로 newValue 라는 이름을 사용함
📌 3. 타입 프로퍼티 (Type Property)
- 타입 프로퍼티는 인스턴스가 아닌, 모든 인스턴스가 값을 공유하는 타입 자체에 속하는 프로퍼티이다.
- 구조체/열거형 →
static
만 사용 - 클래스 →
static
,class
모두 사용 가능 (단,class
는 오버라이드 가능한 연산 프로퍼티 전용)
static 사용
struct Counter {
static var count = 0
static var info: String {
return "총 \(count)회 호출됨"
}
}
Counter.count += 1
print(Counter.info) // 총 1회 호출됨
class 사용
class Message {
class var greeting: String {
return "Hello!"
}
}
class CustomMessage: Message {
override class var greeting: String {
return "Hi!"
}
}
print(Message.greeting) // Hello!
print(CustomMessage.greeting) // Hi!
📌 3.5 프로퍼티 옵저버 (Property Observer)
- 저장 프로퍼티의 값이 변경되는 것을 감시하고 있다가 코드블록을 실행할 수 있는 기능
- 저장 프로퍼티가 사용 가능한
struct
와class
에서만 사용 가능 willSet
- 값이 변경되기 직전에 호출됨
- 변경될 값은 기본 매개변수
newValue
로 접근 가능 - 별도 이름 지정 가능:
willSet(이름)
형태로 작성
didSet
- 값이 변경된 직후에 호출됨
- 이전 값은 기본 매개변수
oldValue
로 접근 가능 - 별도 이름 지정 가능:
didSet(이름)
형태로 작성
기본 사용 예시
struct Person {
var name: String {
willSet {
print("Person의 name이 변경될 예정입니다. 변경될 이름은 \"\(newValue)\"입니다. (willSet 호출)")
}
didSet {
print("Person의 name이 \"\(oldValue)\"에서 \"\(name)\"으로 변경되었습니다. (didSet 호출)")
}
}
}
var person = Person(name: "Mori")
person.name = "Apple"
/* 출력
Person의 name이 변경될 예정입니다. 변경될 이름은 "Apple"입니다. (willSet 호출)
Person의 name이 "Mori"에서 "Apple"으로 변경되었습니다. (didSet 호출)
*/
newValue, oldValue 다른 이름으로 변경한 사용 예시
struct Person {
var name: String {
willSet(changeNewName) { // newValue -> changeNewName
print("Person의 name이 변경될 예정입니다. 변경될 이름은 \"\(changeNewName)\"입니다. (willSet 호출)")
}
didSet(beforName) { // oldValue -> beforName
print("Person의 name이 \"\(beforName)\"에서 \"\(name)\"으로 변경되었습니다. (didSet 호출)")
}
}
}
var person = Person(name: "Mori")
person.name = "Apple"
📌 4. 지연 저장 프로퍼티 (Lazy Stored Property)
- 인스턴스 생성 시 초기화되지 않고, 해당 프로퍼티에 처음 접근할 때 초기화되는 저장 프로퍼티이다.
lazy
키워드를 사용하여, 초기화를 "지연"시켜, 사용 시점까지 메모리를 아낄 수 있다.- 항상
var
로만 선언해야하며, 클래스나 구조체에서 사용이 가능하다.
// 예시 : 지하 주차장 조명
class ParkingLot {
lazy var light: String = {
print("💡 주차장 조명이 켜졌습니다")
return "불 켜짐"
}()
}
let lot = ParkingLot()
print("사람이 아직 없음")
// 누군가 들어올 때 조명이 켜짐
print(lot.light)
'🖋️ TIL Journal' 카테고리의 다른 글
05.30 (금) 실수로 날린 커밋, reflog로 되살리기 (0) | 2025.05.30 |
---|---|
05.29 (목) 꽤나 자주 보이던 키워드들 간단 정리 (0) | 2025.05.29 |
05.27 (화) guard문과 Closure (0) | 2025.05.27 |
05.26 (월) 중복 없는 난수 생성. 근데 이제 Shuffled()를 곁들인.. (0) | 2025.05.26 |
05.23 (금) 미니 프로젝트 발표 & 피드백 (0) | 2025.05.23 |