Swift 입문 | 클래스 기본 | 클래스 상속


클래스를 사용하면 무엇이 유용한 것인가. 관계가 있는 함수나 변수를 한곳에 모아 넣을 수 있다는 것도 있지만, 그 이상으로 큰 것은 “프로그램의 재사용을 쉽게 할 수있다"라는 것이다. 클래스를 복사하면 어디서나 동일한 기능을 사용할 수 있게 된다.

이 “클래스의 재사용"라는 것을 크게 확장하는 것이 “상속"라고 하는 기능이다. 상속은 이미 클래스의 모든 기능을 이어 받아 새로운 클래스를 정의하는 것이다. 즉, 이미 편리한 클래스가 있으면, 그것을 계승하여 자신의 고유한 기능을 덧붙여서 새로운 클래스를 쉽게 만들 수 있다.

상속을 사용한 클래스의 정의는 아래와 같은 식으로 작성한다.

class 클래스명:슈퍼 클래스명 {
    ...... 클래스의 내용 ......
}

상속 근원이 되는 클래스를 “슈퍼 클래스"라고 한다. 또한 그것을 계승하여 만든 클래스를 “서브 클래스"라고 한다. 서브 클래스는 슈퍼 클래스의 기능을 모두 사용할 수 있게 된다.

실제로 상속을 사용해 보자.

import Cocoa

class Helo {
    var name:String = "Taro";
    
    func say(){
        print("Hello, " + name + "!");
    }
}

class Hello:Helo {
    var name2:String = "YAMADA";
    
    func say2(){
        print("Hi," + name + "-" + name2 + "!");
    }
}

var obj:Hello = Hello();
obj.say();

obj.name = "Hanako";
obj.name2 = "TANAKA";
obj.say2();

위에 예제은 Helo 클래스를 상속한 ‘Hello’클래스를 만들어 사용하고 있다. Hello 클래스의 인스턴스에는 Hello에 추가한 name2 속성과 say2 메소드를 사용할 뿐만 아니라, 슈퍼 클래스의 Helo의 name이나 say도 사용할 수 있다.

Hello 클래스에 추가한 say2 메소드를 보면, 그 속에서 슈퍼 클래스에 있는 name 속성을 사용하는 것을 알았다. 이런 식으로 슈퍼 클래스에 있는 것은 모두 그 클래스에 있는 것으로 간주하고 사용할 수 있다.

슈퍼 클래스의 메소드 호출

아래에 또 다른 상속 샘플을 보도록 하자.

class Friend {
    var name:String
    
    init(name:String) {
        self.name = name
    }
}

class BestFriend : Friend {
    var age:Int
    
    init(name:String, age:Int) {
        self.age = age
        super.init(name:name)
    }
    
}

var you = BestFriend(name: "Taro", age: 30)
print("\(you.name) (\(you.age))")

여기에서는 Friend 클래스를 상속해서 BestFriend 클래스를 만들고 있다. 보면 알 수 있듯이, BestFriend에는 name 속성은 없지만 문제없이 동작한다. 슈퍼 클래스의 Friend에 name이 있기 때문에 BestFriend에도 작동하는 것이다.

BestFriend의 이니셜라이저에는 “super.init(name:name)“라는 문장이 있는데, 이 “super"는 슈퍼 클래스를 나타내는 키워드이다. 이렇게 하여 슈퍼 클래스인 Friend의 이니셜라이저를 호출한다. 슈퍼 클래스의 메소드는 모두 이처럼 ‘super.〇〇’라는 형태로 호출 할 수 있다.