728x90
반응형

프로퍼티(Property)

지난 번에도 프로퍼티에 대해서 간단하게 이해하고 넘어간 것 같은데 이번에는 자세하게 공부해보려고 한다.

프로퍼티는 직역해보면 재산, 소유물 이라는 의미로 번역할 수 있다.
보통은 속성이란 단어로 대체하는데 여기에서 말하는 프로퍼티는
클래스, 구조체, 열거형 등의 객체 인스턴스가 그 내부에 가지고 있는 객체의 상태에 관한 정보를 말한다.
즉, 프로퍼티는 속성 값에 접근하는 방법을 말한다.

따라서, 프로퍼티는 다음과 같이 사용할 수 있다.

프로퍼티는 구조체, 클래스, 열거형 내부에 구현할 수 있다.
열거형 내부에는 연산 프로퍼티만 구현할 수 있다.
연산 프로퍼티는 var 로만 선언할 수 있다.
연산 프로퍼티를 읽기 전용으로는 구현할 수 있지만, 쓰기 전용으로는 구현할 수 없다.
읽기 전용으로 구현하려면 get 블럭만 작성해주면 된다. 읽기 전용은 get 블럭을 생략할 수 있다.
읽기, 쓰기 모두 가능하게 하려면 get 블러과 set 블럭을 모두 구현해주면 된다.
set 블럭에서 암시적 매개 변수 newValue 를 사용할 수 있다.

 

프로퍼티의 종류

저장 프로퍼티 | stored property

인스턴스의 일부로써 상수나 변수를 저장한다.
클래스와 구조체에서만 사용 가능하다.

struct Student {
    // 저장 프로퍼티
    var name: String = ""
    var `class`: String = "swift"
    var koreanAge: Int = 0
}

위와 같이 구조체에서 저장 프로퍼티인 변수를 확인할 수 있다. 상수 let 도 마찬가지로 설정해주면 된다.

연산 프로퍼티 | computed property

값을 계산하는 기능. 즉, 연산 기능을 한다. 클래스와 구조체, 열거형 모두 사용할 수 있다.
실제 값을 저장하는 프로퍼티가 아니라, 특정 상태에 따른 값을 연산하는 프로퍼티다.
getter, setter 의 역할을 수행할 수도 있다.

메서드 대신 연산 프로퍼티를 쓰는 이유는?
인스턴스 외부에서 메서드를 통해 인스턴스 내부 값에 접근하려면 getter, setter 메서드를 구현해야 한다.
이런 부분에서 연산 프로퍼티를 사용하는 것이 더 간편하고 직관적이라고 생각한다.
하지만, 읽기 전용, 쓰기 전용에 유의해서 사용해야 한다.

struct Point {
    var x: Int
    var y: Int
    
    var oppsitionPoint: Point {
        get {
            return Point(x: 10, y: 20)
        }
        
        // 암시적으로 newValue 라는 매개변수를 사용할 수 있다.
        set {
            x = -newValue.x
            y = -newValue.y
        }
        
        // set 에서 따로 매개변수 이름을 정해주려면
//        set(Param) {
//            x = Param.x
//            y = Param.y
//        }
    }
}

읽기 전용의 경우, 다음과 같이 사용할 수 있다.

struct Point {
    var x: Int
    var y: Int
    
    var oppositionPoint: Point {
        get {
            return Point(x: 10, y: 20)
        }
    }
    
    // get 을 생략해도 된다.
    var oppositionPoint: Point {
        return Point(x: 10, y: 10)
    }
}

프로퍼티 감시자 | property observer

프로퍼티의 값이 변경되면서 적절한 액션을 취할 수 있다.
프로퍼티의 값이 새로 할당될 때마다 호출되고 변경되는 값이 현재의 값과 같더라도 호출된다.
지연 저장 프로퍼티에서 사용할 수 없고, 오로지 저장 프로퍼티에만 적용할 수 있다. 연산 프로퍼티에는 사용할 수 없다.
프로퍼티 감시자에는 프로퍼티의 값이 변경되기 직전에 호출되는 willSet 메서드와
프로퍼티의 값이 변경된 직후에 호출되는 didSet 메서드가 있다.
willSet 에서는 변경될 값이 전달되고 didSet 에서는 변경되기 전의 값이 전달된다.
willSet 에서는 암시적으로 newValue 매개변수를 사용할 수 있고, didSet 에서는 암시적으로 oldValue 매개변수를 사용할 수 있다.

class Account {
    var credit: Int = 0 {
        willSet {
            print("잔액이 \(credit) 에서 \(newValue) 로 변경될 예정이다.")
        }
        
        didSet {
            print("잔액이 \(oldValue) 에서 \(credit) 으로 변경되었다.")
        }
    }
}

let myAccount: Account = Account()
myAccount.credit = 1000

========== 출려 결과 ==========

잔액이 0 에서 1000 로 변경될 예정이다.
잔액이 0 에서 1000 으로 변경되었다.

 

타입 프로퍼티 | type property

static 을 맨 앞에 붙여서 타입 프로퍼티를 정의할 수 있다.
타입 프로퍼티는 해당 타입의 인스턴스가 공유하는 개념이 아니라 타입 자체가 가지고 있는 프로퍼티를 말한다.
따라서 특정한 객체 인스턴스는 self를 통해서 액세스할 수 없고 반드시 객체의 타입명을 통해서 액세스해야 한다.
즉, 타입 자체에 속하는 프로퍼티라고 생각하면 된다.

import Swift

struct Student {
    // 타입 프로퍼티
    static var typeDesctiption: String = "학생"    
}

// 타입 연산 프로퍼티 사용
// Student 라는 객체의 타입명을 통해서 호출할 수 있다.
print(Student.selfIntroduction)

========== 출력 결과 ==========
학생

지연 저장 프로퍼티 | lazy stored property

처음으로 사용되기 전까지 초기 값이 계산되지 않는 프로퍼티다.
선언부 앞에 lazy 키워드를 작성해서 지연된 저장 프로퍼티를 만들 수 있다.
지연된 저장 프로퍼티는 반드시 변수로 선언해야 한다.
인스턴스 초기화가 완료된 이후에야 검색이 되기 때문이다.
상수 프로퍼티는 반드시 초기화 완료 전에 값을 갖고 있어야 하기 때문에 상수로 선언할 수 없다.
지연 저장 프로퍼티는 주로 복잡하거나 계산 비용이 높지만 필요해질 때까지 작동하지 않는 프로퍼티의 초기값들 다룰 때 좋다.

 

프로퍼티에 대해서 공부했는데 한 번에 이해하기 어렵다고 느꼈다.
프로퍼티에 대해 잘 정리된 여러 블로그를 통해 공부해서 보완해야겠다.😂

 

- 참고 사이트 - 

www.edwith.org/boostcamp_ios/lecture/11298

 

[LECTURE] 19. 프로퍼티 (💎생각해보기) : edwith

:: 프로퍼티 :: 1. 프로퍼티의 종류 인스턴스 저장 프로퍼티 타입 저장 프로퍼티 인스턴스 연산 프로퍼티 타입 연산 프로퍼티 지연 저장 프로퍼티 2. 정의와 사용 프로퍼티는 구조... - 부스트코스

www.edwith.org

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

 

[Swift] 프로퍼티(Property) - jinShine

프로퍼티(Property) 1. 프로퍼티 프로퍼티는 크게 5가지가 존재합니다. 저장 프로퍼티(Stored Properties) 지연 저장 프로퍼티(Lazy Stroed Properties) 연산 프로퍼티(Computed Properties) 프로퍼티 감시자(Property Obs

jinshine.github.io

soooprmx.com/archives/6707

 

Swift의 프로퍼티에 대한 이해 · Wireframe

프로퍼티(property)는 직역하자면 “재산”, “소유물” 등으로 번역되는데, 보통은 속성이라고 번역하여 쓰는 것이 일반적이다. (“속성”이라는 의미의 attribute와 혼동이 있을 수 있지만, 일단

soooprmx.com

velog.io/@co-in/공식-문서로-공부하는-Swift-9-프로퍼티

 

공식 문서로 공부하는 Swift (9) - 프로퍼티

Properties 프로퍼티(Property)는 클래스, 구조체, 열거형과 연관된 값이다. 저장 프로퍼티(stored property)는 인스턴스의 일부로써 상수나 변수를 저장한다. 계산 프로퍼티(computed property)는 값을 계산하

velog.io

 

728x90
반응형
복사했습니다!