티스토리 뷰

Swift

[Swift] Property

XXIN-dev 2021. 2. 21. 12:40

2021/02/20 - [iOS] - [Swift] Enum

2021/02/19 - [iOS] - [Swift] Struct와 Class의 차이

앞에서 struct, class, enum에 대해서 알아보았다.
이번에는 이들의 타입과 관련있는 값인 property에 대해서 알아보려고 한다.

🙋🏼‍♀️ What is Property?

프로퍼티는 클래스, 구조체, 열거형과 관련한 값입니다. 프로퍼티의 종류에는 저장 프로퍼티(Stored Properties) 계산된 프로퍼티(Computed Properties)가 있습니다. 저장 프로퍼티는 말 그대로 값을 저장하고 있는 프로퍼티이고, 계산된 프로퍼티는 값을 저장하고 있지 않고 특정하게 계산한 값을 반환해 주는 프로퍼티입니다. 계산된 프로퍼티는 클래스, 구조체, 열거형 모두에서 사용가능하지만, 저장 프로퍼티는 클래스와 구조체에서만 사용 가능합니다. 추가로 프로퍼티 옵저버를 정의해서 값이 변할 때마다 모니터링할 수 있습니다.

이미 The Swift Language Guide에서 자세하게 설명해줘서 더는 설명할 말이 없을 정도이다.
property의 종류는 이렇다고 요약할 수 있다.

  1. 인스턴스 프로퍼티
    1. 저장 프로퍼티
    2. 연산 프로퍼티
  2. 타입 프로퍼티
    1. 저장 프로퍼티
    2. 연산 프로퍼티

하나씩 천천히 알아보자!

 

💾 저장 프로퍼티(Stored Properties)

기존에 우리가 알던 단순히 값을 저장하고 있는 프로퍼티이다. 타입 내부에 let, var로 선언한 프로퍼티들이 다 Stored Properties였다.

struct Rectangle { 
	var height: Int? 
    	var width: Int? 
}
  • Stored Properties는 값을 stored하는데 사용한다.

 

💿 연산 프로퍼티(Computed Properties)

연산 프로퍼티는 값을 저장하지 않고 그때그때 연산한다. 실제 값을 저장하고 있는 것이 아니라 getter와 optional한 setter를 제공해 값을 탐색하고 간접적으로 다른 프로퍼티 값을 설정할 수 있는 방법을 제공한다.

struct Rectangle { 
	var height: Int? 
    	var width: Int? 
        var Round: Int? { 
            get{ 
                return height*2 + width*2 
            } 
            set{ 
                width = newValue
            } 
        } 
}
  • set -> 자기가 연산해서 할당, 변환

  • get -> 값을 꺼내가려면

하지만, getter setter를 함께 사용하는 경우는 드물다.

getter, setter을 사용하게 되면 외부에 내부 private 변수들을 노출한다.
변수를 외부에서 set 할때 노출시켜서 객체지향에서의 은닉화를 불가능하게 만든다.

따라서, Read-only로 많이 사용한다. Read-only는 매개변수 없고, 반환값이 없는 함수를 대체 가능하다.

  • getter만 구현하고 setter는 구현 X
struct Rectangle{ 
	var height: Int? 
        var width: Int? 
        var Round: Int? { 
            return height*2 + width*2 
        } 
} 

func Round(){ 
	print(height*2 + width*2) 
} 

Round의 연산 프로퍼티는 Round 함수와 동일한 동작을 보인다.

 

📀 프로퍼티 옵저버(Property Observers)

프로퍼티에는 새 값이 설정될 때마다 이 이벤트를 감지할 수 있는 옵저버를 제공한다. get, set과 비슷한 willSet, didSet을 이용하면 속성에 값이 지정되기 직전과 직후에 원하는 코드를 실행할 수 있다.

struct Rectangle { 
	var height: Int? { 
    	willSet { 
        	print("\(self.height)에서 \(newValue)로 값이 바뀔 예정입니다.") 
        } 
        
        didSet { 
        	print("\(oldValue)에서 \(self.height)로 값이 바뀌었습니다.") 
        } 
    }
}
  • willSet에서는 새로운 값을 newValue로 얻어올 수 있고

  • didSet에서는 예전 값을 oldValue라는 예약어를 통해 얻어올 수 있음

willSet과 didSet은 일반적으로 어떤 속성의 값이 바뀌었을 때 UI를 업데이트하거나 특정 메서드를 호출하는 등의 역할을 할 때에 사용한다.

 

☑️ 저장, 연산 Property

⭐️ 함수, 메서드, 클로저, 타입 등의 외부에 위치한 지역/전역 변수에도 모두 사용 가능하다.

 

🤔 인스턴스 프로퍼티와 타입 프로퍼티

저장과 연산 프로퍼티는 알겠고, '그럼 둘의 차이는 뭔가요?' 라고 생각할 수 있다.
위에 예시들은 모두 인스턴스 프로퍼티이다. 타입 프로퍼티는 위의 예시에 모두 static를 붙여준다고 생각하면 될 것이다. 그럼 둘의 의미 차이는 무엇일까?

  • 타입의 모든 인스턴스에 공통으로 적용하고 싶은 값이 있을때 타입 프로퍼티를 이용하자!

  • static 프로퍼티는 인스턴스 없이 바로 타입에 접근 가능!





잘못된 점과 피드백은 댓글로 주시면 감사하겠습니다.

참고:
https://jusung.gitbook.io/the-swift-language-guide/language-guide/10-properties
https://devxoul.gitbooks.io/ios-with-swift-in-40-hours/content/Chapter-3/classes-and-structures.html

'Swift' 카테고리의 다른 글

[Swift] Enum  (0) 2021.02.20
[Swift] Struct와 Class의 차이  (0) 2021.02.19
링크
최근에 올라온 글
최근에 달린 댓글