본문 바로가기

IT/Swift

[swift] Property

 

[swift 기초문법] - 프로퍼티 (Property)

 

저장 프로퍼티 (Stored Property)

인스턴스의 변수 또는 상수를 의미한다.

클래스 또는 구조체의 인스턴스와 연관된 값을 저장한다.

옵셔널이 아니면 클래스에서는 기본값을 셋팅하거나 이니셜라이져로 초기화를 해줘야 한다.

 

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

lazy 키워드를 사용하여 var 로 정의한다.

호출이 있어야 값을 초기화한다.

불필요한 성능 저하나 공간 낭비를 줄일 수 있다.

 

struct Point{ 

var x: Int = 0

var y: Int = 0 

 

class Position{ 

lazy var point: Point = Point() 

 

let yagomPosition: Position = Position() 

 

//이때 Point()가 생성됨 

print(yagomPosition.point)

 

 

 

연산 프로퍼티 (Computed Property)

특정 연산을 수행한 결과 값을 의미한다.

클래스, 구조체, 열거형에 사용한다.

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

getter, setter 역할을 수행한다.

메서드로 구현하는 것보다 간편하고 직관적이므로 가독성이 좋다.

set 메서드 내부에서 전달받은 전달인자를 사용할 수 있다.

관용적인 표현으로 newValue로 매개변수 이름을 대신할 수 있다.(매개변수 따로 표기 X)

get 메서드만 사용하여 읽기 전용으로 만들 수 있다.

 

struct Point{ 

var x: Int = 0 

var y: Int = 0 

 

var oppositePoint: Point{ 

get

return Point(x:-x,y:-y) 

set(opp){ 

x = -opp.x 

y = -opp.y 

 

var testPoint: Point = Point(x: 1, y: 2) 

 

//getter 기능 

print(testPoint.oppositePoint) 

//Point(x: -1, y: -2) 

 

//setter 기능 

testPoint.oppositePoint = Point(x: 2, y: 3) 

print(testPoint) 

// Point(x: -2, y: -3)

 

타입 프로퍼티 (Type Property)

인스턴스가 아닌 타입 자체에 속하게 되는 프로퍼티를 말합니다.

인스턴스의 생성 여부와 상관없이 타입 프로퍼티의 값은 하나입니다.

구조체와 클래스에서만 사용한다.

class 타입 프로퍼티 : 상속 가능

static 타입 프로퍼티 : 상속 불가능

저장 타입 프로퍼티 : 변수, 상수로 사용, 반드시 초기값을 셋팅해야하며 지연 연산됩니다.(lazy 키워드를 쓰지 않습니다.)

    static  var storedTypeProperty: Int = 0

연산 타입 프로퍼티 : 변수로만 사용

    static var computeTypeProperty: Int {

      get {

         return property

      }

      set {

         property = newValue

      }

    }

 

 

 

 

프로퍼티 감시자 (Property Observers)

프로퍼티의 값이 변할 때 변화에 따른 특정 액션을 수행한다.

변경되는 값이 현재 값과 같더라도 호출된다.

저장 프로퍼티에 적용 가능하다.

지연 저장 프로퍼티에는 사용 불가능하다.

상속된 프로퍼티에 사용 가능

연산 프로퍼티는 상송받았을 때에만 프로퍼티 재정의를 통해 프로퍼티 감시자를 사용할 수 있다.

willSet : 값이 변경되기 직전에 호출, 변경될 값이 전달

didSet : 값이 변경된 직후에 호출, 변경되기 전의 값이 전달

 

class Account{ 

var credit: Int = 0 { 

willSet

print("잔액이 \(credit)원에서 \(newValue)원으로 변경될 예정입니다.") 

didSet

print("잔액이 \(oldValue)원에서 \(credit)원으로 변경되었습니다.") 

}

 

var dollarValue: Double

get

return Double(credit) 

set

credit = Int(newValue * 1000) 

print("잔액을 \(newValue)달러로 변경 중입니다.") 

}

}

 

class ForeignAccount:Account{ 

override var dollarValue: Double

willSet

print("잔액이 \(dollarValue)원에서 \(newValue)원으로 변경될 예정입니다.") 

didSet

print("잔액이 \(oldValue)원에서 \(dollarValue)원으로 변경되었습니다.") 

}

 

let myAccount: ForeignAccount = ForeignAccount() 

myAccount.credit = 1000 

//잔액이 0원에서 1000원으로 변경될 예정입니다. 

//잔액이 0원에서 1000원으로 변경되었습니다. 

 

myAccount.dollarValue = 2 

//잔액이 1000.0원에서 2.0원으로 변경될 예정입니다. 

//잔액이 1000원에서 2000원으로 변경될 예정입니다. 

//잔액이 1000원에서 2000원으로 변경되었습니다. 

//잔액을 2.0달러로 변경 중입니다. 

//잔액이 1000.0원에서 2000.0원으로 변경되었습니다.

 

 

'IT > Swift' 카테고리의 다른 글

[swift] Closure, Capture list  (0) 2018.04.02
[swift] Mutating, Memberwise Initializers, Access Control  (0) 2018.03.13
[swift] Optional, Optional Chaining  (0) 2018.03.08
[swift] Method, Struct, Class  (0) 2018.03.07
[swift] Operator, Flow Control  (0) 2018.03.06