Swift 프로퍼티(1) 저장프로퍼티
프로퍼티
프로퍼티는 클래스 구조체 또는 열거형 등에 관련된 값을 뜻한다
프로퍼티는 크게 3가지로 나눌 수 있다 저장 프로퍼티, 연산 프로퍼티, 타입 프로퍼티
저장 프로퍼티
저장 프로퍼티는 클래스, 구조체의 인스턴스와 연관된 값을 저장하는 가장 단순한 프로퍼티이다
저장 프로퍼티는 구조체와 클래스에서 이니셜 라이저가 다르다
구조체에서의 저장 프로퍼티
구조체의 저장 프로퍼티에서는 저장 프로퍼티가 옵셔널이 아니더라도 저장 프로퍼티를 모두 포함하는 이니셜 라이저를 생성한다(옵셔널도 포함된다 nil이 가능하다)
따라서 구조체를 선언할 때 초깃값을 정해주지 않아도 인스턴스 생성이 가능하다
1
2
3
4
5
6
struct CoordinatePoint {
var x: Int
var y: Int //저장 프로퍼티 초깃값 없음
}
let point: CoordinatePoint = CoordinatePoint(x: 10, y: 23) // 인스턴스 생성 및 이니셜라이저
클래스에서의 저장 프로퍼티
클래스의 저장 프로퍼티는 옵셔널이 아니라면 기본값을 지정해 주거나 사용자 이니셜 라이저를 통해 반드시 초기화해주어야 한다 클래스의 인스턴스의 상수 프로퍼티는 인스턴스가 초기화될 때 한 번만 값을 할당할 수 있다 자식 클래스에서 이 초기화를 변경할 수 없다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
struct CoordinatePoint {
var x: Int
var y: Int //저장 프로퍼티
}
let point: CoordinatePoint = CoordinatePoint(x: 10, y: 23) // 인스턴스 생성 및 이니셜 라이저
class Position {
var point1: CoordinatePoint
let name: String
init(name: String, currentPoint: CoordinatePoint) {
self.name = name
self.point1 = currentPoint
}
}
var myPosition: Position = Position(name: "min", currentPoint: point)//사용자 정의 이니셜라이저
print(myPosition.point1)//CoordinatePoint(x: 10, y: 23)
구조체에 비해 클래스는 저장 프로퍼티 사용이 번거롭다 하지만 클래스의 저장 프로퍼티에 초깃값을 지정하면 사용자 정의 이니셜 라이저를 구현할 필요가 없다
저장 프로퍼티 초깃값 지정
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
struct CoordinatePoint {
var x: Int = 1
var y: Int = 2 //저장 프로퍼티
}
//초기값이 있어 전달인자로 초깃값을 넘길 필요가 없음
let point1: CoordinatePoint = CoordinatePoint()// 인스턴스 생성 및 이니셜 라이저
let point2: CoordinatePoint = CoordinatePoint(x: 312, y: 231)
class Position {
var point: CoordinatePoint = CoordinatePoint() //이미 구초체에 초깃값이 있다
var name: String = "unknow"
}
var myPosition: Position = Position() //초깃값으로 인스턴 생성
print(myPosition.point) //CoordinatePoint(x: 1, y: 2)
myPosition.point = point2 //초깃값에서 값 변경
myPosition.name = "min" //초깃값에서 값 변경
print(myPosition.point) //CoordinatePoint(x: 312, y: 231)
초깃값을 미리 지정하면 인스턴스를 만드는 과정이 간단해진다 하지만 의도와 맞지 않게 인스턴스가 사용될 가능성이 남아있고 인스턴스를 생성한 후에 원하는 값을 일일이 할당해야 해서 불편하다
지연 저장 프로퍼티
지연 저장 프로퍼티는 인스턴스를 생성할 때 저장 프로퍼티 값을 초기화하는 것이 아니라 호출이 있어야 초기화 되며 lazy키워드를 사용한다
지연저장 프로퍼티는 var 키워드를 사용하여 변수로 정의
지연 저장 프로퍼티는 주로 복잡한 클래스나 구조체를 구현할 때 많이 사용된다 클래스 인스턴스의 저장 프로퍼티로 다른 클래스 인스턴스나 구조체 인스턴스를 할당해야 할 때가 있다 이때 인스턴스를 초기화 하면서 저장 프로퍼티로 쓰이는 인스턴스들이 한번에 생성되어야 한다면? (초기화를 통해 호출 -> 인스턴스 생성)
굳이 컴퓨터 자원을 사용하여 저장 프로퍼티를 사용 할 필요가 없다면? 호출전은 프로퍼티를 생성하지 않아도 되서 효율 상승
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct CoordinatePoint {
var x: Int = 0
var y: Int = 0
}
class Position {
lazy var point: CoordinatePoint = CoordinatePoint()
let name: String
init(name: String) {
self.name = name
}
}
let myPosition: Position = Position(name: "min")
print(myPosition.name)
print(myPosition.point) //이 호출때 point프로퍼티의 CoordinatePoint가 생성