프로퍼티
구조체
, 클래스
, 열거형
과 연관된 값으로, 연산
을 수행하거나 값
을 저장할 수 있다.
- 다만,
열겨형
의 내부에는 연산 프로퍼티
만 구현할 수 있다.
프로퍼티 종류
저장 프로퍼티
연산 프로퍼티
: var
로만 선언할 수 있다.
타입 프로퍼티
저장 프로퍼티
구조체
의 경우에는 저장 프로퍼티에 맞는 이니셜라이저
를 자동적으로 제공하지만(멤버와이즈 이니셜라이저), 클래스
는 사용자가 직접 이니셜라이저
를 정의해야 한다.
지연 저장 프로퍼티
lazy
키워드를 이용하여 생성할 수 있다.
- 지연 저장 프로퍼티는 호출이 되는 순간에 값을 초기화하는 변수로, 잘활용하면 성능 저하나 불필요한 공간 낭비를 줄일 수 있다.
- 상수는 생성되기 전에 초기화 되어야하기때문에 지연 저장 상수 프로퍼티는 정의할 수 없다.
- 멀티 스레드 환경에서 지연 저장 프로퍼티에 동시 접근이 이루어질때, 한 번만 초기화된다는 보장이 없다.
연산 프로퍼티
- 연산 프로퍼티는 실제 값을 저장하는 프로퍼티가 아니라, 어떤 상태에 따른 값을 연산하는 프로퍼티이다.
- 클래스, 구조체, 열거형 등에 연산 프로퍼티를 정의할 수 있다.
get
(접근자), set
(설정자) 키워드를 통해 정의한다.
class Account{
var credit: Int = 0{
willSet{
print("잔액이 \(credit)원에서 \(newValue)원으로 변경될 예정입니다.")
}
didSet{
print("잔액이 \(oldValue)원에서 \(credit)원으로 변경되었습니다.")
}
}
var dollarValue: Double{
get{
return Double(credit)
}
set(dollar){
credit = Int(newValue * 1000)
print("잔액을 \(dollar)달러로 변경 중입니다.")
}
}
}
- 변수에 접근하는 경우에는 접근자 블록이 실행되고, 변수에 값을 할당할때는 설정자 블록이 실행된다.
- set의 매개변수를 설정할 수 있지만, 설정하지 않는다면
newValue
릁 통해 접근할 수 있다.
타입 프로퍼티
타입 프로퍼티
는 두 가지로, 변수or상수 저장 프로퍼티와 연산 타입 프로퍼티이다. 연산 타입 프로퍼티는 반드시 변수
로 선언해야 한다.
- 저장 타입 프로퍼티는 지연 연산 되기때문에 반드시 초기값을 지정해주어야 한다.
- 지연 저장 프로퍼티와는 다르게 다중 스레드 환경이더라도 단 한번만 초기화된다.
지역변수, 전역변수
저장 프로퍼티
와 연산 프로퍼티
의 기능은 함수
,메소드
,클로저
, 타입
등의 외부에 위치한 지역변수/전역변수
에서도 사용 가능하다.
- 전역변수는 자동적으로
지연 전역 변수
가 되며, 지역변수는 그렇지 않다.
var a: Int = 100
var b: Int = 200
var sum : Int {
get{
return a+b
}