티스토리 뷰
오늘은 배우긴 배웠지만 한 번도 제대로 써보지 못했던,,,
그러던 중 Udemy를 통해 또 배운 computed property에 대해서 공부해볼게요.
아래와 같은 속성이 두개 있다고 할게여.
우선 이 두 놈은 stored property(저장속성)입니다.
피자의 인치에 -4를 하면 피자를 몇 조각으로 나눌 수 있는지 계산할 수가 있대여(강의에서,,ㅎ)
let pizzaInIncheds: Int = 12 // 피자 크기
var numberOfSlices: Int = 8 // 전체 피자 갯수
// 피자 인치에 따른 피자 슬라이스의 갯수
func calculatePizzaSlices() {
numberOfSlices = pizzaInIncheds - 4
}
calculatePizzaSlices()
print(numberOfSlices) // 8
그걸 계산하기 위해 메서드를 하나 만들면 calculatePizzaSlices처럼 만들 수 있겠져?
근데 너무 번거롭고 길어요. 계산속성만 있으면 어디라도 갈 수 있을텐데 말이져,,,
계산속성을 한 번 이용해볼게여!
우선 위 코드를 계산속성을 이용해 바꿔볼게요.
let pizzaInIncheds: Int = 16
var numberOfSlices: Int {
return pizzaInIncheds - 4
}
print(numberOfSlices) // 12
1. getter
특이하게 초기값을 설정하지 않아도 되네여? 그 역할을 getter에서 해주기 때문입니당!
getter는 말그대로 저 numberOfSlices 속성의 값을 얻게(get하게) 해주는 블록이에요.
항상 pizzaInIncheds -4를 해주면 되기 때문에 그 값을 리턴해 numberOfSlices에 값을 줍니다요.
아래처럼 get블록임을 명시해주어도 되지만, set 블록이 없을 때는 위에처럼 생략도 가넝!
let pizzaInIncheds: Int = 16
var numberOfSlices: Int {
get {
return pizzaInIncheds - 4
}
}
2. setter
그럼 setter는 무엇일까요? 말그대로 외부에서 내부로 값을 설정(set)해주는 블록입니다.
let pizzaInIncheds: Int = 16
var numberOfSlices: Int {
get {
return pizzaInIncheds - 4
}
set {
print("numberOfSlices에 새롭게 설정된 값은 \(newValue)입니다.")
}
}
numberOfSlices = 16 // numberOfSlices에 새롭게 설정된 값은 16입니다.
numberOfSlices에 새로운 값(=16)을 셋팅해주니, setter에서 설정한 print문이 출력되는 걸 볼 수 있어요.
그리고 swift가 자동으로 newValue라는 파라미터를 제공해줍니다.
만약 setter가 없이 값을 설정하면 어떻게 될까요?
아래와 같이 get-only property라는 에러가 뜨면서 값 설정이 안되게 되네여!
setter 꼭 필요해!!
피자 전체 조각을(numberOfSlices = 12) 1인당 피자 조각 수(slicesPerPerson = 3)로 나누면 한 판으로 몇 명이 먹을 수 있는지 나오겠져? (4명 밖에 못 먹음)
피자 먹을 사람(numberOfPeople = 10)을 그 값(4)으로 나누면 필요한 피자는 2판입니다.
let pizzaInIncheds: Int = 16 // 피자크기
var numberOfPeople: Int = 10 // 피자 먹을 사람
let slicesPerPerson: Int = 3 // 한 사람이 먹는 피자 적정량
// 인치당 나오는 피자 전체 조각 수
var numberOfSlices: Int {
get {
return pizzaInIncheds - 4
}
}
//필요한 피자 판 수
var numberOfPizza: Int {
get {
let numberOfPeopleFedPerPizza = numberOfSlices / slicesPerPerson
return numberOfPeople / numberOfPeopleFedPerPizza
}
}
print(numberOfPizza) //2
반대로 피자 판 수의 값을 설정(set)하여 다른 속성(numberOfPeople)의 값에 영향을 줄 수도 있어요.
예를들어, 피자가 엄~~청 많아서 이 피자로 몇 명이나 초대할 수 있을지 알고 싶다고 가정할게요.
let pizzaInIncheds: Int = 16 // 피자크기
var numberOfPeople: Int = 10 // 피자 먹을 사람
let slicesPerPerson: Int = 3 // 한 사람이 먹는 피자 적정량
// 인치당 나오는 피자 조각 수
var numberOfSlices: Int {
get {
return pizzaInIncheds - 4
}
}
//필요한 피자는 판 수
var numberOfPizza: Int {
get {
let numberOfPeopleFedPerPizza = numberOfSlices / slicesPerPerson
return numberOfPeople / numberOfPeopleFedPerPizza
}
set {
//전체 피자 조각 = 인치당 나오는 피자 조각(12) * (새롭게 설정될)피자 판 수
let totalSlices = numberOfSlices * newValue
numberOfPeople = totalSlices / slicesPerPerson
}
}
numberOfPizza에 4라는 값을 설정(set)해줄게요.
numberOfPizza = 4
그럼 setter에서는 어떤 일이 벌어질까요?
//numberOfPizza의 setter
let totalSlices = numberOfSlices * newValue
한 판당 나오는 피자 갯수(numberOfSlices = 12)를 피자 판 수(newValue = 4)와 곱해주면 전체 피자 조각 수 48조각이 나와요.
나온 48조각의 피자를 1인당 피자 할당량(slicesPerPerson = 3)으로 나눠주면, 초대할 수 있는 사람이 수(numberOfPeople)가 나오는거죠.
print(numberOfPeople) // 16
set을 통해 numberOfPizza의 값을 설정하면서 numberOfPeople 속성까지도 변경할 수 있는거져.
3. 주의점
계산속성을 쓸 때는 주의할 점이 몇 개 있는데요.
(1) 변수로 선언하기
set을 통해 값이 변경되기 때문에 반드시 var로 설정해주어야 해요.
(2) 자료형 선언해주기
속성의 타입을 반드시 선언해주어야 한대요. swift는 어떤 타입인지 모르기 때문이져.
그래서 input과 output이 없는 메서드를 쓸 때, 서로 의존적인 property들일 때는 계산속성을 사용할 수 없는지 한 번 점검해봐야 한다고 하네여!! 오케이!!
다음번 프로젝트에서는 꼭 쓰기를 바라며!
오늘도 틀린 게 있다면 알려주십셔 슨배님덜!!
'swift' 카테고리의 다른 글
[swift] 접근제어(Access Control) (0) | 2022.03.23 |
---|---|
[swift] Tuple (0) | 2022.03.22 |
[swift] Singleton 알아보기 (0) | 2022.03.14 |
[swift] Result Type 알아보기 (0) | 2022.02.03 |
[swift] 고차함수 1 - map (0) | 2021.12.28 |
- Total
- Today
- Yesterday