DAY 10 : 클래스

sun·2021년 9월 17일
0

100 Days of SwiftUI

목록 보기
5/11

[Day 10]  

@ Day 10 | 클래스와 구조체의 5가지 차이

# 클래스는 이니셜라이저가 필수

  • 구조체와 달리 memberwise initializer 사용 불가
class Dog {
    var name: String
    var breed: String
    
    init(name: String, breed: String) {
        self.name = name
        self.breed = breed
    }
}

let jaerong = Dog(name: "Jaerong", breed: "Maltese")

# 클래스는 다른 클래스로부터 상속 가능

  • 상속의 대상이 되는 클래스는 부모 클래스 혹은 슈퍼 클래스, 상속한 클래스는 자식 클래스
  • 단일 상속 만 가능, 다중 상속 불가
  • 상속 방법 : Class childClass: parentClass { //somecode }
class Dog {  // 부모 클래스
    var name: String
    var breed: String
    
    init(name: String, breed: String) {
        self.name = name
        self.breed = breed
    }
}

class Maltese: Dog {  // 자식 클래스
    init(name: String) {
        super.init(name: name, breed: "Maltese")
    }
}

메서드 오버라이딩(Overriding)

  • 자식 클래스는 override 키워드를 통해 부모 클래스의 메서드를 수정할 수 있음
class Dog {
    func makeNoise() {
        print("Woof!")
    }
}

class Maltese: Dog {
    override func makeNoise() {  // 오버라리딩
        print("Mung Mung!")
    }
}

let jaerong = Maltese()
jaerong.makeNoise()  // Mung Mung!

파이널 클래스

  • 어떤 클래스를 final class 로 선언하면 다른 클래스가 해당 클래스를 상속하는 것을 금지 가능
final class Dog {
    var name: String
    var breed: String
    
    init(name: String, breed: String) {
        self.name = name
        self.breed = breed
    }
}

class finalDog: Dog {}  // KO : ERROR

# 클래스의 복사본들은 모두 동일한 데이터를 가리킴

  • 따라서 한 복사본에서 프로퍼티를 변경하면 해당 인스턴스의 모든 복사본이 변경
  • 구조체의 경우 각각의 복사본은 독립적으로 존재하므로 한 복사본에서 프로퍼티를 변경하더라도 다른 복사본과는 무관
class Singer {
    var name = "Taylor Swift"
}

var singer = Singer()
print(singer.name)  // Taylor Swift

var singerCopy = singer
singerCopy.name = "Justin Bieber"  // 복사본에서 프로퍼티 변경
print(singer.name)  // Justin Bieber

# 클래스에는 디니이셜라이저(deinitializer)가 있음

  • 디이니셜라이저 : 클래스의 인스턴스가 파괴될 때 실행되는 코드
  • 클래스 인스턴스의 마지막 복사본이 삭제될 때 해당 인스턴스가 파괴됨
class Person {
    var name = "John Doe"
    
    init() {
        print("\(name) is alive!")
    }
    
    func printGreeting() {
        print("Hello, I'm \(name)")
    }
    
    deinit {  // 디니이셜라이저
        print("\(name) is no more!")
    }
}

for _ in 1...3 {
    let person = Person()
    person.printGreeting()
}

# 클래스는 상수로 선언했어도 프로퍼티가 변수로 선언되었다면 수정 가능

  • 구조체는 인스턴스를 상수로 선언했다면 프로퍼티가 변수로 선언되었더라도 값 변경 불가
class Singer {
    var name = "Taylor Swift"
}

let swift = Singer()  // 인스턴스를 상수로 선언
swift.name = "Justin Bieber"
print(swift.name)  // Justin Bieber
profile
☀️

0개의 댓글