[Swift] 10. 프로퍼티

Hoojeong Kim·2022년 3월 9일
0

Swift Base

목록 보기
12/22
post-thumbnail

프로퍼티

프로퍼티는 클래스, 구조체 또는 열거형 등에 관련된 값을 뜻한다. 프로퍼티는 크게 저장 프로퍼티, 연산 프로퍼티, 타입 프로퍼티로 나눌 수 있다.

저장 프로퍼티(Stored Property)

클래스 또는 구조체의 인스턴스와 연관된 값을 저장하는 가장 단순한 개념의 프로퍼티이다.

struct Dog {
	var name: String
    let gender: String
}

var dog = Dog(name: "Hoojeong", gender:"Female")
print(dog)
Dog(name: "Hoojeong", gender:"Female")

구조체 내에 선언된 name 변수와 gender 상수는 저장 프로퍼티에 해당한다.

구조체를 인스턴스화한 변수 dog을 출력해보면, name 프로퍼티에는 "Hoojeong", gender 프로퍼티에는 "Female" 값을 가진다.
이처럼 인스턴스에 프로퍼티의 값이 저장되어 있는 경우에도 저장 프로퍼티라고 한다.

연산 프로퍼티(Computed Property)

앞서 설명한 저장 프로퍼티는 클래스와 구조체에서만 사용 가능하지만, 연산 프로퍼티는 클래스와 구조체를 포함해 나중에 배울 열거형에서도 사용할 수 있다.
계산 프로퍼티는 값을 직접 저장하지 않는 대신, 접근자(getter)설정자(setter)를 사용해서 다른 프로퍼티에 접근할 수 있다.

접근자(getter) : 인스턴스 내/외부의 값을 연산해서 return 하는 역할
설정자(setter) : 내부의 인스턴스 값을 간접적으로 set 하는 역할


다음 코드는 평균가와 수량을 이용해 매입가를 계산하는 코드이다.
struct Stock {
	var averagePrice: Int
    var quantity: Int
    var parchasePrice: Int {
    	get {
        	return averagePrice * quantity
        }
        set(newPrice) {
        	averagePrice = newPrice / quantity
        }
    }
}

var stock = Stock(averagePrice: 2300, quantity: 3)
print(stock.parchasePrice)
6900

parchasePrice를 출력하면, getter의 averagePrice * quantity의 연산을 수행한 결과가 저장되어 있다.


stock.parchasePrice = 3000
print(stock.averagePrice)
1000

parchasePrice의 값을 바꿔보면, setter의 연산을 수행하여 averagePrice의 값이 2300에서 1000으로 변경된 것을 알 수 있다.

이처럼 getter, setter를 사용해 값을 연산하고 프로퍼티에 전달하는 것이 바로 연산 프로퍼티이다.

💡참고

연산 프로퍼티에서 접근자(getter)만을 사용하는 경우에는 읽기 전용 프로퍼티가 된다. 즉, 값을 변경할 수 없고 읽기만 가능해진다.
이때, 연산 값이 변경될 수 있기 때문에 var로 선언한다. 또한, 아래처럼 간략하게 표현할 수 있다.

struct Stock {
    var parchasePrice: Int {
    	return 1
    }
}

프로퍼티 감시자(Properties Observer)

프로퍼티 옵저버는 프로퍼티 값의 변화를 관찰하고 반영한다. 프로퍼티의 기존 값과 변경할 값이 동일하더라도 호출된다.
즉, 프로퍼티가 set 될 때마다 호출되는 것이다.
이때 프로퍼티 옵저버는 저장 프로퍼티, 오버라이딩이 된 저장/연산 프로퍼티에서만 사용 가능하다.

프로퍼티 옵저버는 willSet메서드와 didSet메서드를 사용해 구현한다. willSet은 값이 저장되기 직전에 호출되는 메서드이고, didSet은 값이 저장된 직후에 호출되는 메서드이다.

willSet은 새롭게 저장될 프로퍼티의 값을 상수의 매개변수로 전달한다. didSet은 프로퍼티의 기존 값을 상수의 매개변수로 전달한다.

class Account {
	var credit: Int = 0
    
    willSet {
    	print("잔액이 \(credit)원에서 \(newValue)원으로 변경될 예정입니다.")
    }
    
    didSet {
    	print("잔액이 \(oldValue)원에서 \(credit)원으로 변경되었습니다.")
    }
}

var account = Account()
account.credit = 1000
잔액이 0원에서 1000원으로 변경될 예정입니다.
잔액이 0원에서 1000원으로 변경되었습니다.

위 코드를 실행하면, credit의 값을 변경하기 직전에 willSet이 실행되고, 값을 변경한 직후에 didSet이 실행된다.

💡참고

연산 프로퍼티의 setter와 프로퍼티 옵저버의 willSet, didSet은 매개변수를 필요로 하는데, 매개변수의 이름을 지정하지 않으면 각각 기본 이름인 newValue , newValue , oldValue 을 사용한다.

타입 프로퍼티(Type Property)

타입 프로퍼티는 인스턴스를 생성하지 않고 객체 내의 프로퍼티에 접근할 수 있도록 한다.
타입 프로퍼티는 저장 프로퍼티와 연산 프로퍼티에서만 사용할 수 있으며, static 키워드를 사용해 표현한다.

struct SomeStructure {
	static var storedTypeProperty = "Some Value."
    static var computedTypeProperty: Int {
    	return 1
    }
}

print(SomeStructure.storedTypeProperty)
print(SomeStructure.computedTypeProperty)
Some Value.
1

위 코드처럼 저장/연산 프로퍼티에 static 키워드를 사용하여 인스턴스를 사용하지 않고도 객체 밖에서 호출하거나, 값을 변경하는 등의 작업을 수행할 수 있다.

profile
나 애기 개발자 👶🏻

0개의 댓글