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")