[swift] 기본문법(4)
ios/swift

[swift] 기본문법(4)

import UIKit

/*
 10. property
 클래스, 구조체 또는 열거형 등에 관련된 값
 */

//a. 저장 property
struct Dog {
    var name: String
    let gender: String
}

var dog = Dog(name: "gunter", gender: "Male")
print(dog)

// 값 변경
dog.name = "james"
//dog.gender = "Female" => dog는 변수로 되어있지만 gender가 상수이므로 변경 불가

let dog2 = Dog(name: "gunter", gender: "Male")
//dog2.name = "paul"  => 구조체인 dog2가 상수이므로 변경 불가

/*
 struct 와 달리 class 는 참조 값이므로 상수로 선언한 인스턴스도 값을 바꿀 수 있음
 하지만 class 내에서 상수로 선언된 매개변수는 변경 불가
 */

class Cat {
    var name:String
    let gender: String
    
    init(name:String, gender:String){
        self.name = name
        self.gender = gender
    }
}

let cat = Cat(name: "jason", gender: "male")
cat.name = "gunter"
print(cat.name) // gunter
//cat.gender ="female" --> 불가


//b. 계산 property
struct Stock {
    var averagePrice:Int
    var quantity:Int
    var purchasePrice: Int{
        // getter
        get{
            return averagePrice * quantity
        }
        
        // setter
        set(newPrice){
            averagePrice = newPrice / quantity
        }
    }
}

var stock = Stock(averagePrice: 2300, quantity: 3)
print(stock)
stock.purchasePrice // 6900
stock.purchasePrice = 3000 // purchasePrice에 값을 할당했으므로 setter 동작
stock.averagePrice  // 3000 / 3 = 1000

// property 옵저버
class Account {
    var credit:Int = 0 {
        willSet {
            print("잔액이 \(credit)원에서 \(newValue)원으로 변경될 예정입니다.")
        }
        
        didSet {
            print("잔액이 \(oldValue)에서 \(credit)으로 변경되었습니다.")
        }
    }
}

var account = Account()
account.credit = 1000
/*
 잔액이 0원에서 1000원으로 변경될 예정입니다.
 잔액이 0에서 1000으로 변경되었습니다.
 */



/*c. 타입 property
인스턴스 생성없이 객체 내 property에 접근 가능
저장 property와 계산 property에서만 사용 가능
*/

struct SomeStructure {
    static var storedTypeProperty = "Some Value."
    
    static var computedTypeProperty: Int {
        return 1
    }
}

SomeStructure.computedTypeProperty // 1
SomeStructure.storedTypeProperty // "Some Value"
SomeStructure.storedTypeProperty = "Hello"
SomeStructure.storedTypeProperty // Hello


/*
 11. class와 구조체의 차이
<공통점>
 1. 값을 저장할 property를 선언할 수 있다.
 2. 함수적 기능을 하는 메서드를 선언할 수 있다.
 3. 내부 값에 . 을 사용하여 접근할 수 있다.
 4. 생성자를 사용해 초기 상태를 설정할 수 있다.
 5. extension을 사용하여 기능을 확장할 수 았다.
 6. protocol을 채택하여 기능을 설정할 수 았다.
 
 <클래스>
 1. 참조 타입
 2. ARC로 메모리 관리
 3. 타입 캐스팅을 통해 런타임에서 클래스 인스턴스의 타입 확인 가능
 4. deinit를 사용하여 인스턴스의 메모리 할당 해제 가능
 5. 같은 클래스의 인스턴스를 여러 개의 변수에 할당한 뒤 값을 변경시키면 모든 변수에 영향을 줌 ( 메모리가 복사됨 )
 
 
 <구조체>
 1. 값 타입
 2. 구조체 변수를 새로운 변수에 랄당할 때마다 새로운 구조체 생성
    --> 같은 구조체를 여러 개의 변수에 할당한 뒤 값을 변경시켜도 다른 변수에 영향X
 */

class SomeClass {
    var count: Int = 0
}

struct SomeStruct {
    var count: Int = 0
}


var class1 = SomeClass()
var class2 = class1
var class3 = class2
class3.count = 2
class1.count // 2

var struct1 = SomeStruct()
var struct2 = struct1
var struct3 = struct2

struct2.count = 3
struct3.count = 4

struct1.count // 0
struct2.count // 3
struct3.count // 4

 

반응형

'ios > swift' 카테고리의 다른 글

[swift] 기본문법(6)  (0) 2021.11.09
[swift] 기본문법(5)  (0) 2021.11.08
[swift] 기본문법(3)  (0) 2021.11.06
[swift] 기본문법(2)  (0) 2021.11.06
[swift] 기본문법(1)  (0) 2021.11.06