죽지도 않고 하루만에 돌아온 iOS 포스팅~
나는 swift 공부를 차근차근 한 적이 없어서 이런 기본적인 내용이 약점 인 것 같다! 오늘은 swift 프로퍼티에 대해 공부해보자!
프로퍼티는 클래스, 구조체, 열거형등에 관련된 값을 나타낸다. 값을 특정 클래스, 구조체, 열거형과 연결하며 크게 저장 프로퍼티, 연상 프로퍼티, 타입 프로퍼티로 나뉜다.
저장 프로퍼티는 클래스나 구조체의 인스턴스와 연관된 값을 저장하는, 가장 단순한 역할의 프로퍼티이다.
프로퍼티를 정의할 때 초기값 지정이 가능하고 변수 저장 프로퍼티, 상수 저장 프로퍼티가 존재한다.
위와 같은 상황에선 변수, 상수 저장 프로퍼티 모두 값 변경이 불가하다.
하지만,
동일한 상황에서 구조체가 아닌 클래스인 경우라면 상수 저장 프로퍼티에 한해 동일한 에러가 발생한다.
이유는 바로 swift에서 구조체는 value type, 클래스는 reference type 이기 때문이다! 값 타입으로 저장되는 구조체의 경우 인스턴스 item
을 let
으로 선언함에 따라 모든 프로퍼티가 let
인 것과 동일하다. 하지만 클래스의 경우 참조 타입으로 저장되기 때문에 원본에 바로 접근이 가능하고 변수 저장 프로퍼티인 firstValue
에는 접근 및 값 변경이 가능하게 된다!
지연 저장 프로퍼티는 값이 사용되기 전까지는 값이 계산되지 않는 프로퍼티이다.
33번째 줄까지는 클래스 DataManager
의 프로퍼티 importer
는 아직 생성되지 않았다. 메모리에 올라가있지 않은 상태이고 35번째 줄에서 처음으로 사용되면서 생성되어 메모리에 올라가게 된다.
lazy
선언시에는 반드시 변수로 선언해야 한다. 상수 프로퍼티 선언시 선언과 함께 값을 가져야 하기 때문이다.
또한 멀티 스레드 환경에서 lazy
로 선언한 프로퍼티라 해도 초기화되지 않은 상태에서 여러 스레드가 동시에 접근한다면 한번만 초기화 된다는 것을 보장하지는 않는다.
하지만 이러한 지연 저장 프로퍼티를 사용하면 불필요한 공간 낭비를 줄여 성능을 높일 수 있다.
연산 프로퍼티랑 특정 상태에 따른 값을 연산하는 프로퍼티이다. 연산 프로퍼티는 값을 저장하기 보단 계산하는 역할에 가깝고 클래스, 구조체, 열거형에 사용이 가능하다.
인스턴스 내,외부 값을 연산해 적절한 값을 돌려주는 접근자 역할의 get
과 은닉화된 내부의 프로피터 값을 간접적으로 설정하는 설정자 역할의 set
이 있다.
연산 프로프티를 사용하기 위해선 연산된 값을 저장할 변수 (tempX) 가 반드시 필요하다! 연산 프로퍼티 x
는 값을 연산해 tempX
에 전달하는 역할만 수행한다.
또한 연산 프로퍼티는 반드시 변수, var
로 선언되어야만 한다. 값이 고정되어 있지 않기 때문에 상수가 아닌 변수로만 사용 가능하다.
💡Shorthand Setter Declaration
연산 프로퍼티에 전달되는 매개변수의 이름을 따로 지정하지 않고 사용할 수도 있다. 이때는 반드시 "newValue" 라는 명칭을 사용해야만 한다!
💡Read-only computed Property
연산 프로퍼티를 set 없이 get 만 사용하는 것도 가능하다. (단, set만 사용할 수는 없다.) 이때는 get 표시를 생략해서 사용이 가능하다!
프로퍼티 옵저버는 프로퍼티의 값이 변경됨에 따라 적절한 작업을 취할수 있도록 한다. 프로퍼티 값이 새로 할당될 때 마다 호출되고 그 값이 이전 값과 동일하더라도 호출된다.
프로퍼티 값이 변경되기 직전에 호출된다. 전달되는 인자는 프로퍼티가 변경될 새로운 값이고 해당 값의 이름을 지정하지 않으면 "newValue" 라는 이름을 통해 접근 가능하다
willSet과 반대로 프로터피 값이 변경된 직후에 호출된다. 전달되는 인자는 프로퍼티가 변경되기 이전의 값이 전달되고 해당 명칭을 지정하지 않으면 "oldValue" 라는 이름을 통해 접근 가능하다
프로퍼티 옵저버는 프로퍼티를 재정의해 상속받은 저장, 연산 프로퍼티에도 적용이 가능하고 연산 프로퍼티는 상속 받았을때만 재정의를 통해 프로퍼티 옵저버를 사용할 수 있다.
타입 프로퍼티는 타입 자체에 속한 프로퍼티로 프로퍼티를 타입과 연결시킨다.특정 타입의 모든 인스턴스에 공통적인 값을 정의하는데에 유용하다.
저장 타입 프로퍼티는 상수나 변수로 가능하고 반드시 초기값을 설정해야하며 지연 연산된다. 반면에 연산 타입 프로퍼티는 변수로만 선언 가능하다.
Swift ) Properties - Computed Property(연산 프로퍼티)
[Swift] 프로퍼티와 메소드에 대해 알아보자!