Swift(12) Stored, Computed Property

개발렬·2023년 7월 14일
0

Swift

목록 보기
12/23
post-thumbnail

Stored Property

저장 속성은 값을 저장하고 나중에 해당 값을 읽거나 변경할 수 있습니다. 그러므로 메모리 공간을 가집니다.

저장 속성 종류

  1. 변수 저장 속성
  2. 상수 저장 속성
  3. 지연 저장 속성

점문법(Explicit Memeber Expression)

인스턴스의 저장 속성에 접근하려면, 인스턴스 이름 뒤에 마침표(.)를 붙이고 속성의 이름을 사용합니다.

instanceName.propertyName
instanceName.propertyName = NewValue
let p = Person()
p.name
p.age

구조체의 가변성은 속성의 가변성에 영향을 미칩니다.

  1. 구조체는 값 타입이므로 기본적으로 인스턴스 내의 모든 속성이 상수 저장 속성으로 선언되면 구조체의 인스턴스 자체도 불변(immutable)이 됩니다.
    따라서 구조체의 속성을 변경하려면 해당 구조체를 가변(mutable)로 선언해야 합니다.
struct Rectangle {
    var width: Double
    var height: Double
}

var rect = Rectangle(width: 5, height: 3)
rect.width = 8   // 구조체의 인스턴스를 가변으로 선언하여 속성 변경

print(rect.width)   // 출력: 8

let rect = Rectangle(width: 5, height: 3)
rect.width = 8   // 오류: Cannot assign to property: 'rect' is a 'let' constant
  1. 클래스(class)로 예시를 만들어 보겠습니다. 클래스는 참조 타입이므로 인스턴스를 가변으로 선언하지 않아도 속성을 변경할 수 있습니다.
class Rectangle {
    var width: Double
    var height: Double
    
    init(width: Double, height: Double) {
        self.width = width
        self.height = height
    }
}

let rect = Rectangle(width: 5, height: 3)
rect.width = 8   // 클래스의 인스턴스는 속성 변경 가능

print(rect.width)   // 출력: 8

클래스는 참조 타입이므로 let으로 선언된 인스턴스도 속성을 변경할 수 있습니다.
이는 클래스의 인스턴스가 상수로 선언되더라도 인스턴스 자체가 변경되는 것이 아니라 인스턴스에 대한 참조를 통해 속성에 접근하고 변경하기 때문입니다.

Computed Property

저장된 값 대신에 계산된 값을 제공하는 속성입니다. Computed Property는 특정한 코드 블록인 getter와 필요한 경우 setter를 사용하여 값을 읽고 설정할 수 있습니다. 연산 속성은 저장된 값을 갖지 않고, 각각의 접근 시점에 getter를 통해 계산된 값을 반환합니다.

Computed Property의 선언 시 기본값을 설정할 수 없으며, 따라서 형식 추론이 불가능합니다. 이러한 경우 타입을 명시적으로 선언해야 합니다.

struct Temperature {
    var celsius: Double
    
    var fahrenheit: Double {
        get {
            return (celsius * 9 / 5) + 32
        }
        set {
            celsius = (newValue - 32) * 5 / 9
        }
    }
}

var temperature = Temperature(celsius: 25)
print(temperature.fahrenheit)   // 출력: 77.0

temperature.fahrenheit = 86
print(temperature.celsius)      // 출력: 30.0

읽기 전용 코드입니다.

var name: Type {
	get {
    	statment
        return expr
   }
}

var name: Type {
    statment
   	return expr
}	//get 블록은 중괄호({})를 생략할 수 있으며, 나중에는 return문도 생략 가능
  • 계산 속성과 클로저를 구별하는 방법은 할당 연산자 "="의 존재 여부를 확인하는 것입니다.
profile
Flutter, iOS...나는 모바일 앱 개발자

0개의 댓글