본문으로 바로가기

상속이란?

본질적으로 성격이 비슷한 타입을 새로 만들어 프로퍼티나 기능을 추가 및 변형시켜서 사용하는것

- 상속은 클래스에서만 지원하는 기능이다 (구조체는 상속 불가능)

class Person {
    var id = 0
    var name = "Jimin"
    var phoneNumber = "010xxxxxxxx"
    
    func doSomething() {
        print("doSomething")
    }
}

// Student 클래스에 Person클래스 상속
// Student클래스는 자식클래스, Person클래스는 부모클래스가 된다
class Student: Person {
    // Person클래스를 상속함으로서 id, name, phoneNumber,
    // doSomething()에 접근이 가능하다
    var studentId = 0
    
    func doSomething2() {
        print("\(name)님의 studentId는 \(studentId)입니다")
    }
}

// Student 인스턴스를 만들면 Person클래스의
// 프로퍼티와 메서드에 접근이 가능하다
var student1 = Student()
student1.name           // Jimin
student1.id             // 0
student1.phoneNumber    // 010xxxxxxxx
student1.doSomething()  // 콘솔: doSomething
student1.studentId      // 0
student1.doSomething2() // 콘솔: Jimin님의 studentId는 0입니다
 

상속시 주의점

- 구조체는 상속이 불가능하다

class Person {
    var id = 0
    var name = "Jimin"
    var phoneNumber = "010xxxxxxxx"
    
    func doSomething() {
        print("doSomething")
    }
}

// 구조체는 상속이 불가능하다 (프로토콜 채택은 가능)
//struct AStruct: Person {
//
//}

- 스위프트는 다중상속을 지원하지 않는다

class Person {
    var id = 0
    var name = "Jimin"
    var phoneNumber = "010xxxxxxxx"
    
    func doSomething() {
        print("doSomething")
    }
}

class Student {
    
}

// 다중상속은 불가능하다 (단, 프로토콜 채택은 몇개를 하든 상관없다)
//class AnotherClass: Person, Student {
//}

final 클래스

- 클래스에 final 키워드를 사용하면 더이상 상속할 수 없다

class Person {
    var id = 0
    var name = "Jimin"
    var phoneNumber = "010xxxxxxxx"
    
    func doSomething() {
        print("doSomething")
    }
}

final class Student: Person { // 클래스를 더이상 상속시키고 싶지 않을땐 final키워드를 쓴다
    // Person클래스를 상속함으로서 id, name, phoneNumber,
    // doSomething()에 접근이 가능하다
    var studentId = 0
    
    func doSomething2() {
        print("\(name)님의 studentId는 \(studentId)입니다")
    }
}

//Student 클래스가 final로 설정돼있기 때문에
//더이상 Student클래스를 상속하지 못한다
//class AnotherClass: Student {
//
//}

UIKit의 상속구조

만약 UIButton을 사용할시 UIButton의 상위클래스인 UIControl, UIView, UIResponder, NSObject의 속성에 접근할수 있다