프로퍼티(property)는 일부 객체 지향 프로그래밍 언어에서 필드(데이터 멤버)와 메소드 간 기능의 중간인 클래스 멤버의 특수한 유형이다. 프로퍼티의 읽기와 쓰기는 일반적으로 getter와 setter 메소드 호출로 변환된다.
Swift에서는 프로퍼티가 총 3가지 형태로 존재
클래스와 구조체에서만 사용할 수 있고, 값을 저장하기 위해 선언되는 상수/변수
ex)
class Human{
let name: String = "unknown"
var age: Int = 0
}
struct Person{
let name: String = "unknown"
var age: Int = 0
}
각각 클래스와 구조체에 저장된 name(상수), age(변수) 모두 저장 프로퍼티
상수로 Human 클래스 인스턴스 생성시
let people: Human? = .init()
people?.name = "abc" // 에러 발생
people?.age = 200
people = nil // 에러(상수니까 주소값이 변경될 수 없음)
let clone: Human? = .init()
people = clone // 에러(다른 인스턴스의 주소 값도 가질 수 없음)
클래스는 참조타입이므로 let으로 선언해도 스택영역에 저장되어있는 주소값만 변경 못할뿐 클래스의 저장 프로퍼티는 변경가능(name의 경우 let으로 선언하여 변경X)
var people: Human? = .init()
people?.name = "abc"//에러
people?.age = 200
people = nil
people = Human.init
클래스를 var(변수)로 선언할 경우 nil, 다른 인스턴스의 값 대입 가능
let people: Person? = .init()
people?.name = "abc" //에러
people?.age = 200 //에러
people = nil //에러
구조체는 값타입으로 let으로 선언할 경우 저장프로퍼티들도 모두 스택영역에 저장되기 때문에 변경불가능
var people: Person? = .init()
people?.name = "abc" //에러
people?.age = 200
people = nil
people = Person.init()
var로 선언할 경우 저장프로퍼티 값 변경가능
프로퍼티가 호출되기 전까지는 선언만 될 뿐 초기화되지 않고 있다가, 프로퍼티가 호출되는 순간에 초기화 되는 저장 프로퍼티
class Contacts{
var email: String = ""
var address: String = ""
init() { print("contacts init")}
}
class Human{
let name: String = "unknown"
lazy var contacts: Contacts = .init()
}
let people: Human = .init() // contacts가 초기화 되지않아 "contacts init" 출력x
people.contacts.address = "none"//contacts가 초기화 되어 "contacts init"출력
Human클래스 인스턴스를 생성하더라도 lazy로 선언된 프로퍼티(지연 저장 프로퍼티)는 초기화 되지않고, lazy로 선언된 프로퍼티에 처음 접근할 경우 초기화 함
참조
개발자 소돌이