[iOS] 저장 프로퍼티, 연산 프로퍼티, 타입 프로퍼티, 프로퍼티 옵저버

nnnyeong·2021년 11월 18일
0

iOS

목록 보기
8/17

죽지도 않고 하루만에 돌아온 iOS 포스팅~
나는 swift 공부를 차근차근 한 적이 없어서 이런 기본적인 내용이 약점 인 것 같다! 오늘은 swift 프로퍼티에 대해 공부해보자!




프로퍼티, Property

프로퍼티는 클래스, 구조체, 열거형등에 관련된 값을 나타낸다. 값을 특정 클래스, 구조체, 열거형과 연결하며 크게 저장 프로퍼티, 연상 프로퍼티, 타입 프로퍼티로 나뉜다.




저장 프로퍼티, Stored Property

저장 프로퍼티는 클래스나 구조체의 인스턴스와 연관된 값을 저장하는, 가장 단순한 역할의 프로퍼티이다.

프로퍼티를 정의할 때 초기값 지정이 가능하고 변수 저장 프로퍼티, 상수 저장 프로퍼티가 존재한다.

위와 같은 상황에선 변수, 상수 저장 프로퍼티 모두 값 변경이 불가하다.

하지만,

동일한 상황에서 구조체가 아닌 클래스인 경우라면 상수 저장 프로퍼티에 한해 동일한 에러가 발생한다.

이유는 바로 swift에서 구조체는 value type, 클래스는 reference type 이기 때문이다! 값 타입으로 저장되는 구조체의 경우 인스턴스 itemlet으로 선언함에 따라 모든 프로퍼티가 let 인 것과 동일하다. 하지만 클래스의 경우 참조 타입으로 저장되기 때문에 원본에 바로 접근이 가능하고 변수 저장 프로퍼티인 firstValue 에는 접근 및 값 변경이 가능하게 된다!




지연 저장 프로퍼티, Lazy Stored Property

지연 저장 프로퍼티는 값이 사용되기 전까지는 값이 계산되지 않는 프로퍼티이다.

33번째 줄까지는 클래스 DataManager 의 프로퍼티 importer 는 아직 생성되지 않았다. 메모리에 올라가있지 않은 상태이고 35번째 줄에서 처음으로 사용되면서 생성되어 메모리에 올라가게 된다.

lazy 선언시에는 반드시 변수로 선언해야 한다. 상수 프로퍼티 선언시 선언과 함께 값을 가져야 하기 때문이다.

또한 멀티 스레드 환경에서 lazy로 선언한 프로퍼티라 해도 초기화되지 않은 상태에서 여러 스레드가 동시에 접근한다면 한번만 초기화 된다는 것을 보장하지는 않는다.

하지만 이러한 지연 저장 프로퍼티를 사용하면 불필요한 공간 낭비를 줄여 성능을 높일 수 있다.




연산 프로퍼티, Computed Property

연산 프로퍼티랑 특정 상태에 따른 값을 연산하는 프로퍼티이다. 연산 프로퍼티는 값을 저장하기 보단 계산하는 역할에 가깝고 클래스, 구조체, 열거형에 사용이 가능하다.

인스턴스 내,외부 값을 연산해 적절한 값을 돌려주는 접근자 역할의 get 과 은닉화된 내부의 프로피터 값을 간접적으로 설정하는 설정자 역할의 set 이 있다.

연산 프로프티를 사용하기 위해선 연산된 값을 저장할 변수 (tempX) 가 반드시 필요하다! 연산 프로퍼티 x는 값을 연산해 tempX에 전달하는 역할만 수행한다.

또한 연산 프로퍼티는 반드시 변수, var 로 선언되어야만 한다. 값이 고정되어 있지 않기 때문에 상수가 아닌 변수로만 사용 가능하다.

💡Shorthand Setter Declaration
연산 프로퍼티에 전달되는 매개변수의 이름을 따로 지정하지 않고 사용할 수도 있다. 이때는 반드시 "newValue" 라는 명칭을 사용해야만 한다!



💡Read-only computed Property
연산 프로퍼티를 set 없이 get 만 사용하는 것도 가능하다. (단, set만 사용할 수는 없다.) 이때는 get 표시를 생략해서 사용이 가능하다!




프로퍼티 옵저버, Property Observer

프로퍼티 옵저버는 프로퍼티의 값이 변경됨에 따라 적절한 작업을 취할수 있도록 한다. 프로퍼티 값이 새로 할당될 때 마다 호출되고 그 값이 이전 값과 동일하더라도 호출된다.

willSet

프로퍼티 값이 변경되기 직전에 호출된다. 전달되는 인자는 프로퍼티가 변경될 새로운 값이고 해당 값의 이름을 지정하지 않으면 "newValue" 라는 이름을 통해 접근 가능하다


didSet

willSet과 반대로 프로터피 값이 변경된 직후에 호출된다. 전달되는 인자는 프로퍼티가 변경되기 이전의 값이 전달되고 해당 명칭을 지정하지 않으면 "oldValue" 라는 이름을 통해 접근 가능하다

프로퍼티 옵저버는 프로퍼티를 재정의해 상속받은 저장, 연산 프로퍼티에도 적용이 가능하고 연산 프로퍼티는 상속 받았을때만 재정의를 통해 프로퍼티 옵저버를 사용할 수 있다.




타입 프로퍼티, Type Property

타입 프로퍼티는 타입 자체에 속한 프로퍼티로 프로퍼티를 타입과 연결시킨다.특정 타입의 모든 인스턴스에 공통적인 값을 정의하는데에 유용하다.

저장 타입 프로퍼티는 상수나 변수로 가능하고 반드시 초기값을 설정해야하며 지연 연산된다. 반면에 연산 타입 프로퍼티는 변수로만 선언 가능하다.




Reference

Swift ) Properties - Computed Property(연산 프로퍼티)
[Swift] 프로퍼티와 메소드에 대해 알아보자!

profile
주니어 개발자까지 ☄️☄️

0개의 댓글