Apple/Swift

[iOS/Swift] 오버라이딩(Overriding) 이란? (1/2)

59date 2024. 8. 26. 16:20

앞 포스팅에서 설명한 상속과 버라이딩의 공통점은 부모 클래스의 기능을 자식 클래스가 물려받는다는 것입니다.

 

 

상속은 자식 클래스가 부모 클래스의 속성과 메서드를 그대로 물려받아 사용할 수 있게 하는 것입니다. 즉, 부모 클래스에서 정의된 기능을 자식 클래스가 상속받아 재사용하는 과정입니다.

 

오버라이딩은 자식 클래스가 상속받은 부모 클래스의 메서드를 재정의하여, 부모 클래스의 기본 동작을 자식 클래스에 맞게 변경하는 것입니다. 이를 통해 자식 클래스에서 부모 클래스의 메서드가 다르게 동작하도록 할 수 있습니다.

 

 

요약하자면, 상속은 기능을 재사용하는 것이고, 오버라이딩은 기능을 재정의하는 것입니다.

 

오버라이딩 = 재정의 라고 생각하시면 됩니다. 

 

 

메서드 오버라이딩(Method Overriding)

다음 코드를 확인하면

// 부모 클래스
class Animal {
    func makeSound() {
        print("동물")
    }
}

// 자식 클래스
class Dog: Animal {
    func makeSound() { //Overriding declaration requires an 'override' keyword
        print("멍")
    }
}

상속 받은 후 "동물"에서 "멍"으로 메서드 재정의 한 모습을 확인할 수 있습니다.

하지만 위 코드는 에러가 발생하게 됩니다. 

 

에러를 확인해보면 

Overriding declaration requires an 'override' keyword  “오버라이딩 선언에는 ‘override’ 키워드가 필요합니다.”

 

상속도 잘 했고 재정의도 했지만 에러가 발생하는 이유는 override 키워드를 생략했기에 저러한 에러가 뜨는 것입니다.

에러를 해결하기 위해 override 키워드를 사용하면

// 부모 클래스
class Animal {
    func makeSound() {
        print("동물")
    }
}

// 자식 클래스
class Dog: Animal {
     override func makeSound() {
        print("멍")
    }
}

다음 코드처럼 override 키워드를 메서드 앞에 사용하시면 메서드 오버라이딩을 하실 수 있습니다.

 

출력 결과를 알아보기 위해 객체를 생성하고 메서드를 호출하면

let myDog = Dog()
myDog.makeSound() //멍

자식클래스에서 재정의한 "멍"이 출력됩니다.

 

하지만 부모 클래스의 "동물"과 자식 클래스의 "멍"을 둘 다 출력하고 싶다면?

 

오버라이딩을 하면, 부모 클래스의 메서드가 자식 클래스에서 새롭게 정의되기 때문에, 더 이상 부모 클래스의 makeSound 메서드는 호출되지 않습니다.

 

그래서 서브 클래스에서 오버라이딩을 할 때 super 키워드를 사용하여 직접 부모 클래스의 makeSound 메서드를 실행시켜 주시면 됩니다.

class Dog: Animal {
    override func makeSound() {
        super.makeSound() // 부모 클래스의 메서드 호출
        print("멍")
    }
}

super을 사용하면 슈퍼 클래스에 즉, 부모 클래스에 접근이 가능하기에 직접 접근하여 Animal 클래스의 makeSound 메서드를 호출시키면 부모 클래스와 자식 클래스 메서드를 둘 다 출력 가능하게 됩니다.

 

동일하게 객체를 생성하고 메서드를 호출하면

let myDog = Dog()
myDog.makeSound()

  동물

  멍 

부모 클래스, 자식 클래스 둘 다 출력되는 것을 알 수 있습니다.

 

 

 

만약 부모 클래스에 존재하지 않는 makeAnother 메서드에 override 키워드를 대입시킨다면?

// 부모 클래스
class Animal {
    func makeSound() {
        print("동물")
    }
}

// 자식 클래스
class Dog: Animal {
    override func makeSound() {
        print("멍")
    }

    // 존재하지 않는 메서드를 오버라이딩하려는 시도
    override func makeAnother() { // 에러 발생 : Method does not override any method from its superclass
        print("이 메서드는 부모 클래스에 없습니다.")
    }
}

당연히 에러가 발생합니다.

 

Method does not override any method from its superclass

makeAnother가 부모 클래스에 정의되어 있지 않기 때문에 재정의할 수 없다는 것을 의미합니다.

 

override 키워드는 자식 클래스에서 부모 클래스에 이미 정의된 메서드를 재정의할 때만 사용해야 합니다.

makeAnother 메서드는 부모 클래스 Animal에는 정의되어 있지 않기 때문에, 이를 오버라이딩하려고 시도하면 Swift 컴파일러는 오류를 발생시킵니다.

 

따라서 override 키워드를 사용할 때는 반드시 부모 클래스에 이미 정의된 메서드와 동일한 시그니처를 가지는 메서드에서만 사용해야 합니다.

 


 

잘못된 내용 혹은 오타가 있거나 더 좋은 내용 피드백은 언제나 환영입니다 :)