티스토리 뷰

swift

[swift] 계산 속성(computed property)

순진이 2022. 3. 21. 16:05

오늘은 배우긴 배웠지만 한 번도 제대로 써보지 못했던,,,

그러던 중 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
링크