* 이럴 때 Struct 쓰자
(1) 두 Object를 "같다, 다르다"로 비교해야 하는 경우
(2) Copy 된 각 객체들이 독립적인 상태를 가져야 하는 경우
(3) Object의 데이터를 여러 스레드에 걸쳐 사용할 경우 (각 Object가 독립적으로 존재하므로 다중 스레드를 사용하더라도 오류가 날 확률이 낮다.)
* 이럴 때 Class 쓰자
(1) 두 Object의 인스턴스 자체가 같음을 확인할 때
(2) 하나의 객체가 필요하고, 여러 대상에 의해 접근되고 변경이 필요한 경우
# 쉽게 사용하는 Tip)
1. 일단 Struct로 쓰자
2. 그 이후에 Class로 바꿔보자 (상황에 따라 다름)
- 공식 Doc
https://developer.apple.com/swift/blog/?id=10
# 실무 Tip)
애플 공식 개발자 문서 사이트를 참고해서 이용, 그 이후에 모니터링 용도로 스택오버플로우 이용
개발 공식 문서 사이트의 내용을 이해하고 나만의 말하기 방식으로 정리하기
* 상속 (A is B)
A : subclass / B : superclass
# 상속의 특징
1. 하나의 subclass가 여러 개의 superclass를 가질 수는 없다.
2. 하나의 superclass는 여러 개의 subclass를 가질 수 있다.
3. 자식클래스의 깊이는 제한이 없다.
<실습코드>
import UIKit
struct Grade {
var letter: Character
var points: Double
var credits: Double
}
class Person {
var firstName: String
var lastName: String
init(firstName: String, lastName: String) {
self.firstName = firstName
self.lastName = lastName
}
var fullName: String {
return "\(firstName) \(lastName)"
}
func printFullName() {
print("\(firstName) , \(lastName)")
}
}
class Student: Person {
var grades: [Grade] = []
}
var jao = Person(firstName: "Hao", lastName: "Lee")
var jay = Student(firstName: "Jay", lastName: "Son")
jao.firstName
jay.firstName
jao.printFullName()
jay.printFullName()
let math = Grade(letter: "8", points: 8.5, credits: 2.5)
let history = Grade(letter: "A", points: 8.0, credits: 1.5)
jay.grades.append(math)
jay.grades.append(history)
jay.grades.count
// 학생인데 운동선수
class StudentAthlete: Student {
var minimumTrainingTime: Int = 2
var trainedTime: Int = 0
func train() {
trainedTime += 1
}
}
// 운동선인데 축구선수
class FootballPlayer: StudentAthlete {
var footballTeam = "FC Swift"
override func train() {
trainedTime += 2
}
}
// Person > Student > Athelete > Football Player
var athlete1 = StudentAthlete(firstName: "Yuna", lastName: "Kim")
var athlete2 = FootballPlayer(firstName: "Heungmin", lastName: "Son")
athlete1.firstName
athlete2.firstName
athlete1.grades.append(math)
athlete2.grades.append(math)
athlete1.minimumTrainingTime
athlete2.minimumTrainingTime
athlete2.footballTeam
// athlete1 운동시간 확인
athlete1.train()
athlete1.trainedTime
// athlete2 운동시간 확인
athlete2.train()
athlete2.trainedTime
// upper Casting
athlete1 = athlete2 as StudentAthlete
athlete1.train()
athlete1.trainedTime
athlete2.trainedTime
// down Casting
if let son = athlete1 as? FootballPlayer {
print("--> team : \(son.footballTeam)")
}
'iOS' 카테고리의 다른 글
[19일차] Designated Init vs. Convenience Init (0) | 2020.08.07 |
---|---|
[18일차] Class 생성자 이해하기 (2-phase Initialization) (0) | 2020.08.07 |
[16일차] Class 사용 (0) | 2020.08.04 |
[15일차] Property vs Method (0) | 2020.08.04 |
[14일차] Structure Property (구조 프로퍼티) 학습 (0) | 2020.07.31 |
댓글