티스토리 뷰
안녕하세요! Swallow입니다!
이번 포스팅은
⭐️저장 속성(Stored Properties) ⭐️
관한 글입니다!
항상 어떠한 조언, 충고 환영입니다!
시작하기에 앞서 이 글은
앨런 Swift 문법 마스터 스쿨 강의와 야곰님의 스위프트 프로그래밍 책을
공부하고 참고하여 작성하였습니다!
그럼 시작하겠습니다!
오늘 배울 내용은
속성(프로퍼티)에 관한 내용입니다!
우선 용어 정리부터 하자면,
속성(프로퍼티)이란?
클래스/구조체 내부에 존재하는
변수 또는 상수를
속성(프로퍼티)이라고 부릅니다!
그리고 메서드라는 용어가 존재하는데,
메서드(method)란?
클래스/구조체 내부에 존재하는
함수를 메서드라고 부릅니다!
간단하게 용어 정리를 해보았고,
오늘은 여러가지 속성 중에
첫 번째로
저장 속성(Stored Properties)에
대해서 알아보겠습니다!
저장속성(Stored Properties)이란?
특정한 메모리 공간을 가지면서,
그 공간 안에 값을 저장할 수 있는 속성입니다!

위의 예시처럼
Dog클래스와 Cat구조체
내부에 선언이 된 name과 age가
저장속성(Stored Properties)입니다!
이제 Dog클래스와 Cat구조체의
인스턴스를 생성할 때마다
name, age의 메모리 공간이
생성이 됩니다!
그리고 각각의 저장 속성은
초기화 시에, 반드시 값을 가져야 합니다!
위의 예시처럼 기본값을 설정을 해주거나,
생성자를 통해서 설정 또는 옵셔널 타입으로 선언을 해야 합니다!
여기서 한 가지!
열거형의 경우 따로 메모리 공간이 필요한
저장 속성은 선언이 불가능합니다!

두 번째 내용은
같은 저장 속성인데,
지연 저장 속성(Lazy Stored Properties)에
대해서 알아보겠습니다!
지연 저장 속성에 대해서는
3가지 파트로 나누어서 설명드릴게요!
첫 번째
지연 저장 속성(Lazy Stored Properties)이란?
해당 저장 속성의 초기화를 지연시키는 것입니다!
즉, 지연 저장 속성으로 선언한 속성이
인스턴스 생성 시점에 메모리 공간과 값을 갖는 게 아니라,
⭐️ 해당 속성에 접근하는 순간에 메모리 공간이 생성이 됩니다! ⭐️
글로만 이해하기에는 굉장히 어렵기 때문에
예시를 한번 보여드릴게요!

위의 예시를 설명하자면
Cat클래스와 Catnip클래스를 만들었고,
Cat클래스 안에 존재하는 catnip의 타입을 Catnip타입으로 설정하고
Catnip()을 통해 인스턴스를 생성하게 작성하였습니다!
그리고 맨 밑의 코드를 보면
cuteCat변수에 Cat타입으로 인스턴스를 생성하고 있죠!
그러면!!!!! 🔥

위와 같은 결과가 콘솔 창에 뜨게 됩니다!
왜냐고요?!
cuteCat변수에서 Cat타입으로 인스턴스를 생성하므로
Cat클래스 내부의 저장 속성들은 초기화가 이루어지면서
각각의 메모리 공간을 가지게 되고,
catnip저장 속성에서는 Catnip클래스를 초기화하기 때문이죠!!!
그렇기 때문에
Catnip클래스 내부의
생성자에 따른 print() 함수에 의해서
위와 같은 결과가 나오게 됩니다!
자!
그럼 위의 예시랑 똑같이
지연 저장 속성을 추가해서 보여드릴게요!

지연 저장을 원하는 속성 앞에
lazy를 붙여주게 되면
지연 저장 속성이 됩니다!
이럴 경우에는
제가 위에서 살짝 말씀을 드렸지만
인스턴스 생성 시점에 메모리 공간을 갖게 되는 것이 아니라,
⭐️ 해당 속성에 접근을 하는 순간!! ⭐️
메모리 공간을 갖게 됩니다!
즉, 아까 보여드린 예시에서는
print() 함수가 실행이 되었지만,
지금 예시에서는
catnip저장 속성을
지연 저장 속성으로 선언을 했기 때문에
메모리 공간이 생기지 않아서
print()함수가 실행이 되질 않습니다!
그러면 어떠한 방식으로 실행을 시킬까요?
쉽습니다!
계속 말씀을 드렸다시피
접근을 하면 돼요!

짜잔!
cuteCat.catnip에 접근을 하는 순간!
catnip 지연 저장 속성의 메모리 공간이 생성이 되면서!

print() 함수가 실행이 되어
위와 같은 결과가 콘솔 창에 출력이 됩니다!
두 번째
지연 저장 속성은 var로만 선언이 가능하면서,
기본값을 설정해 주어야 합니다!
그 이유에 대해서 말씀드릴게요!
지연 저장 속성은
값이 변경되는 성격과 비슷합니다!
쉽게 얘기를 하자면,
lazy로 선언을 하면
바로 메모리 공간이 생성이 되는 것이 아니고,
접근을 할 때 메모리 공간이 생성이 된다고 말씀을 드렸어요!
이러한 특징이 값의 변경과 비슷하다는 점이에요!
그렇기 때문에
swift에서는 lazy는 var로만 선언이 가능하도록 만들었습니다!
그리고 지연 저장 속성 선언 시에
기본값을 설정해 주어야 하는 이유가 존재합니다!
계속 말씀을 드리지만,
lazy는 선언 시에 메모리 공간이 생성이 되는 것이 아니고
값에 접근을 할 때, 메모리 공간이 생성이 된다고 말씀을 드리고 있어요!
즉, 일반 저장 속성처럼 타입만 선언을 한 뒤,
생성자를 통해서 초기화를 하지 못해요!
생성자에 관해서는 조만간 다룰 내용이지만
간단하게 말씀을 드리자면
각각의 저장 속성에 대한 값을 설정하여
사용 가능한 상태로 만드는 것 이라고 생각하시면 됩니다!
생성자에 이러한 의미가 있는데
저장 속성에 대한 값이 없다면
사용가능한 상태로 만들지 못하기 때문이에요!
조금 더 쉽게 이야기하면
접근 시점에 메모리가 생성이 되니,
메모리가 생성이 될 때,
그 시점에 값이 필요하기 때문에 기본값을 설정해 주어야 한다!
라고 생각하시면 좋습니다!
세 번째
지연 저장 속성은 어떤 경우에 사용을 할까요?
말씀을 드리자면,
지연 저장 속성으로 선언된 속성이, 다른 저장 속성을 이용해야 할 때
입니다!

위의 예시를 설명드리자면
지연 저장 속성으로 선언된 year에
저장 속성 myAge를 사용하는 클로저가 할당되어 있습니다!
클로저에 관한 설명은 나중에!
아무튼!
그런데 만일 year속성이
일반 저장 속성으로 선언이 되었다고 가정을 하면,
두 저장 속성은 생성자를 통해서 초기화를 하거나
기본값을 설정해 주어야 합니다!
여기서 문제가 하나 발생하는데,
생성자를 통해 초기화를 진행하면
myAge와 year은 동시에 메모리에 생성이 됩니다!!
🔥 동. 시. 에 🔥
속성 year은 myAge를 사용하는 클로저가 할당이 되어있는데,
동시에 메모리에 생성이 되어버리면,
당연히 year은 myAge를 사용하지 못하게 됩니다!
그렇기 때문에
저장 속성이 또 다른 저장 속성을 이용해야 할 때는
지연 저장 속성을 사용하면 됩니다!
오늘 준비한 글은 여기까지입니다!
다음 작성할 글은
⭐️ 계산(연산) 속성(Computed Properties) ⭐️
관한 글입니다!
감사합니다!
피드백 언제나 환영합니다!
'Swift' 카테고리의 다른 글
| 속성(프로퍼티) 정복하기 - 3장 (0) | 2022.07.02 |
|---|---|
| 속성(프로퍼티) 정복하기 - 2장 (0) | 2022.07.01 |
| 클래스(Class)와 구조체(Struct)의 특징과 차이점 정복하기 - 2장 (0) | 2022.06.24 |
| 클래스(Class)와 구조체(Struct)의 특징과 차이점 정복하기 - 1장 (0) | 2022.06.23 |
| 열거형(Enumeration) 정복하기 - 4장 (0) | 2022.06.02 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
링크
TAG
- 서브스크립트
- 저장 타입 프로퍼티
- optional
- swift struct
- Swift enum
- optional unwrapping
- 옵셔널 추출
- 스위프트 메서드
- optional unwrapped
- swift class
- 저장 타입 속성
- 옵셔널 바인딩
- Instance Methods
- Swift Methods
- 클래스 구조체 차이
- enum
- 원시값
- 속성 감시자
- 옵셔널
- 연관값
- Property Observers
- 열거형
- 스위프트
- Type Methods
- 프로퍼티 옵저버
- Optional pattern
- SWiFT
- 열거형 case 패턴
- Swift Instance
- 옵셔널 패턴