Swift/문법
Class / 상속 / 생성자
khon98
2021. 3. 3. 21:18
object = structure와 class형태로 구현할 수 있음
structure
- value 타입
- 할당될 때 copy를 하게 됨
- stack에 저장
- 빠름
- 두 object를 같다, 다르다로 비교해야 하는 경우
- copy 된 각 객체들이 독립적인 상태를 가져야 하는 경우
- 코드에서 오브젝트의 데이터를 여러 스레드 걸쳐 사용할 경우
class
- reference 타입
- 할당할 때 reference 주소를 공유
- heap에 저장
- 느림
- 두 오브젝트의 인스턴스 자체가 같음을 확인해야 할 때
- 하나의 객체가 필요하고, 여러 대상의 의해 접근되고 변경이 필요한 경우
struct PersonStruct {
var firstName: String
var lastName: String
var fullName: String {
return "\(firstName) \(lastName)"
}
mutating func uppercaseName() {
firstName = firstName.uppercased()
lastName = lastName.uppercased()
}
}
// mutating은 class에서는 사용하지 않음
class PersonClass {
var firstName: String
var lastName: String
init(firstName: String, lastName: String) {
self.firstName = firstName
self.lastName = lastName
}
var fullName: String {
return "\(firstName) \(lastName)"
}
func uppercaseName() {
firstName = firstName.uppercased()
lastName = lastName.uppercased()
}
}
var PersonStruct1 = PersonStruct(firstName: "kh", lastName: "on")
var PersonStruct2 = PersonStruct1
var PersonClass1 = PersonClass(firstName: "kh", lastName: "on")
var PersonClass2 = PersonClass1
PersonStruct2.firstName = "k"
PersonStruct1.firstName
PersonStruct2.firstName
PersonClass2.firstName = "k"
PersonClass1.firstName
PersonClass2.firstName
PersonClass2 = PersonClass(firstName: "khon", lastName: "01")
PersonClass1.firstName
PersonClass2.firstName
PersonClass1 = PersonClass2
PersonClass1.firstName
PersonClass2.firstName
상속
// 상속
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
}
func printMyName() {
print("my name is \(firstName) \(lastName)")
}
}
class Student: Person {
var grades : [Grade] = []
}
let khon = Person(firstName: "khon", lastName: "01")
let khon02 = Student(firstName: "khon01", lastName: "02")
khon.firstName
khon02.firstName
khon.printMyName()
khon02.printMyName()
let math = Grade(letter: "B", points: 8.5, credits: 3)
let history = Grade(letter: "A", points: 9.5, credits: 4)
khon02.grades.append(math)
khon02.grades.append(history)
khon02.grades.count
class StudentAthelete: Student {
var minimumTrainingTime: Int = 2
var trainedTime: Int = 0
func train() {
trainedTime += 1
}
}
class FootballPlayer: StudentAthelete {
var footballTeam = "man U"
override func train() {
trainedTime += 2
}
}
var athelete1 = StudentAthelete(firstName: "yuna", lastName: "kim")
var athelete2 = FootballPlayer(firstName: "heung", lastName: "son")
athelete1.firstName
athelete2.firstName
athelete1.grades.append(math)
athelete2.grades.append(history)
athelete1.minimumTrainingTime
athelete2.minimumTrainingTime
// athelete1.footballTeam 오류 발생
athelete2.footballTeam
athelete1.train()
athelete1.trainedTime
athelete2.train()
athelete2.trainedTime
// upper casting
athelete1 = athelete2 as StudentAthelete
athelete1.train()
athelete1.trainedTime
// down casting
if let son = athelete1 as? FootballPlayer {
print("team: \(son.footballTeam)")
}
생성자
// 생성자
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
}
}
class Student: Person {
var grades : [Grade] = []
override init(firstName: String, lastName: String) {
super.init(firstName: firstName, lastName: lastName)
}
convenience init(student: Student) {
self.init(firstName: student.firstName, lastName: student.lastName)
}
}
class StudentAthelete: Student {
var minimumTrainingTime: Int = 2
var trainedTime: Int = 0
var sports: [String]
init(firstName: String, lastName: String, sports: [String]) {
// phase 1 / 자식, 부모 클래스 프로퍼티 세팅
self.sports = sports
super.init(firstName: firstName, lastName: lastName)
// phase 2 / 자신이 가지고 있는 메서드 호출 가능
self.train()
}
// 간략하게 사용
convenience init(name: String) {
self.init(firstName: name, lastName: "", sports: [])
}
func train() {
trainedTime += 1
}
}
class FootballPlayer: StudentAthelete {
var footballTeam = "man U"
override func train() {
trainedTime += 2
}
}
let student1 = Student(firstName: "khon", lastName: "01")
let student1_1 = Student(student: student1)
let student2 = StudentAthelete(firstName: "khon", lastName: "02", sports: ["football"])
let student3 = StudentAthelete(name: "khon03")