일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- UITextView
- swift documentation
- tableView
- 리펙토링
- clean architecture
- map
- Observable
- HIG
- collectionview
- uiscrollview
- ios
- 리팩토링
- Protocol
- 클린 코드
- RxCocoa
- swiftUI
- combine
- 리펙터링
- uitableview
- MVVM
- SWIFT
- ribs
- Refactoring
- Xcode
- 스위프트
- Clean Code
- UICollectionView
- rxswift
- 애니메이션
- Human interface guide
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[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
|
'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 |