티스토리 뷰

Swift

속성(프로퍼티) 정복하기 - 2장

swallow.iOS 2022. 7. 1. 03:40

안녕하세요! Swallow입니다!

이번 포스팅은

⭐️ 계산(연산) 속성(Computed Properties) ⭐️

관한 글입니다!

항상 어떠한 조언, 충고 환영입니다!

시작하기에 앞서 이 글은

앨런 Swift 문법 마스터 스쿨 강의와 야곰님의 스위프트 프로그래밍 책

공부하고 참고하여 작성하였습니다!

그럼 시작하겠습니다!

 

 

계산 속성(Computed Properties)이란?

다른 저장 속성에 의존한 결과로 나오는

방식의 메서드를 속성처럼 만든 것입니다!

 

정의만 보시면

정확히 무슨 말인지 잘 이해가 가질 않으실 거예요..ㅎ

 

이제 밑 부분에서 사용방법과 특징에 대해서 설명을 드릴게요!!

 

계산 속성은 var로만 선언이 가능합니다!

다른 저장 속성의 값을 읽고 쓰기 때문에 값이 항상 변동이 됩니다!

그렇기 때문에 var로만 선언이 가능합니다!

 

계산 속성은 어디서 사용이 될까요?

클래스, 구조체, 열거형에서

모두 사용이 가능합니다!

 

그런데 열거형 같은 경우

잘 사용하질 않으니,

클래스와 구조체에서 많이 사용한다고 기억하시면 되고,

오늘 내용도 클래스와 구조체 내부에서 사용되는

예시만으로 설명을 드릴게요!!

 

우선 계산 속성의 선언 방법을 보여드릴게요!

계산 속성의 형태로는

get , set이 존재합니다!

 

 

⚡️ 잠깐!!!!!!! ⚡️

 

 

그전에 먼저,

계산 속성의 경우

값을 저장하는 형태가 아닙니다!

 

그렇기 때문에

계산 속성을 정의할 때,

⭐️ 값을 넣어주는 게 아닌, 타입 어노테이션을 통해서 어떤 자료형인지 명시를 해주어야 합니다! ⭐️

그 옆에

{  } (중괄호)를 이용해서

get , set을 선언을 해주는 방식입니다!

 

다시 본론으로 넘어가서

계산 속성을 정의할 때

get , set이 존재합니다!!

 

하나하나 설명을 드려볼게요!

먼저 get 블록에 대해서 말씀을 드려볼게요!

get을 getter라고도 부르며, 읽기라고도 부릅니다!

값을 얻는 거예요!

 

그리고 제가 계산 속성의 설명 부분에 적어드렸지만,

다른 저장 속성을 이용해서 그 결과로 나오는 방식의 메서드를 속성처럼 만든 것이라고 설명드렸는데,

결국 실질적인 메서드라는 이야기입니다!

 

메서드 이기 때문에 get 블록 부분에

return이 존재할 수 있는 이유 이기도 합니다!

 

그래서 get 부분에는 return 구문이

꼭!!!! 꼭!!!!

존재해야 합니다!

 

아래에서 설명을 드릴 테지만,

set블록은 생략이 가능합니다!

그러면 get블록만 남게 되는데, 이럴 경우에는

read-only(읽기 전용)이라고 부릅니다!

 

그리고 get블록은 set블록과 다르게

생략 자체가 불가능하고, 필수로 구현을 해주어야 합니다!

 

get블록만 존재 할 경우에는

get자체를 생략 가능합니다!

 

방금 위에서 생략 안된다면서요!!!!!!!!!!!

 

get블럭 자체 생략이 아닌,

get 구문만 생략입니다!

이런 식으로 말이죠!

 

다음은 set 블록에 대한 설명입니다!

set은 setter라고도 부르며, 쓰기라고도 부릅니다!

값을 세팅(설정)하는 부분입니다!

 

set블록의 경우

계산 속성을 이용할 때

굳이 필요가 없다면 작성하지 않아도 됩니다!

 

하지만!

set블럭 단독으로만 존재할 수는 없습니다!

연관되는 내용으로,

위에서 get블록을 필수로 구현을 해야 한다고

말씀을 드렸지만,

혹시 몰라서 다시 말씀을 드리는 거예요!!

 

그리고 set옆에 (thisYear)이라는 게 존재하는데

저 부분은 파라미터라고 생각하시면 될 것 같아요!

 

위의 예시에서

파라미터로 받은 값을 다른 저장 속성에 <---- 여기서는 birth

계산한 결과값을 설정해주는 부분이죠!

 

여기서 한 가지!!!

파라미터 부분은 값을 전달해주는 부분입니다!

set블록의 경우 파라미터 자체가 존재할 수 있으면서,

생략도 가능합니다!

 

으잉?

생략이요,,,,,?

그러면 값을 어떻게 준다는 얘기죠..?

짜잔!

newValue를 통해서 파라미터를 대신해 줄 수 있습니다!

 

파라미터를 생략하고

원래 파라미터가 있어야 할 부분에

newValue를 넣어주면

set블록을 이용할 때, newValue부분으로 세팅한 값이 들어가게 됩니다!

 

자!!

그럼 이제 계산 속성을 어떻게 활용하는지에 대해서 알아볼까요?

class Person {
    var name: String = "swallow"
    var age: Int = 23
    var birth: Int = 0
    
    var aboutMe: Int {
        get {
            return 2022 - age
        }
        set {
            birth = newValue - age
        }
    }
}

// Person 인스턴스 생성
var aaa = Person()

// get 블럭에 접근
aaa.aboutMe

// set 블럭에 접근
aaa.aboutMe = 2022
aaa.birth // 값을 세팅한 후 확인

평소에 저희가 속성에 접근하는 방법처럼 똑같이

접근해주시면 됩니다!

 

aaa.aboutMe <--- get 블록에 접근

위에서 정의한 get블록을 실행을 하여

해당 get블록에서 구현한 코드를 실행합니다!!

 

aaa.aboutMe = 2022 <--- set 블럭에 접근

값을 세팅(설정)해주면

위에서 정의한 set블록을 실행하여

해당 set블록에서 구현한 코드를 실행합니다!!

 

set블록을 실행한 뒤,

birth변수의 값이 어떻게 변경이 되었는지 확인하는 코드도 밑에 작성하였습니다!

 

앗! 그리고 계산 속성을 정의할 때

이러한 코드는 안돼요!

class Person {
    var aboutMe: Int {
        get {
            return 2022 - aboutMe
        }
        set {
            aboutMe = newValue - 11
        }
    }
}

계산 속성은 다른 저장 속성을 이용하는 실질적인 메서드인데,

말도 안 되는, 왜 정의했는지도 모르는 계산 속성을 떡하니

만들면 실행이 되지도 않을뿐더러

에러만 발생합니다!

그러니 계산 속성을 이용할 때는

다른 저장 속성을 생성한 뒤, 사용해야 한다는 말입니다!

 

행여나 나는 단순히 계산 속성을 이용해서

값만 얻고 싶은데?? 이럴 수도 있잖아요!

class Person {
    var aboutMe: Int {
        get {
            return 2022 - 11
        }
    }
}

이런 느낌으로 말이죠!

근데..

이럴 거면 굳이 계산 속성을 이용할 필요가 없어 보입니다!

더 쉽고 편리한 방법이 많이 존재하니

계산 속성을 이용할 때는,

배운 대로! 다른 저장 속성을 이용하는 구현을 하는 게 좋을 것 같습니다!

 

추가적인 설명을 드리고 싶은 부분이 존재하는데,

제가 계산 속성이란 실질적인 메서드라고 말씀을 드렸습니다!

 

⭐️ 모든 메서드의 경우 인스턴스에 메모리 공간이 할당이 되어있지 않습니다! ⭐️

 

이게 무슨 이야기 냐면,

위의 예시에서

저장 속성인 name, age, birth처럼 메모리 공간을 가지고 있지 않다는 이야기입니다!

실제 데이터를 저장하는 공간이 존재하지 않다는 이야기이고,

단순히 코드 영역을 가리키는 메모리 주소만을 저장하는 공간만이 존재하고

데이터를 저장하는 메모리 공간은 존재하지 않는다!

라는 이야기입니다!

 

조만간 메서드를 다루는 글에서 다시 설명을 드리도록 하겠습니다!

 

계산 속성의 중요한 점을 정리하자면!

1. 다른 저장 속성을 이용해서 계산 결과를 만들어 내는 메서드이다 🔥

2. 계산 속성은 var로만 선언이 가능하다 🔥

3. 계산 속성은 값을 저장하는 형태가 아니고, 타입 추론이 되질 않기 때문에 타입을 꼭 명시해 주어야 한다 🔥

4. get의 경우 필수로 구현을 해야 하며, 읽기 전용일 때 get구문을 생략할 수 있다 🔥

5. set의 파라미터는 직접 구현도 가능하지만 생략이 가능하고, newValue로 대체가 가능하다 🔥

6. set은 필요하지 않은 경우, 생략이 가능하다 🔥

7. set만 구현하는 것은 불가능하다 🔥

 

적다 보니 생각보다 많네요..ㅎ

 

오늘 준비한 글은 여기까지 입니다!

다음 작성할 글은

⭐️ 타입 속성(Type Properties) ⭐️

관한 글입니다!

 

감사합니다!

 

피드백 언제나 환영입니다!

댓글