TIL: 계산 속성(Computed Properties)

Royce·2025년 3월 22일

Swift 문법

목록 보기
26/63

계산 속성(Computed Properties)

  • 계산 속성은 값을 정의하지 않고, 다른 저장 속성을 이용해 계산된 값을 제공하는 속성이다
  • 저장 공간을 사용하지 않으며, 값을 요청할 때마다 계산을 수행한다
  • 함수처럼 동작하지만, 속성처럼 사용되기 때문에 더 깔끔하게 표현할 수 있다

계산 속성이 필요한 이유

기존 방식의 문제점(계산 속성이 아닌 방식으로 구현)

class Car {
    var model: String = "자동차"
    var fuelEfficiency: Double = 15.0  // km/L
    var fuelAmount: Double = 40.0      // 리터(L)
    
    func calculateDistance() -> Double {  // 계산된 값을 얻기 위해 메서드를 사용
        return fuelEfficiency * fuelAmount
    }
}

let myCar = Car()
myCar.fuelEfficiency = 18.0
myCar.fuelAmount = 45.0
print(myCar.calculateDistance())  // 출력: 810.0

문제점

  1. 주행 가능 거리를 확인하려면 calculateDistance() 메서드를 호출해야 한다
  2. 마치 속성처럼 사용하기 어렵고, 이해하기도 직관적이지 않다
  3. 읽고 쓰는 방식이 일관되지 않기 때문에 코드의 가독성이 떨어진다

계산 속성으로 구현(Read-only, 읽기 전용)

읽기 전용 계산 속성 - get 블록 사용

class Car1 {
    var model: String = "자동차"
    var fuelEfficiency: Double = 15.0  // km/L
    var fuelAmount: Double = 40.0      // 리터(L)
    
    var possibleDistance: Double {    // 계산 속성
        get {
            return fuelEfficiency * fuelAmount
        }
    }
}

let myCar1 = Car1()
myCar1.fuelEfficiency = 18.0
myCar1.fuelAmount = 45.0
print(myCar1.possibleDistance)  // 출력: 810.0
  • possibleDistance 속성은 읽기 전용 계산 속성이다
  • get 블록은 값을 얻기 위해 계산된 결과를 반환한다
  • 메서드 호출 방식이 아닌, 속성처럼 사용하는 방식으로 개선되었다

읽기 전용 계산속성(get 블록 생략 가능)

class Car3 {
    var model: String = "자동차"
    var fuelEfficiency: Double = 15.0  // km/L
    var fuelAmount: Double = 40.0      // 리터(L)
    
    var possibleDistance: Double {  // get 블록을 생략하고, 바로 값을 리턴할 수 있음
        return fuelEfficiency * fuelAmount
    }
}

let myCar3 = Car3()
myCar3.fuelEfficiency = 18.0
myCar3.fuelAmount = 45.0
print(myCar3.possibleDistance)  // 출력: 810.0
  • get 블록이 단순히 값을 반환하기만 하면 생략할 수 있다
  • 더 간결하고 깔끔하게 표현할 수 있다

읽기 - 쓰기 가능한 계산 속성(get / set 모두 사용)

class Car2 {
    var model: String = "자동차"
    var fuelEfficiency: Double = 15.0  // km/L
    var fuelAmount: Double = 40.0      // 리터(L)
    
    var possibleDistance: Double {
        get {
            return fuelEfficiency * fuelAmount
        }
        set(newDistance) {  // set 블록으로 값을 설정하는 방법 추가
            fuelAmount = newDistance / fuelEfficiency
        }
    }
}

let myCar2 = Car2()
myCar2.fuelEfficiency = 18.0
myCar2.fuelAmount = 45.0
print(myCar2.possibleDistance)  // 출력: 810.0

myCar2.possibleDistance = 900   // 새로운 주행 가능 거리를 설정
print(myCar2.fuelAmount)         // 출력: 50.0 (주행 가능 거리가 900km이므로, 연료량은 50L로 변경됨)
  • getset 블록을 사용하여 읽기와 쓰기 모두 가능한 계산 속성으로 구현한다
  • set 블록은 newDistance라는 파라미터를 사용하여 값을 설정한다
  • 값을 지정하는 것이 아닌, 저장 속성의 값을 변경하는 로직을 포함한다

newValue 사용(set의 파라미터 생략)

class Car4 {
    var model: String = "자동차"
    var fuelEfficiency: Double = 15.0  // km/L
    var fuelAmount: Double = 40.0      // 리터(L)
    
    var possibleDistance: Double {
        get {
            return fuelEfficiency * fuelAmount
        }
        set {  // newValue 라는 특별한 이름으로 사용 가능
            fuelAmount = newValue / fuelEfficiency
        }
    }
}

let myCar4 = Car4()
myCar4.fuelEfficiency = 18.0
myCar4.fuelAmount = 45.0
print(myCar4.possibleDistance)  // 출력: 810.0

myCar4.possibleDistance = 900
print(myCar4.fuelAmount)        // 출력: 50.0
  • set 블록에서 파라미터 이름을 지정하지 않으면, 자동으로 newValue라는 이름을 사용한다
  • 이 방식으로 더 간결하게 작성할 수 있다

계산 속성의 특징(주요 사항)

  1. 메모리에 값이 저장되지 않는다
    • 항상 계산하여 값을 반환한다
  2. var로만 선언 가능
    • 값을 변경할 수 있기 때문에 let으로 선언할 수 없다
  3. 자료형을 반드시 선언해야 한다
    • Swift의 컴파일러는 계산 속성의 자료형을 추론하지 않는다
  4. get 블록은 필수, set 블록은 선택 사항이다
    • 값을 읽어오는 get 블록은 반드시 존재해야 하고, 값을 설정하는 set 블록은 필요할 때만 구현한다
  5. 클래스, 구조체, 열거형에서 사용 가능
    • 모든 타입에서 계산 속성을 활용할 수 있다

요약

  • 계산 속성(Computed Properties): 값이 저장되지 않고 다른 저장 속성을 이용해 계산된 값을 제공
  • 읽기 전용 속성: get 블록만 구현하면 되며, get 블록은 생략 가능하다
  • 읽기 - 쓰기 속성: getset 블록 모두 구현하여 설정 가능하다
  • set 블록에서의 기본 파라미터 이름은 newValue이다
profile
iOS 개발자 지망생

0개의 댓글