관리 메뉴

김종권의 iOS 앱 개발 알아가기

[swift] 8. 구조체(struct)와 클래스(class), 프로퍼티 본문

swift 5 문법

[swift] 8. 구조체(struct)와 클래스(class), 프로퍼티

jake-kim 2020. 3. 27. 23:32

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
print(user.year) // 2020
 
user.x = 2020
print(user.year) // 4040
 
 
 

※ 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()
user.age = 10000
// 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
 
 

 

'swift 5 문법' 카테고리의 다른 글

[swift] 10. 열거형과 익스텐션  (0) 2020.03.29
[swift] 9. 상속 및 다운캐스팅  (0) 2020.03.28
[swift] 7. 클로저(closure)  (0) 2020.03.26
[swift] 6. 함수(일급 함수)  (0) 2020.03.26
[swift] 5. 옵셔널(Optional)  (0) 2020.03.26
Comments