본문 바로가기

Mobile/Swift

[Swift - 문법] 프로퍼티(Property) - 2. 연산 프로퍼티

반응형

https://axce.tistory.com/147

 

[Swift - 문법] 프로퍼티(Property) - 1. 저장 프로퍼티

프로퍼티: 클래스, 구조체 또는 열거형 등에 관련된 값 메소드: 특정 타입에 관련된 함수 1. 프로퍼티 프로퍼티는 크게 세가지 종류의 프로퍼티가 있습니다. 1. 저장 프로퍼티: 인스턴스의 변수

axce.tistory.com

1. 연산 프로퍼티

연산 프로퍼티는 실제 값을 저장하는 프로퍼티는 아닙니다. 단지 특정 상태에 따른 값을 연산하는 프로퍼티입니다. 인스턴스 내/외부의 값을 연산해 적절한 값을 돌려주는 접근자(getter)의 역할이나 은닉화된 내부의 프로퍼티 값을 간접적으로 설정하는 설정자(setter)의 역할을 할 수도 있습니다. 클래스, 구조체, 열거형에 연산 프로퍼티를 정의할 수 있습니다.

2. 메소드로 구현된 접근자(getter)와  설정자(setter)

struct User {
    var age: Int
    
    // 다음 연도 나이를 확인하는 메소드
    // 단순히 확인만 할 뿐 age에는 변화가 없습니다.
    // 접근자로 구현된 메소드
    func nextYearAge() -> Self {
        return User(age: age+1)
    }
    
    // 다음 연도 나이로 설정하는 메소드
    // 설정자로 구현된 메소드
    mutating func setNextYearAge(_ setAge: User) {
        // 파라미터로 User 타입을 받고, 타입의 age에 + 1 해서 세이브합니다.
        age = setAge.age + 1
    }
}


var axceUser: User = User(age: 31)

print("2022년 나이는 :", axceUser)
// 현재 나이를 확인 : "2022년 나이는 : User(age: 31)"
print("2023년 나이는 :", axceUser.nextYearAge())
// 내년 나이를 확인 : "2023년 나이는 : User(age: 32)"
print("변했는지 확인 :", axceUser)
// 단순히 확인하는 단계이기 때문에 실제 값의 변화는 없습니다.
// "변했는지 확인 : User(age: 31)"

axceUser.setNextYearAge(axceUser)
// axceUser 의 setNextYearAge 의 인자로 axceUser 를 주고,
// 그 값의 age에 1을 더해 axceUser 의 age 로 재설정합니다.
// 따라서 나이는 아래와 같이 32가 됩니다.
print("재설정된 나이는 :", axceUser)
// "재설정된 나이는 : User(age: 32)"

위에서 언급한 접근자와 설정자는 간단하기 때문에 문제가 되지 않을 수 있습니다. 하지만 접근자와 설정자가 길고 복잡해지면 가독성이 떨어지는 문제가 생길 수 있습니다. 이 부분을 해결하기 위해 연산 프로퍼티를 사용할 수 있습니다.

3. 연산 프로퍼티를 사용한 경우

struct User {
    var age: Int
    
    var nextAge: User {
        // 접근자
        get {
            return User(age: age + 1)
        }
        
        // 설정자
        set(user) {
            age = user.age + 1
        }
    }
}

var axceUser: User = User(age: 31)

print(axceUser) // User(age: 31)
print(axceUser.nextAge) // User(age: 32)
print(axceUser) // User(age: 31)

axceUser.nextAge = axceUser
print(axceUser) // User(age: 32)

2번의 코드보다 좀 더 간단한 상태의 코드가 됐습니다.  이런 식으로 사용하면 nextAge 라는 프로퍼티의 역할이 좀 더 명확해집니다. 위의 코드에서 set 부분에 user 라는 매개변수는 아래 "axceUser.nextAge = axceUser" 의 뒷부분 axceUser 를 전달받는 부분입니다. 즉, "user === axceUser" 입니다. 매개변수의 이름은 자유롭게 설정이 가능합니다. 다만 전달인자는 같은 타입이어야 합니다.

만약 매개변수 이름을 사용하고 싶지 않는 경우 아래와 같이 표현이 가능합니다.

        // 설정자
        set {
            age = newValue.age + 1
        }

 

반응형