iOS/Swift

Swift 에서의 프로퍼티(Property)

태애니 2025. 3. 21. 22:08
728x90

 

 

 

 

Swift 에서 프로퍼티는 클래스(Class), 구조체(Struct), 열거형(Enum)에서 특정 값을 저장하고 관리하는 역할이다.

 

  1. 저장 프로퍼티(Stored Property)
  2. 연산 프로퍼티(Computed Property)

 

 


 

저장 프로퍼티

 

저장 프로퍼티는 값을 저장하는 역할로,

보통 Swift 문법을 공부해보자 하고 앞 쪽에서 제일 먼저 소개하는 변수, 상수인 var, let 을 사용하여 선언 하게 된다.

이는 Class와 struct 안에서 사용해야한다.

 

struct Person {
    var name: String   
    let age: Int        
}

var person = Person(name: "ANee", age: 15)
print(person.name) // ANee

person.name = "Taenee"
print(person.name) // Taenee

 

지연 저장 프로퍼티 ?
Lazy 키워드를 사용하여 선언 후, 실제 접근 시 초기화 되는 프로퍼티이다.
메모리 사용을 최적화 할 때 유용한데, 이 프로퍼티를 직접 호출해야 초기화 된다.

 

// lazy

struct DataLoader {
    init() {
        print("데이터 로딩 시작!")
    }
}

struct LazyExample {
    lazy var data = DataLoader()
}

var example = LazyExample()
print("아직 data에 접근하지 않음!") 

example.data  // 초기화 되는 시점

 

 

 


연산 프로퍼티 (Computed Property)

값을 저장하는 아니고, 특정 연산을 수행하여 값을 반환 시키는 프로퍼티를 말하는데,

get set 이용해 값을 가져오거나 설정한다.

struct Rectangle {
    var width: Double
    var height: Double
    
    var area: Double {  // 여기가 바로 연산 프로퍼티
        return width * height
    }
}

let rect = Rectangle(width: 5, height: 10)
print(rect.area) // 50.0

 

area 라는 프로퍼티는 width, height 가 뭔지를 저장하는 게 아니라 받아온 값으로 연산 처리만 하여 값을 리턴시킨다.

 

 

 

getter와 setter ?

get : side * side를 계산하여 반환
set : 새로운 값이 들어오면, 해당 값을 변환


참고로 get 은 생략이 가능하다.
struct Square {
    var side: Double
    
    var area: Double {
        get {
            return side * side
        }
        set(newArea) {
            side = (newArea).squareRoot()
        }
    }
}

var square = Square(side: 4)
print(square.area) // 16.0

square.area = 25
print(square.side) // 5.0
// get 생략
var area: Double {
    side * side
}

 

willSet과 didSet (Property Observer)?

뜻이 직관적이다.
프로퍼티 감시자 (Property Observer) 활용하면 값 변경이 추적 가능하다.

willSet : 값이 변경되기 직전 호출
didSet : 값이 변경된 후에 호출

 

 

 


타입 프로퍼티 (Type Property)

static 키워드를 사용하여 타입 자체에 속하는 프로퍼티로, 저장 타입 프로퍼티 연산 타입 프로퍼티가 있다.

기본 Property 에서 static 을 붙여 있기 때문에 인스턴스 생성 없이 바로 접근이 가능하다.

 

Circle() << 이렇게 부르지 않아도 된다. static 하기 때문에.

 

struct Circle {
    static let pi = 3.141592  // 저장 타입 프로퍼티
    
    static var description: String { // 연산 타입 프로퍼티
        return "이 구조체는 원의 정보를 다룹니다."
    }
}

print(Circle.pi)            // 3.141592
print(Circle.description)   // "이 구조체는 원의 정보를 다룹니다."
 
728x90