Swift - 저장 프로퍼티

이원석·2024년 11월 12일

Swift

목록 보기
5/38

저장프로퍼티

프로퍼티

프로퍼티(property)는 일부 객체 지향 프로그래밍 언어에서 필드(데이터 멤버)와 메소드 간 기능의 중간인 클래스 멤버의 특수한 유형이다. 프로퍼티의 읽기와 쓰기는 일반적으로 gettersetter 메소드 호출로 변환된다.

Swift에서는 프로퍼티가 총 3가지 형태로 존재

  • Stored Property : 저장 프로퍼티
  • Computed Property : 연산 프로퍼티
  • Type Property : 타입 프로퍼티

저장 프로퍼티(Stored Property)

클래스와 구조체에서만 사용할 수 있고, 값을 저장하기 위해 선언되는 상수/변수

ex)

class Human{
	let name: String = "unknown"
    var age: Int = 0
 }
 
 struct Person{
 	let name: String = "unknown"
    var age: Int = 0
 }

각각 클래스와 구조체에 저장된 name(상수), age(변수) 모두 저장 프로퍼티

클래스 인스턴스를 let/var로 선언할 경우

상수로 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/var로 선언할 경우

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로 선언할 경우 저장프로퍼티 값 변경가능

지연 저장 프로퍼티(Lazy Stored Property)

프로퍼티가 호출되기 전까지는 선언만 될 뿐 초기화되지 않고 있다가, 프로퍼티가 호출되는 순간에 초기화 되는 저장 프로퍼티

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로 선언된 프로퍼티에 처음 접근할 경우 초기화 함

  • 지연저장 프로퍼티는 인스턴스 초기화와 상관 없이, 처음 사용될 때 개별적으로 초기화 된다. 따라서 항상 변수 로 선언 되어야 한다.

열거형에서는 사용불가


참조
개발자 소돌이

0개의 댓글