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 |