[swift] 8. 구조체(struct)와 클래스(class), 프로퍼티
1. 구조체와 클래스의 차이
- 클래스만이 가지고 있는 특성 : 상속, 타입 캐스팅, 소멸화 구문, 참조에 의한 전달
- 구조체만이 가지고 있는 특성 : Memberwise Initializer ( 모든 인자값을 받고 초기화 해주는 구문을 자동으로 생성)
|
1
2
3
4
5
6
7
8
9
10
|
struct MyStruct{
var a : Int = 1
var b : Int = 2
func f () -> () {
}
}
MyStruct() // 기본 초기화
MyStruct(a: 1, b: 2) // 모든 인수 초기화
|
- 구조체는 값에 의한 복사이고 클래스는 주소를 넘겨줌
- 클래스는 메서드에서 멤버변수를 바꿀 수 있지만, 구조체는 메서드에서 멤버변수에 있는 값을 바꾸려면 mutating 키워드를 사용해야함
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
class CUser{
var year : Int = 2020 // 저장 프로퍼티
func ch() -> Void {
self.year = 10
}
}
struct SUser{
var year : Int = 2020 // 저장 프로퍼티
func ch() -> Void {
self.year = 10 // Cannot assign to property: 'self' is immutable
}
mutating func ch2() -> Void{
self.year = 10 // success!!
}
}
|
2. 인스턴스
- 메모리 공간을 할당받은 것
- 구조체 인스턴스는 언제나 단일참조라, 인스턴스가 할당된 변수나 상수의 사용이 끝나면 곧바로 메모리에서 해제
- 클래스 인스턴스는 여러 곳에서 동시에 참조가 가능하므로 마음대로 메모리에서 해제 불가 -> ARC(Auto Reference Count)사용
- 인스탄스 비교 연산자 : ===, !==
3. 프로퍼티
1) 저장 프로퍼티 : 클래스 내에서 선언된 변수(멤버변수)나 상수(멤버상수)를 의미
- init() 으로 초기화
|
1
2
3
4
5
6
7
|
class User {
var name: String
init() {
self.name = ""
}
}
let a = User()
|
- 지연 저장 프로퍼티 : 참조 될 때 초기화
|
1
2
3
4
5
6
7
8
9
10
11
|
func f() -> (){
print("name초기화")
}
class User{
lazy var name = f()
}
var myClass = User()
print("name참조 전")
|
2) 연산 프로퍼티 : get구문과 set구문이 있으며 연산에 의한 값 정의 (set이 생략되면 읽기 전용)
- get은 독립적으로 사용할 수 있지만, set을 사용하려면 get이 있어야함
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class User{
var year : Int = 2020 // 저장 프로퍼티
var x : Int { // 연산 프로퍼티
get{
return year
}
set(abcdef){
self.year = abcdef * 2
}
}
}
let user = User()
print(user.x) // 2121
user.x = 2020
|
※ set은 값을 대입할 때 불러지는 것
3) 프로퍼티 옵저버
- 값이 바뀌기 전과 후의 작업이 필요한 경우 : willSet은 파라미터를 생략할 수 있으며 newValue이용, didSet은 oldValue이용
- 단, set과 같이 사용할 수 없음
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
class User{
var year : Int = 2020 // 저장 프로퍼티
var age : Int = 123 {
willSet{
print("willSet -- newValue=\(newValue)")
}
didSet{
print("didSet -- oldValue=\(oldValue)")
}
}
}
let user = User()
// willSet -- newValue=10000
// didSet -- oldValue=123
|
4) 타입 프로퍼티 (타입 메서드)
- 인스턴스를 생성하지 않고 클래스나 구조체 자체에 값을 저장하게 하는 것
- 변수와 상수에 static을 붙이거나, class let/var 프로퍼티명 : 타입 { get, set }형식으로 입력
- struct형에서 멤버변수의 값을 바꾸려면 함수를 mutating으로 선언해야함
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
class C1{
static var v1: Int = 10
class var v2: Int { // 오버라이딩 가능한 타입 프로퍼티
get{
return 20
}
set{
}
}
}
C1.v1 = 1
C1.v2 = 2
|