반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- IBOutlet
- userdefaults
- 진입점
- Understanding Swift Performance
- uikit
- firebase
- RunLoop
- 연산 프로퍼티
- property wrapper
- CoreLocation
- 원격 푸시
- Remot Push
- DispatchQueue
- WWDC16
- 트레일링 클로저
- entrypoint
- viewcontroller
- 후행 클로저
- ios
- AppTransportSecurity
- Choosing Between Structures and Classes
- weak
- OperationQueue
- for-in
- IBOutletCollection
- SWiFT
- 동시성프로그래밍
- TableView
- tableViewCell
- UIButton
Archives
- Today
- Total
iOS 공부하는 감자
Day8) 프로퍼티, 연산 프로퍼티 본문
반응형
프로퍼티
클래스, 구조체, 열거형 등에 관련된 값
프로퍼티 종류
- 저장 프로퍼티
- 연산 프로퍼티
- 타입 프로퍼티
저장 프로퍼티
- 클래스와 구조체에서 값을 저장하기 위해 선언되는 변수/상수
- 클래스와 구조체의 인스턴스가 생성되는 시점에 모든 프로퍼티는 초기화된다. (프로퍼티가 옵셔널이 아니라면 모두 값이 들어감)
// name, age 모두 저장 프로퍼티 class PersonClass { let name: String = "dong" var age: Int = 25 } struct PersonStruct { let name: String = "Dong" var age: Int = 25 }
- 지연 저장 프로퍼티 : 프로퍼티가 호출되는 시점에 초기화되는 저장 프로퍼티 (인스턴스가 생성되어도 선언만 될뿐 초기화되지 않음)
- 지연 저장 프로퍼티는 lazy 키워드를 추가해서 표현함
- 저장 프로퍼티로 다른 클래스나 구조체의 인스턴스를 할당해야 할 때 주로 사용된다. (인스턴스 초기화 단계에서 저장 프로퍼티에 할당될 다른 클래스나 구조체의 인스턴스가 당장 필요하지 않을 경우)
- 지연 저장 프로퍼티를 잘 사용하면 불필요한 성능저하, 공간낭비를 줄일 수 있다.
-
struct CoordinatePosition { var x: Int = 0 var y: Int = 0 } class Position { lazy var point: CoordinatePosition = CoordinatePosition() let name: String init(name: String) { self.name = name } } let yagomPosition: Position = Position(name: "yagom") // 아래의 코드를 통해 point 프로퍼티로 처음 접근할 때 // point 프로퍼티의 CoordinatePoint가 생성된다. print(yagomPosition.point) // x: 0, y: 0
연산 프로퍼티
- 저장 프로퍼티와 다르게 저장 공간을 갖지 않고, 다른 저장 프로퍼티의 값을 사용하여 연산을 하거나 전달받은 값을 다른 저장 프로퍼티에 저장하는 기능을 수행한다.
- 연산 프로퍼티는 열거형에서 사용이 가능하다.
- 값을 저장하는 것이 아니라 특정 상태에 따른 연산을 수행하므로 변수(var)로 선언되어야 한다.
- 값을 직접 저장하지 않기 때문에 타입 추론이 불가능하다. (선언할 때 자료형을 명시해야됨)
struct Money { var won: Int = 1000 var dollar: Int { // dollar를 호출하면 won / 1000 연산을 한 값을 리턴 get { return won / 1000 } // dollar에 값을 할당하면 들어온 값에 * 1000 연산을 수행하여 won에 할당 // set(파라미터 이름) <<- newValue대신 원하는 파라미터 이름을 사용할 수 있음 set { won = newValue * 1000 } } } var money: Money = Money() print(money.dollar) // 1 money.dollar = 3 print(money.won) // 3000 print(money.dollar) // 3
- 연산 프로퍼티는 get만 사용하여 읽기 전용으로 구현할 수 있지만 set만 사용하는 쓰기 전용으로는 구현할 수 없다.
타입 프로퍼티
- 저장 타입 프로퍼티와 연산 타입 프로퍼티가 존재한다.
- 저장 타입 프로퍼티는 타입을 선언할 당시에 원하는 값으로 항상 초기화가 되어 있어야 한다.
- 클래스, 구조체, 열거형에서 사용되며 static 키워드를 통해 선언한다.
- 이전까지 설명된 내용은 모두 인스턴스 프로퍼티에 대한 설명 ( 특정 타입의 인스턴스에 속하는 프로퍼티 )
- 타입 프로퍼티는 데이터 타입 자체에 속하는 프로퍼티
- 인스턴스 생성 여부와 관계없이 타입 프로퍼티의 값은 하나이며, 모든 인스턴스에서 공용으로 접근하고 값을 변경할 수 있는 변수 등을 정의할 때 유용하게 사용
- 자동으로 지연 연산되어 lazy 키워드를 사용할 필요가 없다. (언젠가 호출이 되면 메모리에 올라가고 해당 프로퍼티를 공유하는 개념)
struct Person { let name: String var age: Int static let nickName: String = "kong" } let dong: Person = Person(name: "dong", age: 25) // dong.nickName -- 인스턴스에서는 타입 프로퍼티로 접근할 수 없음 // 해당 타입을 통해 직접 접근 가능하고, 변수일 경우 값을 변경 가능 Person.nickName // kong
프로퍼티 감시자
- 프로퍼티의 값이 변경되면 적절한 작업을 취할 수 있다.
- 프로퍼티의 값이 새로 할당될 때마다 호출된다. (할당되기 전과 값이 같더라도..)
- willSet : 값이 저장되기 직전에 호출
- didSet: 값이 저장된 직후에 호출
- newValue, oldValue 대신 직접 괄호에 파라미터 이름을 넣어서 지정할 수도 있다.
-
struct Person { var name: String { willSet { print("현재 이름: \(name), 바꿀 이름: \(newValue)") } didSet { print("바꾼 이름: \(name), 바꾸기 전 이름: \(oldValue)") } } var age: Int } var dong: Person = .init(name: "dong", age: 25) dong.name = "kong" //현재 이름: dong, 바꿀 이름: kong //바꾼 이름: kong, 바꾸기 전 이름: dong
알고리즘
https://co-dong.tistory.com/15?category=1033755
반응형
'22 베이직 챌린지' 카테고리의 다른 글
Day10) 클래스와 상속 (0) | 2022.01.12 |
---|---|
Day9) 메서드, 접근제한자, Static (1) | 2022.01.11 |
Day7) 클래스와 구조체 (0) | 2022.01.09 |
Day6) 함수, 파라미터, 클로저 (0) | 2022.01.08 |
Day5) 연산자, 조건문, 반복문 + 알고리즘 (0) | 2022.01.07 |