본문 바로가기
etc/Swift

상속

by IT learning 2021. 5. 28.
728x90

오늘은 상속에 대해 알아보았다.

 

여러 언어들에도 있는 상속은 무언가를 만들때 정말 중요한 역할을 하게 된다. 직관성 있게 만들 수 있고, 이미 만들것을 또 만들 필요가 없기 때문이다.

 

하지만 Swift의 상속은 조금 다르다. 특징을 살펴보자

 

  • 스위프트의 상속은 클래스, 프로토콜 등에서 가능하다
  • 열거형(enum), 구조체는 상속이 불가능 하다
  • 스위프트는 다중상속을 지원하지 않는다
  • 이번 절에서는 클래스의 상속을 알아본다

스위프트의 상속은 클래스, 프로토콜에서 사용이 가능하다. 열거형이나 구조체에서는 사용이 불가능하고, 다중상속이 안된다. 단일 상속만 가능하다는 말이다. 이 점은 약간 의외지만 사용을 하다 보면 왜 그런지가 나올듯 싶다.

 

클래스의 상속과 재정의

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

상속을 하려는 기본적인 코드는 이렇게 되어있다. 상속받을 클래스의 이름을 클래스의 이름 옆에 붙여주고, 오버라이드 하여 사용한다.

 

기본 클래스

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

기본 클래스를 만들어보았다. 이 중에서 특징적인 것만 살펴보자.

final 키워드는 자식 클래스에서 사용할 시에 변경이 불가능하게 만들 수 있는 키워드이다. 따라서 나중에 자식 클래스에서 불러오는것까지는 가능하지만, 수정이 불가능하다.

 

타입 메서드 코드들을 보자. 타입 메서드에서는 static 키워드를 사용하여 재정의(변경)이 불가능하게 만들 수 있다. 물론 부모 클래스에서는 변경이 가능하다. 하지만 자식 클래스에서는 변경이 불가능하다.

불가능한 키워드를 알아봤으면 가능한 키워드를 알아보자. class 키워드는 재정의가 가능한 타입 메서드를 표현하는 키워드이다. 따라서 자식 클래스에서 재정의가 가능하다. 

 

마지막 아까 본 class 키워드를 사용한 메서드를 보자. 원래  class 키워드를 사용하면 재정의가 가능하다고 했지만, 앞에 final 키워드를 붙이면 static과 같은 느낌의 재정의 불가 메서드가 된다.

 

상속

// Student 라는 클래스를 만들고 person 을 상속받음
class Student: Person {
    // var name: String = "" 저장 프로퍼티는 오버라이드를 할 수 없다.
    var major: String = ""
    
    override func selfIntroduce() {
        print("저는 \(name)이고, 전공은 \(major)입니다")
    }
    
    override class func classMethod() {
        print("overriden type method - class")
    }
    
    // static을 사용한 타입 메서드는 제정의 할 수 없습니다
    // override static func typeMethod() {}
    
    // final 키워드를 사용한 메서드, 프로퍼티도 재정의 할 수 없습니다
    // override func sayHello() {}
    // override class func finalClassMethod() {}
}

위 코드는 Person 클래스를 상속받은 Student 클래스이다.

저장 프로퍼티중 name 프로퍼티는 이미 부모 클래스에서 정의 해논 것이기 때문에 오버라이드가 불가능하다.

그리고 아까 selfIntroduce 메서드는 아무런 제약이 없는 걸로 선언해놨기 때문에 오버라이드(재정의)가 가능하다.

 

또한 class 키워드가 붙은 것은 재정의가 가능하다고 했다. 따라서 classMethod 메서드는 오버라이드가 가능하다.

 

주석처리 된 것은 다 재정의가 불가능하다고 말했던 final, static, final class 이다.

 

사용

let itlearning: Person = Person()
let hana: Student = Student()

itlearning.name = "ITlearning"
hana.name = "Hana"
hana.major = "Swift"

itlearning.selfIntroduce()
//저는 ITlearning입니다
hana.selfIntroduce()
// 저는 hana이고, 전공은 Swift입니다
Person.classMethod()
// type method - class
Person.typeMethod()
// type method - static
Person.finalClassMethod()
// type method - final class


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

사용법은 간단하다. 인스턴스를 생성해 클래스를 넣어주고, 사용하면된다.

 

중간에 name, major를 정의하는 곳이 있는데, itlearning의 경우 Person을 받았기 때문에 name 만 정의가 가능하다. 

그러나 hana의 경우 Student를 받았기 때문에 major까지 정의가 가능하다.

그리고 뒤에 코드들은 각 클래스들에서 보이는 메소드들의 모습이다.

여기서 눈여겨 봐야할 것은, 나머지들은 다 상속이 불가능해 똑같은 반면,  classMethod() 메서드는 오버라이드가 가능해 Student 클래스에서 호출한 것만 오버라이드 된 값으로 나오게 된다.

728x90

'etc > Swift' 카테고리의 다른 글

옵셔널 체이닝(부제 - 갈고리 살인마)  (0) 2021.05.28
인스턴스 생성과 소멸  (0) 2021.05.28
프로퍼티 감시자  (0) 2021.05.27
프로퍼티  (0) 2021.05.27
클로저 고급  (0) 2021.05.26

댓글

IT_learning's Commit