본문 바로가기
iOS/Swift 문법 심화 학습

프로퍼티 [ Properties ]

by 황민우 2022. 2. 14.

정의

- 클래스, 구조체, 열거형과 관련한 값입니다.

- 프로퍼티의 종류는 저장 프로퍼티(Stored Properties)와 계산 프로퍼티(Computed Properties)가 있습니다.

- 저장 프로퍼티는 값을 저장하고 있는 프로퍼티입니다.

- 계산 프로퍼티는 값을 저장하고 있지 않고 특정하게 계산한 값을 반환해주는 프로퍼티입니다.

- 계산 프로퍼티는 클래스, 구조체, 열거형에서 사용 가능하지만, 저장 프로퍼티는 클래스와 구조체에서만 사용 가능합니다.


저장 프로퍼티 (=Stored Properties)

- 저장 프로퍼티는 let 키워드를 이용해서 상수로 사용하거나 var 키워드를 이용해 변수로 사용할 수 있습니다.

- 다음 예제는 firstValue와 length에 첫 값과 그 길이를 각각 프로퍼티에 저장해 범위를 표현하는 예제입니다.

struct FixedLengthRange {
    var firstValue: Int
    let length: Int
}
var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3)
// 범위 값 = 0, 1, 2
rangeOfThreeItems.firstValue = 6
// 범위 값 = 6, 7, 8

 

상수 구조체 인스턴스의 저장 프로퍼티

(=Stored Properties of Constant Structure Instances)

- 구조체를 상수로 선언한다면, 구조체 인스턴스의 프로퍼티를 변경할 수 없습니다.

- 반면, 클래스는 참조 타입이기 때문에 let으로 선언하더라도 프로퍼티를 변경할 수 있습니다.

let rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 4)
// 범위 값 = 0, 1, 2, 3
rangeOfThreeItems.firstValue = 7
// 에러

 

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

- 지연 저장 프로퍼티는 값이 처음으로 사용되기 전까지 계산되지 않는 프로퍼티입니다.

- 지연 프로퍼티는 처음 사용되기 전까지는 값을 갖지 않기 때문에 반드시 변수로 선언해야 합니다.

- 지연 프로퍼티는 프로퍼티가 특정 요소에 의존적이어서 그 요소가 끝나기 전에 적절한 값을 알지 못할 경우에 유용합니다. 또한 복잡한 계산이나 부하가 많이 걸리는 작업에 사용해 인스턴스 초기화 시점에 복잡한 계산과 부하를 피할 수 있습니다.

class DataImporter {
    /*
        DataImporter는 외부 파일에서 데이터를 가져오는 클래스입니다.
         이 클래스는 초기화 하는데 매우 많은 시간이 소요된다고 가정하겠습니다.
     */
    var filename = "data.txt"
    // 데이터를 가져오는 기능의 구현이 이 부분에 구현돼 있다고 가정
}

class DataManager {
    lazy var importer = DataImporter()
    var data = [String]()
    // 데이터를 관리하는 기능이 이 부분에 구현돼 있다고 가정
}

let manager = DataManager()
manager.data.append("Some data")
manager.data.append("Some more data")
// DataImporter 인스턴스는 이 시점에 생성돼 있지 않습니다.

- 다음 예제에서 DataManger 클래스는 데이터를 가져오는 DataImporter 클래스를 갖고 있습니다.

그리고 DataImporter 클래스는 디스크 파일에서 데이터를 가져오기 때문에 초기화 시간이 많이 소요된다고 하겠습니다.

- importer라는 변수에 lazy 키워드를 이용해 지연 프로퍼티로 사용하겠습니다.

- DataManger 클래스를 갖는 manager 인스턴스를 생성하겠습니다.

manager 인스턴스에서는 importer프로퍼티가 사용되지 않았기 때문에 해당 프로퍼티를 사용하기 전까지는 디스크에서 데이터를 읽어오는것과 같이 복잡하고 시간이 많이 소요되는 연산이 실행되지 않습니다.


계산 프로퍼티 (Computed Properties)

- 계산 프로퍼티는 실제 값을 저장하고 있는 것이 아니라 getter와 optional setter를 제공해 값을 탐색하고,

간접적으로 다른 프로퍼티 값을 설정할 수 있는 방법을 제공합니다.

- 다음 예제는 좌표와 크기를 갖는 사각형을 표현하는 구조체 코드입니다.

- 여기서 Rect 구조체는 사각형의 중점을 표현하는 center라는 계산된 프로퍼티를 제공합니다.

- get : 정의된 값이 아닌 입력받는 좌표와 크기 프로퍼티를 연산해서 사각형을 표현할 수 있습니다.

- set : 사각형의 중점을 직접 설정합니다. 이때 x, y 좌표가 어떤 값을 가져야 할지 계산해 x, y에 적절합 값을 입력합니다.

struct Point {
    var x = 0.0, y = 0.0
}
struct Size {
    var width = 0.0, height = 0.0
}
struct Rect {
    var origin = Point()
    var size = Size()
    var center: Point {
        get {
            let centerX = origin.x + (size.width / 2)
            let centerY = origin.y + (size.height / 2)
            return Point(x: centerX, y: centerY)
        }
        set(newCenter) {
            origin.x = newCenter.x - (size.width / 2)
            origin.y = newCenter.y - (size.height / 2)
        }
    }
}
var square = Rect(origin: Point(x: 0.0, y: 0.0),
                  size: Size(width: 10.0, height: 10.0))
let initialSquareCenter = square.center
square.center = Point(x: 15.0, y: 15.0)
print("square.origin is now at (\(square.origin.x), \(square.origin.y))")
// "square.origin is now at (10.0, 10.0)" 출력

 

 

Setter 선언의 간략한 표현 (Shorthand Setter Declaration)

- 이전의 예제에서는 setter의 인자 이름을 newCenter라고 명시했지만,

이름을 명시(지정) 하지 않으면 기본 인자 이름인 newValue로 사용할 수 있습니다.

struct AlternativeRect {
    var origin = Point()
    var size = Size()
    var center: Point {
        get {
            let centerX = origin.x + (size.width / 2)
            let centerY = origin.y + (size.height / 2)
            return Point(x: centerX, y: centerY)
        }
        set {
            origin.x = newValue.x - (size.width / 2)
            origin.y = newValue.y - (size.height / 2)
        }
    }
}

 

읽기 전용 계산 프로퍼티 (Read-Only Computed Properties)

- getter만 있고 setter를 제공하지 않는 계산 프로퍼티는 읽기전용 계산 프로퍼티라고 합니다.

- 읽기전용 계산 프로퍼티는 반드시 반환 값을 제공하고 다른 값을 지정할 수 없는 프로퍼티입니다.

- 읽기전용 계산 프로퍼티더라도 계산에 따라 값이 변할 수 있기 때문에 반드시 상수가 아닌 변수로 선언해야 합니다.

- 다음 예제는 volume이라는 읽기 전용 계산 프로퍼티입니다.

struct Cuboid {
    var width = 0.0, height = 0.0, depth = 0.0
    var volume: Double {
        return width * height * depth
    }
}
let fourByFiveByTwo = Cuboid(width: 4.0, height: 5.0, depth: 2.0)
print("the volume of fourByFiveByTwo is \(fourByFiveByTwo.volume)")
// "the volume of fourByFiveByTwo is 40.0" 출력

내용 출처

https://jusung.gitbook.io/the-swift-language-guide/language-guide/10-properties

 

'iOS > Swift 문법 심화 학습' 카테고리의 다른 글

컬렉션 타입 [Collection Types]  (0) 2022.02.17
서브스크립트 [ Subscript ]  (0) 2022.02.15
옵셔널 체이닝 [ Optional Chaining ]  (0) 2022.02.10
inout  (0) 2022.02.09
mutating  (0) 2022.02.09

댓글