No.14
저장 속성(Stored Properties)
- 값이 저장되는 일반적인 속성(변수)을 저장 속성이라고 함
- *각 인스턴스가 가지는 고유의 데이터 저장 공간*
- 저장 속성은 var, let으로 선언 가능
- 저장 속성(변수)은 각 속성자체가 고유의 메모리 공간을 가짐
- 초기화 이전에 값을 가지고 있거나, 생성자 메서드를 통해 값을 반드시 초기화 해야만 함
- 열거형의 경우 따로 메모리 공간이 필요한 저장 속성(데이터)은 선언할 수 없음.
struct Bird {
var name: String // 저장 속성 name, weight
var weight: Double
init(name: String, weight: Double) { // 기본값이 없으면, 생성자를 통해 값을 반드시 초기화해야함
self.name = name
self.weight = weight
}
func fly() {
print("날아갑니다.")
}
}
// 새를 찍어낼 때마다 이름, 무게에 대한 메모리 공간은 반드시 가짐
지연 저장 속성(Lazy Stored Properties)
- 처음부터 메모리 공간을 가지지 않는 변수
struct Bird1 {
var name: String
lazy var weight: Double = 0.2 // 미리 초기값 세팅
init(name: String) {
self.name = name
//self.weight = 0.2
}
func fly() {
print("날아갑니다.")
}
}
var aBird1 = Bird1(name: "새") // weight 속성 초기화 안됨
// name [ "새" ]
aBird1.weight // <============ 해당 변수에 접근하는 이 시점에 초기화됨 (메모리 공간이 생기고 숫자가 저장됨)

- 지연 저장 속성은 해당 변수(저장 속성)의 초기화를 지연시키는 것
- 인스턴스가 초기화되는 시점에 해당 속성이 값을 갖고 초기화되는 것이 아닌(메모리에 공간과 값을 갖는 것이 나니), 해당 속성(변수)에 접근하는 순간에 (해당 저장 속성만)개별적으로 초기화
- 따라서, var 로만 선언 가능
- lazy 속성 사용시 반드시 초기화 값을 설정해놓아야 함.
- 지연 저장 속성은 “선언시점에 기본값을 저장”해야함
- 지연 저장 속성은 구조체, 클래스에서 모두 사용 가능
- 실제, 언제 사용됨?
class AView {
var a: Int
// 1) 메모리 많이 차지할때
lazy var view = UIImageView()
// 2) 다른 속성 이용(다른 저장 속성에 의존해야만 할때)
lazy var b: Int {
return a * 10
}()
init(num: Int) {
self.a = num
}
}
var view1 = AView(num: 5)
// view1
// a [ 5 ]
// b [ 5 * 10 ] -> a가 초기화 된 후에 b를 초기화 (순서가 중요한 경우)
- 즉, 메모리 공간의 낭비를 막을 수 있고, 지연 저장 속성으로 선언되는 속성이 다른 저장 속성을 이용하게 할 수 있음
계산 속성(Computed Properties)
→ 메서드의 메모리 동작
- 클래스
- 필요한 데이터들만 힙에서 저장(변수들)한 뒤, 함수는 데이터 영역(메서드 영역이 따로 존재)에서 저장(메모리 주소를 가진 채로)
- 구조체
- 구조체의 경우 실제론 함수 메모리 주소 직접 접근 → 코드영역에서 주소를 그냥 박아놓아서, 코드 영역에서 바로 찾아간다.
- 일반적으로 다른 저장 속성에 의존한 결과로 나오는 그런 방식의 메서드를 속성처럼 만든 것
- 실제로 메모리 공간에선 get, set 메서드가 따로 구현됨.
import UIKit
class Person {
var birth: Int = 0
var age: Int { // 계산 속성 - get, set 블록 2개로 나뉨
get {
return 2021 - birth
}
set(age) { // set 블록은 생략 가능(선택적 구현 가능)
self.brith = 2021 - age
}
}
// func getAge() -> Int {
// return 2021 - birth
// }
//
// func setAge(_ age: Int) {
// self.birth = 2021 - age
// }
}
var p1 = Person()
p1.birth = 2000
p1.age // get
//p1.age = 20 // set
p1.birth
class Person2 {
var name: String = "사람"
var height: Double = 160.0
var weight: Double = 60.0
var bmi: Double {
get { //getter ===> 값을 얻는다는 의미
let bmi = weight / (height * height) * 10000
return bmi
}
set(bmi) { //setter ===> 값을 세팅한다(넣는다)는 의미
weight = bmi * height * height / 10000
}
// get만 사용시
// let bmi = weight / (height * height) * 10000
// return bmi
// set블록의 파라미터를 생략하고 'newValue'로 대체가능(기본 설정)
}
// 만약에 쓰기 계산속성(set)을 메서드로 구현했다면
// func setWeightWithBMI(bmi: Double) {
// weight = bmi * height * height / 10000
// }
}
let p2 = Person2()
p2.height = 165 // 키 165
p2.weight = 65 // 몸무게 65
p2.bmi
p2.bmi = 25
p2.weight
- 왜 이런 방식을 채택하는 가?
- 관련있는 두가지 메서드(함수)를 한번에 구현 가능
- 코드의 명확성
- 겉모습은 속성(변수)형태를 가진 메서드(함수)
- 실제 메모리 공간을 가지지 않고, 해당 속성에 접근했을때 다른 속성에 접근해서 계산한 후, 그 계산 결과를 리턴하거나 세팅하는 메서드
- 주의점
- 계산 속성 : 구조체, 클래스, (열거형) 동일
- 항상 변하는 값이므로, var로 선언해야함 (let로 선언불가)
- 자료형 선언을 해야함(형식추론 형태 안됨) (메서드이기 때문에 파라미터, 리턴형이 필요한 개념)
- get은 반드시 선언 해야함(값을 얻는 것은 필수, 값을 set하는 것은 선택)
반응형
'iOS > Swift' 카테고리의 다른 글
Swift No.15 (0) | 2024.01.17 |
---|---|
Swift No.14 (0) | 2024.01.16 |
Swift No.12 (0) | 2024.01.13 |
Swift No.11 (0) | 2024.01.13 |
Swift No.10 (1) | 2024.01.10 |
No.14
저장 속성(Stored Properties)
- 값이 저장되는 일반적인 속성(변수)을 저장 속성이라고 함
- *각 인스턴스가 가지는 고유의 데이터 저장 공간*
- 저장 속성은 var, let으로 선언 가능
- 저장 속성(변수)은 각 속성자체가 고유의 메모리 공간을 가짐
- 초기화 이전에 값을 가지고 있거나, 생성자 메서드를 통해 값을 반드시 초기화 해야만 함
- 열거형의 경우 따로 메모리 공간이 필요한 저장 속성(데이터)은 선언할 수 없음.
struct Bird {
var name: String // 저장 속성 name, weight
var weight: Double
init(name: String, weight: Double) { // 기본값이 없으면, 생성자를 통해 값을 반드시 초기화해야함
self.name = name
self.weight = weight
}
func fly() {
print("날아갑니다.")
}
}
// 새를 찍어낼 때마다 이름, 무게에 대한 메모리 공간은 반드시 가짐
지연 저장 속성(Lazy Stored Properties)
- 처음부터 메모리 공간을 가지지 않는 변수
struct Bird1 {
var name: String
lazy var weight: Double = 0.2 // 미리 초기값 세팅
init(name: String) {
self.name = name
//self.weight = 0.2
}
func fly() {
print("날아갑니다.")
}
}
var aBird1 = Bird1(name: "새") // weight 속성 초기화 안됨
// name [ "새" ]
aBird1.weight // <============ 해당 변수에 접근하는 이 시점에 초기화됨 (메모리 공간이 생기고 숫자가 저장됨)

- 지연 저장 속성은 해당 변수(저장 속성)의 초기화를 지연시키는 것
- 인스턴스가 초기화되는 시점에 해당 속성이 값을 갖고 초기화되는 것이 아닌(메모리에 공간과 값을 갖는 것이 나니), 해당 속성(변수)에 접근하는 순간에 (해당 저장 속성만)개별적으로 초기화
- 따라서, var 로만 선언 가능
- lazy 속성 사용시 반드시 초기화 값을 설정해놓아야 함.
- 지연 저장 속성은 “선언시점에 기본값을 저장”해야함
- 지연 저장 속성은 구조체, 클래스에서 모두 사용 가능
- 실제, 언제 사용됨?
class AView {
var a: Int
// 1) 메모리 많이 차지할때
lazy var view = UIImageView()
// 2) 다른 속성 이용(다른 저장 속성에 의존해야만 할때)
lazy var b: Int {
return a * 10
}()
init(num: Int) {
self.a = num
}
}
var view1 = AView(num: 5)
// view1
// a [ 5 ]
// b [ 5 * 10 ] -> a가 초기화 된 후에 b를 초기화 (순서가 중요한 경우)
- 즉, 메모리 공간의 낭비를 막을 수 있고, 지연 저장 속성으로 선언되는 속성이 다른 저장 속성을 이용하게 할 수 있음
계산 속성(Computed Properties)
→ 메서드의 메모리 동작
- 클래스
- 필요한 데이터들만 힙에서 저장(변수들)한 뒤, 함수는 데이터 영역(메서드 영역이 따로 존재)에서 저장(메모리 주소를 가진 채로)
- 구조체
- 구조체의 경우 실제론 함수 메모리 주소 직접 접근 → 코드영역에서 주소를 그냥 박아놓아서, 코드 영역에서 바로 찾아간다.
- 일반적으로 다른 저장 속성에 의존한 결과로 나오는 그런 방식의 메서드를 속성처럼 만든 것
- 실제로 메모리 공간에선 get, set 메서드가 따로 구현됨.
import UIKit
class Person {
var birth: Int = 0
var age: Int { // 계산 속성 - get, set 블록 2개로 나뉨
get {
return 2021 - birth
}
set(age) { // set 블록은 생략 가능(선택적 구현 가능)
self.brith = 2021 - age
}
}
// func getAge() -> Int {
// return 2021 - birth
// }
//
// func setAge(_ age: Int) {
// self.birth = 2021 - age
// }
}
var p1 = Person()
p1.birth = 2000
p1.age // get
//p1.age = 20 // set
p1.birth
class Person2 {
var name: String = "사람"
var height: Double = 160.0
var weight: Double = 60.0
var bmi: Double {
get { //getter ===> 값을 얻는다는 의미
let bmi = weight / (height * height) * 10000
return bmi
}
set(bmi) { //setter ===> 값을 세팅한다(넣는다)는 의미
weight = bmi * height * height / 10000
}
// get만 사용시
// let bmi = weight / (height * height) * 10000
// return bmi
// set블록의 파라미터를 생략하고 'newValue'로 대체가능(기본 설정)
}
// 만약에 쓰기 계산속성(set)을 메서드로 구현했다면
// func setWeightWithBMI(bmi: Double) {
// weight = bmi * height * height / 10000
// }
}
let p2 = Person2()
p2.height = 165 // 키 165
p2.weight = 65 // 몸무게 65
p2.bmi
p2.bmi = 25
p2.weight
- 왜 이런 방식을 채택하는 가?
- 관련있는 두가지 메서드(함수)를 한번에 구현 가능
- 코드의 명확성
- 겉모습은 속성(변수)형태를 가진 메서드(함수)
- 실제 메모리 공간을 가지지 않고, 해당 속성에 접근했을때 다른 속성에 접근해서 계산한 후, 그 계산 결과를 리턴하거나 세팅하는 메서드
- 주의점
- 계산 속성 : 구조체, 클래스, (열거형) 동일
- 항상 변하는 값이므로, var로 선언해야함 (let로 선언불가)
- 자료형 선언을 해야함(형식추론 형태 안됨) (메서드이기 때문에 파라미터, 리턴형이 필요한 개념)
- get은 반드시 선언 해야함(값을 얻는 것은 필수, 값을 set하는 것은 선택)
반응형
'iOS > Swift' 카테고리의 다른 글
Swift No.15 (0) | 2024.01.17 |
---|---|
Swift No.14 (0) | 2024.01.16 |
Swift No.12 (0) | 2024.01.13 |
Swift No.11 (0) | 2024.01.13 |
Swift No.10 (1) | 2024.01.10 |