우린 앞에서 상속이란, 부모에게 물려받은 것을 내 것처럼 쓰는 것이라고 하였습니다.
그럼 우리가 부모님에게 차를 한대 상속받았다고 가정해 보겠습니다.
우리는 이 자동차를 그대로 쓸 수도 있지만 무언가 마음에 들지 않는다면 변경할 수도 있겠죠?
이런 걸 튜닝이라고 합니다.
이렇게 마음대로 바꿔도 되냐고요?
당연하죠, 상속받았으니 내거나 마찬가지니까요!
JAVA에서는 이것을 오버라이드(Override)라고 부릅니다.
Override의 사전적 의미는 무시하다. 우선시하다 등의 의미가 있습니다.
즉, 본래 상속받은 기능을 무시하다.
또는 상속받은 부모의 기능보다 우선시하다는 뜻으로 받아들이면 좋을 것 같습니다.
자동차의 예를 코드로 다시 이야기해 보겠습니다.
부모에게 물려받을 차를 보니 run 메서드의 성능이 기대에 미치지 못합니다.
마음에 안 들면 새로 사는 방법이 있겠지만, 우리에겐 돈이 없죠.
그래서 상속을 받은 후 고쳐 타기로 마음먹습니다.
그리고 run 메서드를 수정합니다.
이렇게 부모에게 물려받은 메서드를 수정하면, 본래 부모의 메서드 보다 우선해서 사용하라는 의미로 @Override를 표시해 줍니다.
이렇게 부모 메서드를 고쳐 쓰는 것을 오버라이드 라고 합니다.
이 오버라이드를 메서드를 재 정의 한다 고도 표현합니다.
클래스다이어그램 상에서는 오버라이드를 했다고 별다른 표시를 해 주진 않습니다.
부모와 자식 클래스 간에 같은 메서드가 있으면 자식이 오버라이드 한 메서드 구나 하고 생각하면 됩니다.
이렇게 부모에게 물려받은 메서드를 고쳐 쓸 수 있는 오버라이드도 제한 사항이 있습니다.
위 코드에서 MyCar 클래스의 run 메서드는 부모의 run 메서드의 외형을 수정하려 했습니다.
없는 매개변수를 추가하려 한 거죠! 그럼 에러가 나게 됩니다.
그 이유는 final의 특징 때문인데요. final 멤버는 프로그램이 시작되면 절대로 바꿀 수 없다고 하였습니다.
즉, 오버라이드 자체가 부모의 메서드를 수정해서 쓰는 것인데 final 은 수정할 수 없으니 당연히 오버라이드를 할 수 없는 것입니다.
그래서 클래스 다이어그램에서는 final 이 붙은 멤버는 read only라고 별도로 표기하고 있답니다.
overload와 override의 차이점을 묻는 질문들을 자주 하곤 합니다.
특징과 사용방법, 도무지 공통점이 없는 이 녀석들을 왜 비교하는 질문들이 있는 걸까요?
그 이유는 바로, 이름이 비슷하기 때문입니다.
오늘 처음 만난 박철수와 이철수라는 사람이 이름이 같다는 이유로 무슨 사이인지 묻는 것과 같죠.
놀랍지만 사실입니다.
아무튼 이런 질문은 신입 면접 시 자주 묻기 때문이라도 한 번쯤 정리를 해 봅시다.
상속받은 메서드를 고쳐 쓰는 오버라이드까지 알아보았습니다.
벌써 OOP 4대 특성 중 2개를 알게 되었네요.
이제는 이름만 들어도 어려울 것 같은 다형성과, 추상화만 남아있네요.
하지만 걱정할 필요 없습니다. 이 녀석들도 앞에서 배운 캡슐화와 상속 등의 개념만큼이나 유용하면서 어렵지 않은 개념들이니까요.