티스토리 뷰

Swift

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

swallow.iOS 2022. 7. 2. 03:09

안녕하세요! Swallow입니다!

이번 포스팅은

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

관한 글입니다!

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

시작하기에 앞서 이 글은

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

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

그럼 시작하겠습니다!

 

타입 속성(Type Properties)이란?

인스턴스에 속한 속성이 아니고, 타입 자체에 속한 속성이며

내부/외부에서 접근할 때

타입 이름 . 속성 --> Type.property

이런 방식으로 접근을 해야 합니다!

정확한 방법은 밑의 예시에서 보여드리겠습니다!

 

타입 속성(Type Properties)은

저장 타입 속성

계산 타입 속성

두 가지가 존재합니다!

 

첫 번째로

저장 타입 속성에 대해서

설명을 드리겠습니다!

 

저장 타입 속성으로 선언을 하려면

저장 속성 앞에 static 키워드를 붙여주면 됩니다!

이런 식으로 말이죠!

저장 속성 앞에 static 키워드를 붙여줌으로써

위에 선언된 저장 속성들이

저장 타입 속성으로 선언이 되었습니다!

 

그리고 타입 속성은 타입 자체에 속해있고, 접근을 할 때는

Type.property 방식으로 접근을 해야 한다고 말씀드렸어요!

위의 예시를 보시면

Uijeongbu.highSchool <--- 이 부분에서

Uijeongbu타입 자체에 접근을 하여

해당 타입 자체에 속해있는 속성에 접근을 한 것입니다!

즉, 위에서 설명드린

static으로 선언한 속성들에 접근을 한 것이죠!

Type.property 이 부분을 설명을 드린 거예요!

 

그런데

mySchool.highSchool <--- 이 부분을 보시면

에러가 발생하죠??

말씀드렸다시피, 타입 속성은 인스턴스에 속한 속성이 아니고

타입 자체에 속한 속성이기에

저런 방법으로는 접근이 불가능합니다! 😱

물론 애초에 접근을 하고 싶어도

class내부의 속성들을 모두 타입 속성으로 선언을 해서

접근조차 할 수 없습니다!

 

그리고 타입 속성은

모든 인스턴스가 동일하게 가져가야 하는 속성이거나,

모든 인스턴스가 공유해야 하는 성격에 가까운 속성을

타입 속성으로 선언을 합니다!

 

이 얘기가 무슨 말이냐면,

쉽게 예시를 들어서 말씀을 드려볼게요!

위의 예시에서

초등학교, 중학교, 고등학교를 저장 타입 속성으로 선언을 했잖아요!

그러면 위의 저장 타입 속성들은 타입 자체에 속한 속성이 되고,

공유해야 하는 성격에 가깝다고 설명을 드렸습니다!

 

여기서 한 가지 가정을 해볼게요!

저와 같은 동네에 사는 친구들은

모두 같은 학교를 가야 한다고 가정을 해봅시다!

그러면 위에서 일반적인 저장 속성으로 선언한

철수, 영희, 민기는 인스턴스 생성 시에

공유하는 성격을 가진

초등학교, 중학교, 고등학교 타입 저장 속성을

공통으로 가지고 생성이 됩니다!

즉, 모든 인스턴스의 변하지 않는 불변이거나

공유할 수 있고, 타입 자체에서 메모리 공간을 계속 가지고 있는 것이

타입 속성입니다! 😎

 

저장 타입 속성의 특징에 대해서

몇 가지 더 말씀드릴게요!

1. 저장 타입 속성은 let / var 둘 다 선언이 가능합니다! 🔥

2. 인스턴스의 생성과 관련이 없고, 타입 자체에 속해있으니 생성자가 존재하지 않습니다! 🔥

그렇기 때문에 저장 타입 속성은 기본값(초기값)을 설정해 주어야 합니다!

3. 지연 속성의 성격을 가집니다! 🔥

즉, 저장 타입 속성에 접근하는 순간, 메모리에 올라가게 되고

굳이 lazy 키워드를 써줄 필요가 없습니다!

4. 클래스, 구조체, 열거형에서 모두 사용이 가능합니다! 🔥

5. 인스턴스에 속한 속성이 아니고, 타입 자체에 속한 속성이기에,

인스턴스의 이름으로 접근이 아닌, 타입 이름으로 접근을 해야 합니다! 🔥

 

두 번째로

계산 타입 속성에 대해서

설명을 드리겠습니다!

이전 포스팅에서 사용한 예시를

계산 타입 속성으로 변경해서 말씀드릴게요!

 

억지 예시라서..ㅎ 그냥

계산 타입 속성의 예시로만 봐주세요..ㅎ

 

저희가 배운 계산 속성에

타입 속성의 키워드인 static을 붙여주면 됩니다!

 

계산 속성 앞에 static키워드를 붙여줘서

위의 예시의 계산 속성은

계산 타입 속성이 된 것입니다!

 

이전 포스팅에서도 말씀을 드렸지만,

계산 속성은 var 키워드만 사용이 가능하고,

실질적인 메서드이다 라는 것을 기억해주세요!

 

그리고 위에서 저장 타입 속성을 선언한 이유는

계산 속성에서 해당 저장 속성을 이용하기 때문인데요!

 

여기서 말씀드릴 것이

위에서 저장 타입 속성이 존재하기 때문에

계산 타입 속성 내부에서 저장 타입 속성에 접근이 가능한 것입니다!

쉽게 말하자면 당연한 얘기지만,

타입 속성은 타입 속성끼리만 접근이 되고

인스턴스 속성은 인스턴스 속성끼리만 접근이 가능하다는 얘기입니다!

 

나중에 상속 부분에서 설명을 드릴 텐데

추가적으로 간단히만 말씀을 드리면

계산 타입 속성은 재정의(override)가 가능합니다!

 

어랏?

그런데 계산 타입 속성 앞에 static이 아니고

class 키워드가 붙었네요??

 

상속에서 class키워드를 붙이면

재정의가 가능하다는 의미이고,

static키워드를 붙이면

재정의가 불가능하다는 의미입니다! 🔥🔥

 

자세한 내용은 상속 부분에서 다룰 테니

많이 기대해 주세요!

 

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

다음 작성할 글은

⭐️ 속성 감시자(Property Observers) ⭐️

관한 글입니다!

 

감사합니다!

 

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

댓글