본문 바로가기
iOS

[17일차] Class와 Struct를 사용해야 할 때

by 디지털노마더 2020. 8. 5.

* 이럴 때 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)")
}

 

댓글