article thumbnail image
Published 2020. 11. 9. 20:20
728x90
반응형

스위프트 상속(Inheritance)

상속은 클래스, 프로토콜 등에서 가능하다.
열거형, 구조체는 상속이 불가능하다.
스위프트의 클래스는 단일 상속으로, 다중 상속을 지원하지 않는다.
프로토콜의 경우 여러개를 채택할 수 있다.
상속하는 클래스는 하위클래스(subclass), 상속받은 클래스는 슈퍼클래스(superclass) 로 알려져있다.

이번에는 클래스의 상속에 대해서 공부할 예정이다.

클래스에서 상속은 다음과 같이 사용할 수 있다.

class 이름: 상속받을 클래스 이름 {
    구현부
}

클래스를 정의한 후 변수나 상수에 타입을 정해줄 때 처럼 상속을 해줄 수 있다.

예를 들어, 상속할 상위 클래스를 만들어 보았다.

class Person {
    var name: String = ""
    
    func selfIntroduce() {
        print("저는 \(name) 입니다.")
    }
    
    // final 키워드를 사용하여 재정의를 방지할 수 있다.
    final func sayHello() {
        print("Hello !!!")
    }
    
    // 타입 메서드
    // 재정의 불가 타입 메서드 - static
    static func typeMethod() {
        print("Person type method - static")
    }
    
    // 재정의 가능 타입 메서드 - class
    class func classMethod() {
        print("Person type method - class")
    }
    
    // 재정의 가능한 class 메서드라도
    // final 키워드를 사용하면 재정의 할 수 없다.
    // 메서드 앞의 static 과 final class 는 똑같은 역할을 한다.
    final class func finalCalssMethod() {
        print("Person type method - final class")
    }
}

Person 이라는 클래스를 생성하고 변수와 각 함수들을 만들어주었다.
final 키워드를 사용하면 상속받은 클래스에서의 재정의를 방지해준다. 간단하게 수정할 수 없게 한다는 것이다.
static 키워드를 사용하면 재정의가 불가능하다.
재정의가 가능한 class 메서드라고 해도 앞에 final 키워드를 사용하면 재정의를 할 수 없다.
static 과 final class 는 똑같은 역할을 하는 것을 알 수 있다.

그럼 위의 Person 클래스를 상속 받을 하나의 클래스를 생성해보았다.

// Person 을 상속받는 Student
class Student: Person {
    var major: String = ""
    
    override func selfIntroduce() {
        print("저는 \(name) 이고, 전공은 \(major) 입니다.")
    }
    
    override class func classMethod() {
        print("Student overriden type method - class")
    }
    
//    override func sayHello() {
//        print("hihihihi")
//    }
}

변수에 타입을 정해줄 때와 같이 Student 라는 클래스를 생성하고 Person 클래스를 상속해주었다.
그리고 변수를 생성하고 상속받은 Person 클래스 내부에 있는 메서드를 상속받아 재정의한 것을 볼 수 있다.

Person 이라는 클래스에서 static 이나 final class 로 재정의를 할 수 없는 메서드를 상속받으려고 하면 다음과 같은 에러가 발생한다.

위와 같이 final 인스턴스 메서드를 오버라이드 할 수 없다고 나온다.

잠깐, 오버라이딩과 오버로딩에 대해서 간단하게 짚고 넘어가야겠다.

오버로딩(Overloading)
같은 이름의 함수를 여러 개 정의하고 매개 변수를 다르게 해 다양한 유형의 호출에 응답이 가능하게 한다.

오버라이딩(Overriding)
상속 관계에 있는 클래스의 이미 정의된 메서드를 재정의 해 특정한 형태로 구현 가능하다.

그럼 이제 Person 클래스와 Person 클래스를 상속받은 Student 클래스를 사용해보자.

let jay: Person = Person()
let su: Student = Student()

이렇게 각 클래스 타입으로 상수 2개를 만들어보았다.

// Person 내 변수 name 설정
jay.name = "jay"

// Student 내 변수 name, major 설정
su.name = "su"
su.major = "Swift"

// 각 클래스의 메서드를 호출하는 것을 확인 할 수 있다.
jay.selfIntroduce()
// 저는 jay 입니다.
su.selfIntroduce()
// 저는 su 이고, 전공은 Swift 입니다.

Person.classMethod()
// Person type method - class
Person.typeMethod()
// Person type method - static
Person.finalCalssMethod()
// Person type method - final class

Student.classMethod()
// Student overriden type method - class
Student.typeMethod()
// Person type method - static
Student.finalCalssMethod()
// Person type method - final class

각 클래스 타입을 정의했기 때문에 각자의 변수를 설정해준다.
그리고 Student 클래스에서 오버라이딩을 통해 재정의 했기 때문에
selfIntroduce() 메서드의 출력 결과가 다르게 나오는 것을 확인할 수 있다.

그리고 final 키워드와 static class 키워드를 사용하면 재정의가 불가능하지만
Student 클래스에서 상속받아 호출은 할 수 있기 때문에 위에서 확인한 것과 같이 출력할 수 있다.

 

상속에 대해서는 Java를 공부하면서 상속에 대해서 어느 정도는 이해가 있어서
스위프트의 상속에 대해 공부할 때도 별 다른 점은 없어 보여서 쉽게 이해할 수 있었던 것 같다.

 

- 참고 사이트 - 

www.edwith.org/boostcamp_ios/lecture/11309

 

[LECTURE] 21. 상속 (💎생각해보기) : edwith

생각해보기 동물을 주제로 클래스의 상속관계를 만들어 봅시다. 어떤 기준으로 동물을 분류할 수 있을까요? 개구리는 헤엄도 칠 수 있고, 뛸 수도 있습니다. 오리는 헤엄도 치고 날 수... - 부스

www.edwith.org

dev200ok.blogspot.com/2020/03/overloading-overriding.html

 

[swift] 오버로딩(overloading)과 오버라이딩(overriding)

Devlog 와 TIL 입니다. 개발을 하면서 알게된 내용을 다루고 있습니다.

dev200ok.blogspot.com

zeddios.tistory.com/386

 

Swift ) Inheritance(상속)

안녕하세요 :) Zedd입니다. 오늘은 Inheritance!! 상속이죠. 상속은 정말 많이 썼지만..정리를 해볼려고 합니당 시작할게요! Inheritance(상속) Inheritance. 이제부터 상속이라고 언급할게요. Swift에서 클래

zeddios.tistory.com

 

728x90
반응형
복사했습니다!