씬디의 블로그

[Swift] 프로퍼티 정복 본문

App/Swift

[Swift] 프로퍼티 정복

cyndi 2024. 5. 26. 21:58

Swift

(강의자료 14회차)

1. 인스턴스 프로퍼티

인스턴스 프로퍼티는 특정한 구조체, 클래스에 속하는 저장 프로퍼티연산 프로퍼티이다

값 저장의 여부에 따라 저장 프로퍼티, 연산 프로퍼티로 나뉜다

 

1-1. 인스턴스 저장 프로퍼티

주로 값을 저장하기 위한 목적으로 클래스나 구조체 내에 정의된 변수나 상수를 말한다

 

프로퍼티를 선언할 때 초기화를 하거나

class DrinkClass { 
	let name: String
    var count: Int
    var size: String
    
    init(name: String, count: Int, size: String) { 
    	self.name = name
        self.count = count
        self.size = size
    }
}

초기화 구문에서 초기값을 설정하거나

class DrinkClass { 
	let name: String = "아메리카노"
    var count: Int = 3
    var size: String = "Venti"
}

프로퍼티를 옵셔널 형태로 선언해야 한다

class DrinkClass { 
	let name: String?
    var count: Int?
    var size: String?
}

 

1-2. 지연 저장 프로퍼티

저장 프로퍼티가 초기화 되는 시점을 지연시켜주는 프로퍼티이다

 

왜 지연시키지?

lazy를 사용하면 해당 프로퍼티를 사용할 때! 초기화하는 특성을 갖고있기 때문에

메모리를 효율적으로 사용할 수 있고 성능 저하의 문제를 없앨 수 있다

 

초기화를 통해 클래스의 인스턴스가 생성되더라도, lazy가 선언되어 있다면 해당 프로퍼티는 초기화 되는 시점에 초기화가 된다

struct Poster { 
	var image: UIImage = UIImage(systemName: "star") ?? UIImage()
    
    init() {
    	print("Poster init")
    }
}

struct MediaInfo {
	var mediaTitle: String
    var mediaRuntime: Int
    lazy var mediaPoster: Poster = Poster()
}

var media = MediaInfo(mediaTitle: "오징어게임", mediaRuntime: 333) // mediaPoster 초기화 X

media.mediaPoster // mediaPoster 초기화 O

 

2. 연산 프로퍼티

값 저장 여부에 따라 나뉘는거라면, 연산 프로퍼티는 값 저장이 안되는거겠지?

연산 프로퍼티는 값을 저장하지 않고, 저장 프로퍼티를 통해 연산을 구하는 프로퍼티이다

 

다른 저장 프로퍼티의 값을 가지고 연산을 하기 때문에, 연산 프로퍼티 구현을 위해서는 저장 프로퍼티가 필요하고,

프로퍼티로 전달받은 값을 다른 프로퍼티에 저장하기 때문에 항상 var로 선언되어야 한다

class FoodRestruant { 
	let name = "잭치킨"
    var totalOrderCount = 0
    
    var nowOrder: Int { 
    	get { 
        	return totalOrderCount * 5000
        }
        set {
        	totalOrderCount += newValue
        }
    }
}

연산 프로퍼티는 어떠한 값을 저장하는 것이 아니기 때문에

var nowOrder: Int 반드시 선언할 때 타입 어노테이션을 통해 자료형을 명시해야 한다

 

그리고 선언된 자료형 뒤에 { } 를 붙이는 것이 연산 프로퍼티의 사용법이다

get { 

return totalOrderCount * 5000

저장 프로퍼티의 값을 연산해서 return하는 역할을 담당하고 있다

 

getter를 통해 읽기 전용으로 구현할 수 있다. 읽기 전용의 경우, 한번 값이 정해지면 변하지 않기 때문에 let으로 선언하는 것이 맞다고 생각이 들지만!? 연산 프로퍼티는 읽기 전용이라고 하더라도, 인스턴스 내부의 값을 통해 계산한 값이 항상 달라질 수 있기 때문에 var로 선언한다

 

3. 타입 프로퍼티

static 키워드가 붙으면 타입 프로퍼티이다

도대체 왜 static이 붙으면 타입 프로퍼티인가,, 규칙인가,, 하고 의문점이 많았는데

그저 저장&연산 프로퍼티 앞에 static 키워드가 붙으면! 저장 타입 프로퍼티&연산 타입 프로퍼티인 것!

class FoodRestruant { 
	static let name = "잭치킨" // 타입 저장 프로퍼티
    static var totalOrderCount = 0 // 타입 저장 프로퍼티
    
    static var nowOrder: Int { // 타입 연산 프로퍼티
    	get { 
        	return totalOrderCount * 5000
        }
        set {
        	totalOrderCount += newValue
        }
    }
}