궁금한 내용을 검색해보세요!
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
서근 개발노트
티스토리에 팔로잉
SWIFT/Grammar

Swift : 기초문법 [프로퍼티#2 - 연산 프로퍼티]

서근
QUOTE THE DAY

-
Written by SeogunSEOGUN

반응형

본 게시글은 yagom님과Zedd0202님의 게시글을 참고하여 작성되었습니다.

 

 

연산 프로퍼티 getter / setter 

Computed Property 연산 프로퍼티

  • 클래스, 구조체, 열거형에서 사용 가능
  • var로 선언해야 함
  • 클래스, 구조체, 열거형에 값을 저장할 저장 프로퍼티가 반드시 하나 있어야 함
  • get, set을 동시에 구현 가능하고, 읽기 전용으로 get만 구현 가능
  • set의 매개변수를 생략한다면 반드시 newValue 키워드를 사용해야 함
  • 직접적인 값을 저장하지 않고 값을 연산한 결괏값
  • 특정 타입의 인스턴스에 사용되는 것을 뜻함

 

실제 값을 저장하는 프로퍼티가 아니라, 그때그때 값을 연산하고 값을 돌려주는 접근자 역할 또는 내부 프로퍼티 값을 간접적으로 설정하는 설정자 역할을 함.

 

클래스, 구조체, 열거형은 저장 프로퍼티 이외에도 값을 저장하지 않는 연산 프로퍼티를 정의할 수 있는데, 바로 gettersetter를 통해 다른 프로퍼티와 간접적으로 값을 검색하고 세팅한다.

struct CoordinatePoint {
    var x: Int = 1
    
    var oppositePoint: CoordinatePoint { //연산 프로퍼티
        get { //접근자
            return CoordinatePoint(x: -x)
        }
        
        set(oppsite) { //설정자
            x = -oppsite.x
        }
    }
}

var SeogunPosition: CoordinatePoint = CoordinatePoint()
print(SeogunPosition) // x: 1
print(SeogunPosition.oppositePoint) //x: -1

// 설정자 x = -oppsite.x이기 때문에 접근 가능
// 대칭 좌표를 20 으로 설정하면
SeogunPosition.oppositePoint = CoordinatePoint(x: 20)
// 현재 좌표는 -20 으로 설정된다
print(SeogunPosition) // x: -20

oppositePointx에 대해 '연산'을 한다. 만약 값을 읽으려고 하면 x에 있는 값을 리턴하고, 값을 지정할 때는 x-를 붙여 x에 저장하게 된다.

 

중요한 점은 연산 프로퍼티는 값을 '저장' 하기보다는 '연산'을 한다는 것이다.

 

oppositePoint는 값을 저장하는 역할이 아닌 값을 '연산' 해서 x에 할당 또는 리턴하는 역할만 한다. 또, 연산 프로퍼티는 값이 고정되어 있지 않기 때문에 반드시 변수 var로 선언되어야 한다.

 

자 이렇게 연산 프로퍼티 사용해서 한 프로퍼티에 접근자(getter)와 설정자(setter)가 모두 있고, 해당 프로퍼티가 무슨 역할을 하는지 명확하게 표현할 수 있다.

 

위 코드에서 설정자의 매개변수로 원하는 이름을 명시하면 set 메서드 내부에서 전달받은 전달 인자를 사용 가능하고, newValue라는 매개변수 이름으로 사용 가능하다. 이럴 경우에는 매개변수를 표기하지 않으면 된다.

TIP
 
 

newValue
괄호 매개변수 없이 set만 쓴다면 반드시 newValue 키워드를 사용해야 한다.

 

또, 접근자 내부의 코드가 만약 한 줄이고 결괏값과 타입이 같다면 return 키워드도 생략 가능하다.

struct CoordinatePoint {
    var x: Int = 1
    
    var oppositePoint: CoordinatePoint {
        get {
          CoordinatePoint(x: -x)  //return 키워드 생략
        }
        //설정자의 매개변수 이름 제거. newValue로 대체가능
        set {
            x = -newValue.x
        }
    }
}
var SeogunPosition: CoordinatePoint = CoordinatePoint()
print(SeogunPosition) // x: 1
print(SeogunPosition.oppositePoint) //x: -1

Read-Only Computed Properties

대칭점을 설정할 필요가 없다면 읽기 전용으로 연산 프로퍼티를 사용할 수 있다. 이때는 set 설정자를 제거한 get 접근자만 사용하면 된다. 하지만 set만 가지는 것은 불가능!

struct CoordinatePoint {
    var x: Int
    
    var oppositePoint: CoordinatePoint {
        get {
          return CoordinatePoint(x: -x)
        }
    }
}

var SeogunPosition: CoordinatePoint = CoordinatePoint(x: 10)
print(SeogunPosition) // x: 10
print(SeogunPosition.oppositePoint) //x: -10

// ERROR : 설장자 set을 구현하지 않았으므로 접근이 불가능 하다.
SeogunPosition.oppositePoint = CoordinatePoint(x: 20)

 

읽어주셔서 감사합니다🤟

 


잘못된 내용이 있으면 언제든 피드백 부탁드립니다.


서근


위처럼 이미지 와 함께 댓글을 작성할 수 있습니다.