나의 기록, 현진록

[Swift] 10.1.3 연산 프로퍼티 / 접근자와 설정자 본문

Programming/Swift

[Swift] 10.1.3 연산 프로퍼티 / 접근자와 설정자

guswlsdk 2021. 7. 16. 14:55
반응형

스위프트 프로그래밍 3판 - 야곰 지음

 

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

 

 

굳이 메소드를 두고 연산 프로퍼티를 사용하는 이유

 

인스턴스 외부에서 메소드를 통해 인스턴스 내부 값에 접근하려면 메소드를 두 개(접근자, 설정자) 구현해야 합니다. 또한 이를 감수하고 메소드로 구현한다 해도 두 메소드가 분산 구현되어 코드의 가독성이 나빠질 수 있습니다.

 

다만 연산 프로퍼티는 접근자인 get메소드만 구현해둔 것처럼 읽기 전용 상태로 구현하기 쉽지만, 쓰기 전용 상태로 구현할 수 없다는 단점이 있습니다. 메소드로는 설정자 메소드만 구현하여 쓰기 전용 상태로 구현할 수 있지만 연산 프로퍼티는 불가능합니다.

 

연산 프로퍼티를 적용하지 않고 메소드로 접근자와 설정자를 구현한 코드이다.

struct CoordinatePoint{
    var x: Int
    var y: Int

    func oppositePoint() -> Self{
        return Self(x: -x, y: -y)
    }

    mutating func setOppositePoint(_ opposite: CoordinatePoint){
        x = -opposite.x
        y = -opposite.y
    }
}

var currentPosition: CoordinatePoint = CoordinatePoint(x: 10, y: 20)

//현재 좌표
print(currentPosition)

//대칭 좌표
print(currentPosition.oppositePoint())

//대칭 좌표를 (15, 10)으로 설정하면
currentPosition.setOppositePoint(CoordinatePoint(x:15, y:10))

//현재 좌표는 -15, -10으로 설정됩니다.
print(currentPosition)

 

 

oppositePoint() 메소드로 대칭점을 구할 수 있으며 setOppositePoint() 메소드로 대칭점을 설정해줘야 합니다. 이는 접근자와 설정자 이름의 일관성을 유지하기 힘들며, 해당 포인트에 접근할 때와 설정할 때 사용하는 코드를 한 번에 읽기도 쉽지 않습니다.

 

하지만 연산 프로퍼티를 사용하면 이 두 메소드를 좀 더 확실하게 표현할 수 있습니다.

 

struct CoordinatePoint{
    var x: Int
    var y: Int

    var oppositePoint: Self{
        //접근자
        get{
        	//return 키워드 생략 가능
            return CoordinatePoint(x: -x, y: -y)
        }
        //설정자
        set(opposite){
            x = -opposite.x
            y = -opposite.y
        }
    }
}

var currentPosition: CoordinatePoint = CoordinatePoint(x: 10, y: 20)

//현재 좌표
print(currentPosition)

//대칭 좌표
print(currentPosition.oppositePoint)

//대칭 좌표를 (15, 10)으로 설정하면
currentPosition.oppositePoint=CoordinatePoint(x: 15, y:10)

//현재 좌표는 -15, -10으로 설정됩니다.
print(currentPosition)

 

 

이런 식으로 연산 프로퍼티를 사용하면 하나의 프로퍼티에 접근자와 설정자가 모두 모여 있고, 해당 프로퍼티가 어떤 역할을 하는지 좀 더 명확하게 보입니다. 인스턴스를 사용하는 입장에서도 마치 저장 프로퍼티인 것처럼 사용할 수 있습니다.

 

결과 값 타입이 프로퍼티 타입과 같다면 return 키워드를 생략할 수 있습니다.

 

 

반응형