문법

[iOS] 2025.03.18 문법(프로퍼티)

ioskkt 2025. 3. 18. 17:41

Property

: class, struct, enum 등에서 사용되는 변수나 상수를 프로퍼티라고 함.

  • 저장 프로퍼티
  • 연산 프로퍼티
  • 타입 프로퍼티
  • 프로퍼티 옵저버
  • 지연저장 프로퍼티

 

저장 프로퍼티(Stored Property)

  • 데이터를 저장하는 프로퍼티.
  • var, let 모두 사용할 수 있음.
  • class, struct 등에서 데이터를 저장하기 위한 변수와 상수를 의미.
  • enum에서는 저장 프로퍼티를 사용할 수 없음.(빌드 오류 발생)
  • 초기값을 가질 수 있음.
struct Person {
    var name: String // 값을 저장하는 저장 프로퍼티
    var age: Int = 0 // 값을 저장하는 초기값이 있는 저장 프로퍼티
}

 

연산프로퍼티(Computed Property)

  • 값을 직접 저장하지 않고 계산된 값을 제공하는 프로퍼티.
  • class, struct, enum 등에서 사용가능함.
  • var 만 사용 가능함.
  • 동적으로 계산하여 값을 반환하기 때문에 상수 let은 사용할 수 없음.
  • getter와 setter를 사용하여 동적으로 값을 계산함
  • getter는 get 키워드를 사용하여 코드블록을 구현하여 사용함.
  • setter는 set 키워드를 사용하여 코드블록을 구현하여 사용함.
  • getter는 필수이고 setter는 구현하지 않아도 됨.
  • setter를 구현하지 않았다면 get 키워드를 생략할 수 있음.
// Getter와 Setter 모두 있는 연산 프로퍼티
struct Person {
    var name: String // 값을 저장하는 저장 프로퍼티
    var age: Int = 0 // 값을 저장하는 초기값이 있는 저장 프로퍼티

    var isAdult: Bool { // getter와 setter를 제공하는 연산 프로퍼티
        get {
            return age >= 20
        }

        set {
            if newValue == true { // newValue는 할당한 새로운 값을 의미합니다.
                age = 20
            } else {
                age = 19
            }
        }
    }
}

var person = Person(name: "Brody", age: 100) // person 변수에 Person 구조체를 생성하여 할당합니다.
                                             // name에는 "Brody"를 age에는 100을 할당합니다.
print(person.isAdult)    // age가 20보다 크므로 isAdult는 true가 됩니다.
person.isAdult = false   // isAdult를 false로 변경하면 isAdult 연산프로퍼티의 Set
                         // 코드블록이 실행되어 age를 19로 변경합니다.
print(person.age)        // age가 19이므로 19가 출력됩니다.
// Setter 가 구현하지 않은 연산프로퍼티
struct Person {
    var name: String // 값을 저장하는 저장 프로퍼티
    var age: Int = 0 // 값을 저장하는 초기값이 있는 저장 프로퍼티

    var isAdult: Bool { // getter만 제공하는 연산 프로퍼티
        get {
            return age >= 20
        }
    }
}

var person = Person(name: "Brody", age: 100) // person 변수에 Person 구조체를 생성하여 할당합니다.
                                             // name에는 "Brody"를 age에는 100을 할당합니다.
print(person.isAdult)    // age가 20보다 크므로 isAdult는 true가 됩니다.
person.isAdult = false   // isAdult에는 Getter만 있기때문에 새로운 값을 할당할 수 없습니다.
                         // Compile Error 발생
// Setter가 구현되지 않았을 때는 get 키워드를 생략 할 수 있습니다.

struct Person {
    var name: String // 값을 저장하는 저장 프로퍼티
    var age: Int = 0 // 값을 저장하는 초기값이 있는 저장 프로퍼티
    
    var isAdult: Bool { // get 키워드가 생략된 연산 프로퍼티 Only Get
        return age >= 20
    }
}

 

타입 프로퍼티(Type Property)

  • 모든 인스턴스가 공유하는 프로퍼티로, 인스턴스를 만들지 않고 타입 자체에서 접근 가능함.
  • static 키워드를 사용
  • 타입이름.타입프로퍼티이름 형태로 접근 가능
struct Person {
    static var structName = "Person" // static 키워드를 사용한 타입 프로퍼티 입니다.
                                     // 타입 프로퍼티의 이름은 structName이고 "Person"을 할당합니다.

    func logStructName() {
        print(Person.structName) // 내부에서는 Self로 사용 가능
    }
}

var person = Person()
person.logStructName() // "Person" 출력
Person.structName = "Changed!" // Person의 타입프로퍼티 structName의 값을 "Changed!"로 변경합니다.
person.logStructName() // "Changed!" 출력
print(Person.structName) // "Changed!" 출력
// enum 에서 사용하기
enum Season: String {
    case spring
    case summer
    case autumn
    case winter
    
    static var enumName = "Season"
}

Season.enumName // "Season"

 

 

프로퍼티 옵저버(Property Observers)

  • 저장 프로퍼티의 값이 변경되는 것을 감시하고 있다가 코드블록을 실행할 수 있는 기능.
  • 저장 프로퍼티 타입 뒤에 코드블록을 작성하여 만들 수 있음.
  • 저장 프로퍼티가 사용 가능한 struct, class 에서 사용 가능함.
  • willSet, didSet을 제공함. 둘 중 하나만 작성해도 됨.
  • willSet
  • 값이 변경되기 전에 호출됨.
  • 변경 될 값은 newValue를 통해 접근하며, 이름을 정할 수 있음.
  • 이름을 정하려면 willSet(이름) 형식으로 작성하면 됨.
  • didSet
  • 값이 변경된 후 호출됨.
  • 변경되기 전의 값은 oldValue를 통해 접근하며, 이름을 정할 수 있음.
  • 이름을 정하려면 didSet(이름) 형식으로 작성하면 됨.
// 기본 사용 방법

struct Person {
    var name: String {
        willSet {
            print("Person의 name이 변경될 예정입니다. 변경될 값은 \"\(newValue)\" 입니다.")
        }
        
        didSet {
            print("Person의 name이 변경되어 didSet 코드블록이 호출되었습니다.")
            print("\(oldValue) -> \(name)")
        }
    }
    var age: Int
}

var person = Person(name: "Brody", age: 10)

person.name = "Apple"

/* 출력 값
Person의 name이 변경될 예정입니다. 변경될 값은 "Apple" 입니다.
Person의 name이 변경되어 didSet 코드블록이 호출되었습니다.
Brody -> Apple
*/
// newValue, oldValue 다른 이름으로 변경해서 사용하기
struct Person {
    var name: String {
        willSet(changeNewName) { 
            print("Person의 name이 변경될 예정입니다. 변경될 값은 \"\(changeNewName)\" 입니다.")
        }
        
        didSet(beforeName) {
            print("Person의 name이 변경되어 didSet 코드블록이 호출되었습니다.")
            print("\(name) -> \(beforeName)")
        }
    }
    var age: Int
}

 

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

 

  • 처음 사용하기 전까지 실제로 메모리에 값을 저장하지 않는 지연된 저장 프로퍼티.
  • 사용하기 전까지 값을 저장하지 않기 때문에 메모리 효율을 높일 수 있음.
  • lazy 키워드를 사용
  • lazy var 프로퍼티이름 형태로 사용
  • var 에서만 사용 가능
  • 저장 프로퍼티를 사용할 수 있는 class, struct 등에서 사용할 수 있음.
class Person {
    var name: String = "A"
    var age: Int = 15
    lazy var height = 175.7
}

let person = Person()
// Person의 height값에 접근하지 않았기 때문에 아직 메모리에 할당되지 않은 상태
print(person.height) // height값을 사용하기 때문에 이제 메모리에 할당하여 사용함.


struct Animal {
    var name: String
    var age: Int
    lazy var color: String = "Black"
}

var animal = Animal(name: "Dog", age: 10) // color값에 접근하지 않았기 때문에 아직 메모리에 할당되지 않은 상태
print(animal.color) // color값을 사용하기 때문에 이제 메모리에 할당하여 사용함.

'문법' 카테고리의 다른 글

[iOS]2025.04.04 문법(옵셔널)  (0) 2025.04.04
[iOS] 2025.03.21 문법(메소드)  (0) 2025.03.24
[iOS] 2025.03.18 문법(struct)  (0) 2025.03.18
[iOS] 2025.03.18 문법(class, init)  (0) 2025.03.18
[iOS] 2025.03.18 문법(인스턴스)  (0) 2025.03.18