프로퍼티란?
프로퍼티(속성)란 구조체(Struct), 클래스(Class)에서 사용하는 변수이다!
프로퍼티의 종류는 크게 2가지(인스턴스 속성, 타입 속성)로 먼저 분류가 가능하다.
인스턴스를 생성하고나서 접근하는 속성과 타입 자체(구조체, 클래스)에 속하는 유일한 변수,상수로서 인스턴스와는 무관한 타입 속성으로 나뉜다.
저장(Stored) 속성
저장속성은 커스텀 타입 안에서 let(상수) 또는 var(변수)로 선언가능한 프로퍼티이며 고유한 데이터 주소를 갖는다. 초기화 이전에 데이터 값을 갖고 있거나, 변수를 옵셔널 처리해서 나중에 값을 대입해주거나, 인스턴스 생성시에 값을 넣어 반드시 초기화를 해줘야한다.
저장 속성은 특이하게 lazy라는 키워드를 let이나 var앞에 붙여주어 선언(코드영역)을 먼저 해주지만 데이터가 메모리에 올라가는 시점을 해당 변수에 접근할 때 메모리에 올라가게 할 수 있다. 예를 들어, 동영상 같은 경우에는 데이터가 크기 때문에 용량을 많이 차지하여 매번 영상을 저장 속성으로 가져오면 메모리 공간이 부족하게 될 것이다. 그렇기에 지연 저장을 하여 메모리의 낭비를 막을 수 있다. 예로 들은 동영상이 만약 안에 초기값이 없다고 가정했을 때, 초기화를 사용하면서 해줄 수 없기 때문에 lazy var someThing = ~ 이렇게 구조체, 클래스의 선언시에 초기화를 해주어야 한다.
mediaPoster 저장 속성은 인스턴스를 생성하고 나서 프로퍼티에 접근했을 때 메모리에 같이 올라간다.
구조체 같은 경우에는 초기화를 인스턴스 생성시에 할 수 있다. 그러나 클래스에서는 init() 초기화 메서드를 타입 선언시에 같이 구현해주어야한다!
위에 사진처럼 구조체는 인스턴스 생성시에 memberwise initializer를 제공해주어 초기화되지 않은 프로퍼티에 대해 자동으로 초기화 메서드를 제공한다.
이제 타입 저장 프로퍼티와 인스턴스 저장 프로퍼티의 차이를 알아보자.
User 구조체 안에 static을 붙인 타입 프로퍼티는 각 타입 자체가 갖는 고유값이다. 생성자가 따로 없기 때문에 생략할 수 없으며, 구조체나 클래스에서 타입 선언시에 같이 초기화를 해줘야한다. 위에서 보았던 지연 저장 속성과 같은 성격을 띈다. 속성에 처음 접근한 순간에 초기화되지만 그렇다고 lazy를 붙여줄 필요는 없다. 참고로 여러 스레드에서 동시에 접근하는 경우에도 한 번만 초기화되도록 보장된다. 이 개념은 Thread-Safe와 관련되어 나중에 포스팅하겠다!
그렇다면 언제 타입속성을 사용할까? 보편적으로는 모든 인스턴스가 공통적으로 가져야하는 속성(ex. ViewController의 Identifier), 모든 인스턴스가 공통적으로 공유해야하는 성격에 가까워야한다.
'iOS 개발' 카테고리의 다른 글
작심 개인정보 처리방침 (0) | 2022.09.29 |
---|---|
고차함수(Higher Order Function) (1) | 2022.08.09 |
UIAlertController (0) | 2022.07.20 |
7월 18일 월요일 (0) | 2022.07.18 |
AutoLayout (0) | 2022.07.18 |