250x250
반응형
05-13 00:26
Today
Total
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Notice
Recent Posts
Recent Comments
Link
Archives
관리 메뉴

Bill Kim's Life...

[Swift] Properties(프로퍼티) : 개념과 사용 방법 본문

CS(컴퓨터 과학)/Swift

[Swift] Properties(프로퍼티) : 개념과 사용 방법

billnjoyce 2020. 6. 11. 13:43
728x90
반응형
Swift5의 프로퍼티에 대한 개념과 사용 방법에 대해서 살펴봅니다.

 

 

#. 개발 환경

  • Xcode 11.x 이상
  • Swift 5

 

 


 

 

Propertie(프로퍼티)란?

 

프로퍼티란 클래스, 구조체, 열거형에서 소속된 변수 및 속성(Attributes)등을 불리우는 개념입니다.

 

프로퍼티의 종류는 크게 아래와 같이 분류할 수 있습니다.

 

1. Storeed Property(저장 프로퍼티) 
2. Computed Property(연산 프로퍼티)
3. Type Property(타입 프로퍼티)

 

  • Stored Property
    • 인스턴트의 변수나 상수를 지칭
    • Stored Property는 사용 시점에 따라서 Lazy Stored Property라는 것도 있음
  • Computed Property
    • 직접적인 값을 저장하지 않고 값을 연산한 결과값
  • Type Property
    • 특정 타입에 사용되는 프로퍼티(클래스 변수 등)

 

 

 

그럼 해당 프로퍼티에 대해서 좀 더 자세히 하나하나 살펴보겠습니다.

 

 

 


 

Storeed Propertie(저장 프로퍼티)

 

Storeed Property(저장 프로퍼티) 의 개념 및 특징은 아래와 같습니다.

 

 

- 객체의 값(속성)을 저장하고 있는 기본적인 프로퍼티
- 객체가 생성이 되면 자동적으로 초기화된다.
- 클래스, 구조체에서 지원, 열거형(Enum)에는 지원되지 않음
- var로 선언하면 "변수"를 저장
- let으로 선언하면 "상수"를 저장, 선언 이후 변경 불가

 

★ 구조체 사용 예시

struct FixedLengthRange {
   var firstValue: Int
   let length: Int
}

let rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3)

// 구조체는 Value Type 데이터이므로 let으로 타입 변경 가능
rangeOfThreeItems.firstValue = 6 // error!
rangeOfThreeItems.length = 10 // error!

var rangeOfThreeItems2 = FixedLengthRange(firstValue: 0, length: 3)
rangeOfThreeItems2.firstValue = 6

 

★ 클래스 사용 예시

 

class FixedLengthRange {
   var firstValue: Int
   let length: Int

   init(firstValue : Int, length:Int) {
        self.firstValue = firstValue
        self.length = length
   }
}

Let rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3)

// 클래스는 기본적으로 Reference Type 데이터이므로 let으로 선언하여도 원본에 바로 접근rangeOfThreeItems.firstValue = 3
rangeOfThreeItems.length = 10 // error!

 

 

 


 

Lazy Stored Property(지연 저장 프로퍼티)

 

 

그렇다면 Stored Property의 또다른 종류인 Lazy Stored Property(지연 저장 프로퍼티) 의 개념 및 특징을 살펴보겠습니다.

 

- 변수가 사용된 이후에 저장되지 않는 프로퍼티
- 즉, 값이 사용되기 전까지는 계산되지 않는다.
- lazy라는 키워드를 사용하여 선언
- let 상수 타입은 사용 불가
- lazy 프로퍼티가 초기화 되지 않은 상태에서 여러 쓰레드가 동시에 이 lazy프로퍼티에 액세스 한다면, 이 프로퍼티가 단 한번만 초기화 된다는 것을 보장할 수 없음

 

★ 클래스 사용 예시

 

class DataImporter {
     /*
         DataImporter는 외부 파일에서 데이터를 가져오는 클래스입니다.
         이 클래스는 초기화 하는데 매우 많은 시간이 소요된다고 가정하겠습니다.
     */

     var filename = "data.txt"
}

class DataManager {
   lazy var importer = DataImporter()
   var data = [String]()
}

let manager = DataManager()

manager.data.append("Some data")
manager.data.append("Some more data”)

// DataImporter 인스턴스는 이 시점에 생성돼 있지 않습니다.
        
print(manager.importer.filename)
// the DataImporter 인스턴스가 생성되었습니다.
// "data.txt" 파일을 출력합니다.

 

 


 

Computed Property(연산 프로퍼티)

 

 

이번에는 Computed Property(연산 프로퍼티)의 개념 및 특징을 살펴보겠습니다.

 

- 특정 연산을 통해 필요할 때 연산을 통해 값을 리턴
- 클래스, 구조체, 열거형에서 모두 사용 가능
- var로 선언하여야 한다.
- 반드시 연산 프로퍼티를 위한 저장 프로터티가 하나 있어야 한다.
- 실제 값을 가지고 있는 것이 아리나, getter, seeter등을 통해서 값을 설정하고 전달해준다.
- get, set 동시에 구현 가능하며, get만 구현하는 것도 가능
- set만 구현하는 것은 안된다.
- set에서 파라미터를 생략할 수 있으며, newValue 키워드를 사용
- 기존 언어의 Getter, Setter보다 코드의 분산도 줄이고 직관적임

 

★ 사용 예시

 

struct Point{
    var x: Int
    var y: Int

    var oppositePoint: Point{
        set(point) {
            x = -point.x
            y = -point.y
       }
       get {
            return Point(x: -x, y: -y)
       }
   }
            
   var oppositePoint2: Point{
       set { // Swift에서의 set 함수에는 반드시 입력값이 있으므로 미지 지정한 newValue 키워드를 통하여 축약 가능하다.
           x = -newValue.x
           y = -newValue.y
       }
       get {
           return Point(x: -x, y: -y)
       }
   }
}
        
var point = Point(x: 10, y: 10)
print(point.oppositePoint) // Point(x: -10, y: -10)
print(point) // Point(x: 10, y: 10)
        
point.oppositePoint = Point(x: 10, y: 10)
print(point) // Point(x: -10, y: -10)

 

 

 


 

Type Property(타입 프로퍼티)

 

 

마지막으로 Type Property(타입 프로퍼티)에 대해서 살펴보겠습니다.

 

-인스턴스 생성없이 객체내의 프로퍼티에 접근가능
- 프로퍼티를 타입 자체와 연결하는 것을 지칭
- 타입 프로퍼티는 저장 타입 프로퍼티와 연산 타입 프로퍼티가 있음
- 연산 타입 프로퍼티는 무조건 변수(var)로 선언 가능로 선언 가능
- static 키워드를 사용하여 정의
- 클래스 타입에 대한 연산 타입 프로퍼티의 경우, class 키워드를 사용하여 서브클래스가 슈퍼클래스의 구현을 재정의(override)할 수 있음

 

★ 사용 예시

 

struct SomeStructure {
       static var storedTypeProperty = "Some value."
       static var computedTypeProperty: Int {
            return 1
       }
}

enum SomeEnumeration {
     static var storedTypeProperty = "Some value."
     static var computedTypeProperty: Int {
            return 6
     }
}

class SomeClass {
      static var storedTypeProperty = "Some value."
      static var computedTypeProperty: Int {
             return 27
      }

      class var overrideableComputedTypeProperty: Int {
            return 107
      }
}
        
class ChildSomeClass : SomeClass{
      // 슈퍼클래스의 특정 타입 프로터티를 재정의 가능
      override static var overrideableComputedTypeProperty: Int{
               return 2222
      }
}

// 별도의 인스턴스 생성없이 바로 ‘.’을 통해서 프로퍼티 접근 가능

SomeStructure.storedTypeProperty = "Another value."
        
print(SomeStructure.storedTypeProperty) // Prints "Some value."
print(SomeStructure.storedTypeProperty) // Prints "Another value."
print(SomeEnumeration.computedTypeProperty) // Prints "6"
print(SomeClass.computedTypeProperty) // Prints "27"

 


 

 

지금까지 설명한 프로퍼티에 대해서는 프로퍼티 옵저버(Property Observer)를 통하여 특정 값이 변경될 때 이벤트를 감지할 수 있습니다.

 

프로퍼티 옵저버(Property Observer)란?

 

- 새값이 설정될 때 해당 이벤트를 감지할 수 있는 옵저버를 제공
- 프로퍼티 옵저벼는 새 값이 이전 값과 같더라도 항상 호출
- 지연 저장 프로퍼티에서는 사용할 수 없음
- 연산 프로퍼티 setter에서 값의 변화를 감지할 수 있음

 

제공되는 옵저버(Observer)

 

willSet: 값이 저장되기 바로 직전에 호출됨
didSet:
새 값이 저장되고 난 직후에 호출됨

 

★ 사용 예시

 

class StepCounter {
       var totalSteps: Int = 0 {
            willSet(value) {
                 print("About to set totalSteps to \(newTotalSteps)")
            }
            didSet {
                if totalSteps > oldValue  {
                   print("Added \(totalSteps - oldValue) steps")
               }
           }
       }
}
        
let stepCounter = StepCounter()
        
stepCounter.totalSteps = 200
// About to set totalSteps to 200
// Added 200 steps
        
stepCounter.totalSteps = 360
// About to set totalSteps to 360
// Added 160 steps
        
stepCounter.totalSteps = 896
// About to set totalSteps to 896
// Added 536 steps

 

 

 

 


 

 

 

이상으로 Swift 문법 중에서 Property라는 개념과 그 사용 방법에 대해서 한번 살펴보았습니다.

다소 긴듯한 강의 글을 읽어주셔서 감사드리오며 이상으로 본 강의를 마치도록 하겠습니다.

 

 

 

혹시나 질문 사항이나 문의 사항이 있으신 분들은 언제나 의견을 주시면 감사하겠습니다.

 

 

 

그럼 모두들 언제나 행복하세요~~ ^^

 

 

 

 

 

www.slideshare.net/BillKim8/properties-233789906

 

[Swift] Properties

[Swift] Properties(프로퍼티) 에 관한 강의 자료입니다.

www.slideshare.net

 

 

 


[참고 자료(References)]

 

[1] Swift ) Properties - Stored Property(저장 프로퍼티): https://zeddios.tistory.com/243

[2] Swift ) Properties - Computed Property(연산 프로퍼티) : https://zeddios.tistory.com/245

[3] Swift - 프로퍼티 : https://penguin-story.tistory.com/37

[4] Swift의 프로퍼티에 대한 이해 : https://soooprmx.com/archives/6707

[5] 프로퍼티 : https://yagom.github.io/swift_basic/contents/13_property/

[6] [Swift] 프로퍼티(Property) : https://jinshine.github.io/2018/05/22/Swift/6.프로퍼티(Property)/

[7] [스위프트 대충보기] 9. 프로퍼티(property) : https://github.com/enshahar/swiftsummary/blob/master/%5B스위프트%20대충보기%5D%209.%20프로퍼티(property).md

[8] 프로퍼티 get, set, didSet, willSet in iOS : https://medium.com/ios-development-with-swift/프로퍼티-get-set-didset-willset-in-ios-a8f2d4da5514

[9] [Swift] Computed Properties (연산 프로퍼티) : https://hyesunzzang.tistory.com/133

[10] Swift - 프로퍼티(Properties) : http://seorenn.blogspot.com/2014/06/swift-properties.html

 

728x90
반응형
Comments