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라는 메소드를 하위 클래스에서 오버라이드 한다.