본문 바로가기

Swift

Swift(2) - Computed Property(연산 프로퍼티)란 무엇일까?

 안녕하세요! 이번에는 저번에 저장 프로퍼티에 이어서 연산 프로퍼티에 대해 공부해보려고 합니다!

 

 

연산 프로퍼티(Computed Properties)


먼저, 애플 공식 문서에 있는 연산 프로퍼티의 정의에 대해 알아볼게요!

  •  문장을 해석해보자면 저장 프로퍼티 이외에도, 클래스, 구조체, 그리고 열거형은 값을 실제로 저장하지 않는 Computed property를 정의할 수 있다. 대신에, 연산 프로퍼티는 getter setter를 통해 다른 프로퍼티와 간접적으로 값을 검색하고 설정하는 것을 제공한다.

연산 프로퍼티(Computed Property)

  1. 실제 값을 저장하는 프로퍼티가 아니라, 특정 상태에 따른 값을 연산 하는 프로퍼티입니다.

  2. 인스턴스 내/외부의 값을 연산하여 적절한 값을 돌려주는 접근자(getter)의 역할이나 은닉화된 내부의 프로퍼티 값을 간접적으로 설정하는 설정자(setter)의 역할을 하기도 합니다.

  3. getter와 setter를 사용하려면 그 연산된 값을 저장할 변수가 반드시 있어야 합니다. (연산 프로퍼티의 경우 값이 고정된 것이 아니기 때문에 항상 변수로만 선언이 가능합니다.)

 

이렇게 정의로만 설명을 하니 이해가 잘 되지 않는데요! 다음은 예시를 통해서 알아보도록 하겠습니다!

 

 

 

여기서 한가지 더 말할것이 있다면 위에 보시면 설정자에 set(point) 로 해준 것 보이시죠? 

- > 설정자의 매개변수는 원하는 표현을 사용할 수 있는데요. 관용적인 표현으로는 newValue를 사용하지만 원하는 사람 마음대로 매개변수 이름을 바꾸는 것도 가능합니다. 하지만 매개변수 없이 set만 쓴다면 꼭!! newValue라는 키워드만 사용 가능합니다!!

 

이렇게 말하니 저도 잘 이해가 안가니 예시를 들도록 하겠습니다. 위의 예시에서 설정자 선언한 부분만 코드로 나타내볼게요!

// 설정자
set(minho) {
  x = -minho.x * 2
  y = -minho.y * 2
}

// 이렇게 설정자의 매개변수의 값에는 자신이 원하는 값을 넣을 수 있습니다!!
// 하지만 이 매개변수를 생략하고 싶다면!!

set {
  x = -newValue.x * 2
  y = -newValue.y * 2
}

// newValue만 사용할 수 있다는 것입니다!

이제 이해가 되시나요??

 

그렇다면 굳이 이렇게 연산 프로퍼티를 사용하는 이유는 무엇일까요?

  • 인스턴스 외부에서 인스턴스 메서드 값에 접근하려고 할때 메서드를 통해 구현하려면 2개의 메서드(설정자, 접근자)를 구현해줘야 합니다. 

  • 또한 이를 감수하고 메서드를 구현한다고 해도 두 메서드가 분리되면 코드의 가독성이 나빠지겠죠? 따라서 프로퍼티 안에서 접근자와 설정자의 역할을 하는 연산 프로퍼티를 사용하는 것입니다!

struct CoordinatePoint {
    var x: Int
    var y: Int
    
    // 대칭점을 구하는 메서드 - 접근자
    func oppositepoint() -> CoordinatePoint {
        return CoordinatePoint(x: -x, y: -y)
    }
    
    // 대칭점을 설정하는 메서드 - 설정자
    mutating func setOppositePoint(_ opposite: CoordinatePoint) {
        x = -opposite.x * 2
        y = -opposite.y * 2
    }
}
  • 위의 연산 프로퍼티와 똑같은 역할을 하지만 연산 프로퍼티를 사용하지 않는다면 메서드를 2개나 구현해줘야 함을 확인할 수 있습니다! 
  • 이를 통해 연산 프로퍼티를 사용하면 이 두 메서드를 좀 더 간결하고 가독성 있게 표현이 가능한 것을 볼 수 있습니다~

 

읽기 전용 연산 프로퍼티(Read-Only Computed properties)


  • 위의 예시로 봤을때 굳이 대칭점을 설정해줄 필요가 없다면 읽기 전용 연산 프로퍼티를 사용하는 것도 가능합니다!

  • 이때 읽기 전용으로 구현하려면 get 메서드만 사용해서 구현하도록 합니다.

  • 하지만 이때 읽기 전용이라 하더라도 프로퍼티를 상수(let)으로 선언하는 것은 불가능합니다. getter나 setter가 필요하다면 무조건 변수로만 선언이 가능합니다!

  • 또한 이렇게 읽기 전용으로만 생성이 가능하면 set만 가지는 것도 가능한지 궁금하실텐데 set만 가지는 것은 불.가.능 합니다.

  • 그럼 위의 예시를 사용하여 똑같이 읽기 전용 연산 프로퍼티를 구현하도록 하겠습니다.

위와 똑같은 예시에서 set을 빼고 읽기 전용 연산 프로퍼티로 만들어보았습니다!

minhoPosition.oppositePoint = CoordinatePoint(x: 30, y: 40)

보시면 설정자가 없기 때문에 오류가 생긴 것을 확인하실 수 있습니다. 오류 메세지를 살펴 보신다면 (oppositePoint는 읽기 전용 프로퍼티 이기 때문에 프로퍼티에 할당하는 것이 불가능 함을 확인할 수 있습니다!)

 

 

이렇게 연산 프로퍼티(Computed property)에 대해 정리해보았는데요! 혹시라도 잘못된점 있으면 지적 부탁드리겠습니다. 다음에는 프로퍼티 감시자와 타입 프로퍼티 관련된 내용을 공부해서 정리하도록 할게요!


오늘은.. 여기까지..