본문 바로가기
IOS App Programming/Swift

[Swift] 프로퍼티 - 저장 프로퍼티, 연산 프로퍼티, 타입 프로퍼티, 프로퍼티 감시자

by B_Tori 2023. 3. 29.

프로퍼티란?

클래스, 구조체, 열거형 등에 관련된 값을 의미한다.
(변수나 상수, 함수 등이 어디에서 어떻게 쓰이느냐에 따라 용어가 조금씩 달라질 뿐이다.)

 

저장 프로퍼티

  • 인스턴스의 변수 또는 상수를 의미한다. (값을 저장하는 가장 단순한 개념의 프로퍼티)
  • 구조체와 클래스에서만 사용 가능하다. (열거형에서는 사용 X)
  • var 키워드를 사용하면 변수 저장 프로퍼티, let키워드를 사용하면 상수 저장 프로퍼티이다.

이니셜 라이저

구조체와 클래스의 저장 프로퍼티는 이니셜라이저 부분에서 조금 차이가 난다.

 

[구조체 저장 프로퍼티]

프로퍼티가 옵셔널이 아니더라도 모든 프로퍼티를 포함하는 이니셜라이즈를 자동으로 생성하여 제공한다.

 

[클래스 저장 프로퍼티]

만약 클래스의 저장 프로퍼티가 옵셔널이 아니라면 꼭 기본값을 지정해 주거나, 사용자 정의 이니셜 라이즈를 통해 반드시 초기화 과정을 가져야 한다.

단 저장 프로퍼티의 값이 옵셔널이라면 굳이 초기값을 안 넣어줘도 된다.

 

지연 저장 프로퍼티

  • lazy 키워드를 사용하며, 필요할 때 값이 할당되는 프로퍼티이다. 즉 호출이 있어야 값을 초기화한다.
  • 상수는 인스턴스가 완전히 생성되기 전에 초기화해야 하므로 호출이 있어야 값을 초기화하는 지연 저장 프로퍼티와는 맞지 않는다. 따라서 상수로는 선언하지 못하고 var키워드 (변수)로만 선언 가능하다.
  • 지연 저장 프로퍼티는 불필요한 성능 저하나 공간 낭비를 줄일 수 있다.

 

연산 프로퍼티

  • 값을 저장하는 것이 아니라 특정 연산을 실행한 결과 값이다.
  • getter와 setter의 역할을 할 수 있다.
    [메서드를 두고 프로퍼티를 사용하는 이유]
    메서드를 통해 구현하면 get과 set 두 개의 메서드를 구현해야함 -> 분산 구현되어 가독성 하락
    프로퍼티는 이를 한 번에 구현이 가능하며 훨씬 더 간편하고 직관적이다.
  • 일반적으로 get과 set을 같이 구현하지만, get만 구현한 읽기 전용 상태로 구현할 수 있다. 
    단, set만 구현한 쓰기 전용 상태로는 구현할 수 없으므로 이럴 때는 메서드를 통해 구현해야 한다.
  • set 매개변수로 원하는 이름을 지정하면 전달인자로 사용 가능하다. 이를 생략하면 newValue라는 이름으로 대신한다.

 

타입 프로퍼티

  • 앞서 살펴본 저장 프로퍼티와 연산 프로퍼티는 타입을 정의하고 해당 타입의 인스턴스가 생성되었을 때 사용할 수 있는 인스턴스 프로퍼티이다. 이는 인스턴스를 새로 생성할 때마다 초깃값에 해당하는 값이 프로퍼티의 값이 되고, 인스턴스마다 다른 값을 가질 수 있다.
  • 타입 프로퍼티는 인스턴스 프로퍼티와 다르게 각각의 인스턴스가 아니라 해당 타입 자체에 속하는 프로퍼티이다.
    -> 인스턴스 생성 여부에 상관없이 타입 프로퍼티는 하나로 공통된다. 즉 모든 인스턴스에서 공용으로 접근하고 값을 변경 가능하다.
  • static 키워드를 사용한다.
  • 저장 타입 프로퍼티 : 변수/ 상수 둘 다 선언 가능하며 반드시 초깃값을 설정해 주고 지연 연산된다.
    연산 타입 프로퍼티 : 변수만 선언 가능하다.

 

프로퍼티 감시자

프로퍼티의 값이 변하는 것을 감시한다. -> 값이 변경된에 따라 적절한 작업을 취할 수 있다.

종류로는 willSet메서드와 didSet메서드가 있다.

willSet메서드

  • 프로퍼티의 값이 변경되기 직전에 호출
  • 전달 인자로 변경될 값을 받고 이름을 따로 지정하지 않을 시 newValue라는 이름으로 사용 가능하다.

didSet메서드

  • 프로퍼티의 값이 변경된 직후에 호출
  • 전달 인자로 변경되기 전의 값을 받고 이름을 따로 지정하지 않을 시 oldValue라는 이름으로 사용 가능하다.
  • didSet 코드 블록 내에서 oldValue의 값을 참조하지 않거나 매개 변수 목록에 명시적으로 매개 변수 명을 적어주지 않으면 didSet메서드는 실행되지 않는다.

전역 변수와 지역 변수에서의 사용

클래스, 구조체 내의 프로퍼티가 아니더라도 전역 변수와 지역 변수에서도 연산 프로퍼티와 프로퍼티 감시자를 사용 가능하다.
즉 전역 변수와 지역 변수는 저장 프로퍼티의 역할을 하는 저장 변수인 것이다.

 

댓글