Swift 입문 | 클래스 기본 | 메소드 오버라이드(override)

상속을 이용하면 이미 있는 클래스에 새로운 기능을 추가할 수 있는 것은 알았다. 하지만 그것만으로는 부족한다. 이미 있는 클래스의 기능을 변경할 수 있어야 한다.

여기에는 ‘오버라이드(override)‘라는 기능을 사용한다. 오버라이드는 슈퍼 클래스에 있는 메소드를 재정의하는 기술이다. 이것은 메소드의 정의를 다음과 같이 작성하면 된다.

override func 메소드명() {...}

처음에 override를 붙이는 것으로, 슈퍼 클래스의 메소드를 새롭게 정의된 메소드로 덧쓰기를 한다. 이렇게 하면, 그 메소드를 호출했을 때의 동작을 변경할 수 있다.

오버라이드를 사용하는 경우, 메소드명뿐만 아니라 인수와 반환 값도 정확하게 슈퍼 클래스의 메소드와 동일해야 한다.

아래에 실제 사용 예제를 보도록 하자.

import Cocoa

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

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

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

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

이것은 이전에 언급한 예제를 이용하여 say 메서드를 재정의하는 형태로 변경한 것이다. say 메소드를 호출하면 Helo 클래스에있는 say 대신에 Hello에서 재정의되는 say가 호출되는 것을 확인할 수 있다.

오버라이드 상세

상속을 이용하면 슈퍼 클래스의 속성과 메소드를 그대로 사용할 수 있다. 예를 들어 슈퍼 클래스의 기능을 서브 클래스에서 변경하려는 생각도 있을 것이다. 그럴 때 사용되는 것이 ‘오버라이드’이다.

오버라이드는 슈퍼 클래스에 있는 기능을 서브 클래스에서 덮어 변경하는 것이다. 예를 들어 슈퍼 클래스 ‘A’라는 메소드가 있었을 때, 그 서브 클래스에서 “A"를 호출하면 슈퍼 클래스에 있는 A라는 메소드가 그대로 실행된다. 상속을 했기 때문이다.

그럼, 서브 클래스에 똑같은 ‘A’라는 메소드가 있다면 어떻게 될까? 그러면 서브 클래스에서 “A"를 호출하면, 서브 클래스에 추가한 A 메소드가 호출하고, 슈퍼 클래스에 있는 A는 더 이상 호출되지 않을 것이다. 이것이 오버라이드 개념이다.

오버라이드하는 메서드는 메서드의 시작 부분에 ‘override’라는 수식자를 지정한다. 또한 메소드명, 인수 , 반환 값은 모두 동일해야 한다. 어떤 거라도 다르면, 그것은 “다른 메소드"라고 판단되어서 오버라이드가 되지 않는다.

아래에 또 다른 오버라이드 예제를 보도록 하자.

class Friend {
    var name:String
     
    init(name:String) {
        self.name = name
    }
     
    func printData() {
        println("\(self.name)")
    }
}
 
class BestFriend : Friend {
    var age:Int
     
    init(name:String, age:Int) {
        self.age = age
        super.init(name:name)
    }
     
    override func printData() {
        println("\(self.name) (\(you.age))")
    }
}
 
var you = BestFriend(name: "Taro", age: 30)
you.printData()

여기에서는 printData라는 메소드를 하위 클래스에서 오버라이드 한다.