-
[Swift] Swift 기본 문법 정리 5: PropertySwift 2023. 2. 1. 15:03
시작하며
Swift의 property는 강력하다. 이해하기 쉽고 옵저버와지연저장 프로퍼티 등을 제공해준다. Swift가 친절하고 편하게 느껴지는 것은 자바스크립트를 먼저 배워서일까, js야 고마워.
프로퍼티
프로퍼티는 클래스, 구조체, 열거형에 들어있는 속성들이다. 프로퍼티의 종류는 아래 5가지가 있다.
1. 저장 프로퍼티
2. 지연 저장 프로퍼티
3. 연산 프로퍼티
4. 프로퍼티 감시자
5. 타입 프로퍼티
저장 프로퍼티(Stored Property)
기본구조
... var nameOfProperty1: PropertyType let nameOfProperty2: PropertyType var nameOfProperty3: PropertyType = defaultValue var nameOfProperty4: PropertyType? //nil또는 PropertyType의 변수가 올 수 있다. ...
특징
- 저장 프로퍼티는 단순 값을 저장하는 프로퍼티이다.
- 상수(let)와 변수(var) 모두 선언 가능하다.
- 인스턴스의 저장 프로퍼티는 반드시 사용되기 전에 기본값 설정, 초기화 단계를 통해 특정 값으로 초기화 되어야 한다.
주의사항 (+ 이니셜라이저)
- 구조체 내부에 변수 프로퍼티가 있다고 해도 구조체를 상수로 선언하면 인스턴스의 프로퍼티를 변경할 수 없다.
- 구조체의 경우 멤버와이즈(memberwise, 멤버쪽) 이니셜라이저가 있어서 따로 이니셜라이저를 설정해주지 않아도 프로퍼티에 초기값 할당이 가능하지만 class의 경우 사용자가 정의한 커스텀 이니셜라이저가 있어야 인스턴스 생성과 동시에 할당이 가능하다.
- 단, 클래스의 경우에도 모든 프로퍼티에 기본값이 있는 경우 기본 이니셜라이저가 있어서 초기화를 해준다.
- 단, 구조체의 경우에도 커스텀 이니셜라이저가 있다면(사용자가 만든 init()) 멤버와이즈 및 기본 이니셜라이저를 사용할 수 없다.
- 프로퍼티는 이니셜라이저와 관계가 깊어서 이니셜라이저를 같이 이해해야 할 필요가 있다.
struct Person { var name: String } //멤버와이즈 이니셜라이저가 디폴트로 있다. var austin: Person = Person(name: "austin") class Human { var age: Int init(age: Int){ /* 기본적으로 프로퍼티에 접근할 때 self는 자신이 속한 인스턴스나 타입을 가리키기 때문에 생략해도 되지만 아래와 같이 파라미터의 이름과 같은 경우 self. 를 통해 접근한다. */ self.age = age } } var moon: Human = Human(age: 26)
지연 저장 프로퍼티(Lazy Stored Property)
특징
- 지연 저장 프로퍼티는 값이 처음으로 호출되기 전에는 계산되지 않은 프로퍼티로 항상 var 를 사용한다.
- 저장 프로퍼티 앞에 lazy 키워드를 사용해서 만들 수 있다.
- 특정 요소에 의존적이어서 그 값을 알지 못하는 경우 사용한다.
- 복잡하거나 계산이 많이 걸리는 작업에 사용해서 초기 인스턴스 생성 시점에서 복잡합 계산을 부하를 피할 수 있다.
func calcAge() -> Int {...} struct Person { var name: String lazy var age: Int = calcAge() } var austin = Person(name: "austin") austin.age //이렇게 호출할 때 생성된다.
연산 프로퍼티(Computed Property)
특징
- 연산 프로퍼티는 실제 값을 저장하고 있는 것이 아니라 특정 상태에 따른 값을 제공해주는 getter, setter의 역할을 한다.
- 메서드를 사용해서 직접 getter와 setter를 구현할 수도 있지만 연산 프로퍼티를 사용하는 것이 간편하고 직관적이다.
- set을 설정하지 않고 get만 설정해서 read-only로 만들 수 있다. (이 경우에는 get 키워드를 생략할 수 있다.)
- set의 경우 따로 파라미터를 설정해주지 않는 경우 newValue 라는 예약어를 통해 새로 set을 요청한 값을 사용할 수 있다.
- 요청이 있을 때마다 계산되기 때문에 var 로 선언해야 한다.
예시
struct Person { var name: String var age: Int var info: Person { get { return Person(name: name, age: age) } set { name = newValue.name age = newValue.age } } }
프로퍼티 감시자(Property Observers)
특징
- 프로퍼티에 새로운 값이 설정될 때마다 감시할 수 있는 옵저버이다.
- 새로 설정된 값이 이전 값과 같아도 호출된다.
- 저장 프로퍼티에만 적용이 가능하다 (연산 프로퍼티는 이미 set이 있기 때문에)
- willSet: 새로운 값이 항당 되기 직전에 호출된다. 새로운 입력에 대한 지정이 없는 경우 newValue 예약어를 통해 새로운 값에 접근 할 수 있다.
- didSet: 새로운 값이 할당 된 이후 호출 된다. 기본 입력이 없는 경우 oldValue 예약어를 사용할 수 있다.
class Person { var budget: Int = 0 { willSet { print("thank you for giving \(newValue)$") } didSet { print("get \(budget - oldValue)$ ") } } }
타입 프로퍼티(Type Property)
특징
- 인스턴스에 속하지 않고 타입 자체에 속한 프로퍼티를 타입 프로퍼티라고 한다.
- 타입 프로퍼티는 그 타입에 속하는 단 하나의 프로퍼티로 인스턴스에 공통으로 사용되는 값이 있을 때 사용하기 유용하다.
- 타입 프로퍼티 역시 연산 타입을 가질 수 있다.
- 타입 프로퍼티를 초기화해주는 이니셜라이저가 없기 때문에 타입 프로퍼티는 기본값을 항상 지정해야 한다.
- 타입 프로퍼티를 지정하는데 static 키워드를 사용하는데 클래스에서는 class 키워드를 추가로 사용할 수 있다. static 키워드는 상속이 되지 않는 반면 class 키워드를 사용한 연산 타입 프로퍼티는 오버라이드가 가능하다.
- 오버라이드: 상위 클래스로부터 상속 받은 메서드, 프로퍼티를 재정의
class Person { static var description: String = "this is a person" static var sayHello: String { return "hello!" } class var canWalk: Bool { return true } } Person.description class Baby: Person { override class var canWalk: Bool { return false } }
참조
https://jusung.gitbook.io/the-swift-language-guide/language-guide/10-properties
프로퍼티 (Properties) - The Swift Language Guide (한국어)
프로퍼티는 클래스, 구조체, 열거형과 관련한 값입니다. 프로퍼티의 종류에는 저장 프로퍼티(Stored Properties)와 계산된 프로퍼티(Computed Properties)가 있습니다. 저장 프로퍼티는 말 그대로 값을 저
jusung.gitbook.io
https://jinshine.github.io/2018/05/22/Swift/6.%ED%94%84%EB%A1%9C%ED%8D%BC%ED%8B%B0(Property)/
[Swift] 프로퍼티(Property) - jinShine
프로퍼티(Property) 1. 프로퍼티 프로퍼티는 크게 5가지가 존재합니다. 저장 프로퍼티(Stored Properties) 지연 저장 프로퍼티(Lazy Stroed Properties) 연산 프로퍼티(Computed Properties) 프로퍼티 감시자(Property Obs
jinshine.github.io
'Swift' 카테고리의 다른 글
[Swift] Xcode .gitignore 파일 추가하기 (0) 2023.03.01 [Swift] 메모리 참조 strong, weak, unowned 비교 (0) 2023.02.09 [Swift] Swift 기본 문법 정리 4: Protocol 📑 (0) 2023.01.30 [Swift] Swift 기본 문법 정리 5-1: 왜 Swift에는 Sturct와 Class로 나뉘어 있을까. (0) 2022.12.26 [Swift] Swift 기본 문법 정리 3: 클로저 (2) 2022.12.21