본문 바로가기

별걸다하는 IT/프로그래밍언어

[C/C++, java 등 언어 공통] Overriding 재정의, 오버라이딩이란?

[C언어, C++언어 완전 정복! 강의 목차 링크]

오버라이딩은 오버로딩이랑 단어도 비슷해서 자주 비교해서 출제되요

그러니까 오버라이딩 보기전에 오버로딩이 헷갈리시다면 오버로딩 게시글을 보고 오는 것을 추천드려요.

 

오버라이딩 들어가기 전에 확실히 잡고 있어야 할 상속 개념~

 

Overriding 오버라이딩이란?

오버라이딩은 상속의 개념에서 자연스럽게 넘어가면 이해하기 편해요

저번 게시글에서 메이플 캐릭터를 예시로 상속에 대해서 얘기했었어요

오버라이딩은 결국 상속을 좀 더 편리하게 사용하기 위해 나온거랍니당

 

저번시간에 예시로 들은 코드를 다시 가져올게요 

class 캐릭터 {
   void move() { this.speed = 10; } //대강~ 움직이는 속도가 10이라는 코드가 이렇다 합시다
   void jump() {}
   void sit() {}
}
class 전사 : public 캐릭터 {}
class 도적 : public 캐릭터 {}

자 부모 클래스 캐릭터와 자식 클래스 전사와 도적이 있습니다.

그런데 좀 생각해보니 도적은 보통 민첩해서 휙휙 날라다니니 걷는 속도가 더 빠르지 않나요?

지금은 부모인 캐릭터 클래스로부터 물려받아서 전사나 도적이나 둘다 속도가 10이잖아요! (자식이라 똑같이 물려받으니까!)

도적에게만 움직이는 속도를 높여주고 싶다! 이런 경우가 있겠죠. 이럴 때 필요한 게 overriding 오버라이딩 즉 재정의 기능입니다.

 

Overriding은 사전적 의미로

1. 다른 무엇보다 더 중요한, 최우선시 되는

Override 는

1. …보다 더 중요하다 2. 기각[무시]하다

라는 뜻을 가지고 있어요. 

 

즉 부모 속성은 무시하구 내 속성을 적용할 수 있게 해줘~ 이게 바로 오버라이딩입니다.

오버라이딩은 부모가 가지고 있는 함수를 재정의 함으로써 적용시킬 수 있어요.

 

중간광고하나만 달고 갈게요! 개념을 이해하는데 도움이 되었다면 꾸욱 ↓ 

 

이어서~구글에서 정리가 아주 잘된 비교짤을 가져왔어요 

 

자 오버라이딩을 볼게요 (오버로딩은 전 포스팅에서 상세하게 다뤘으니 생략할게요~ 그림으로 기억 되살리기)

hound (사냥개) 가 있고 Dog(개)가 있어요 당연히 사냥개는 개의 한 종류니까 부모가 개가 되겠죠?

 

개의 공통적인 특성 중에 bark(짖다) 기능이 있고 당연히 사냥개는 짖는 걸 물려받아서 할 수 있어요.

근데! 부모 클래스에 짖는 기능에는 woof~라고 짖는다고 구현했는데 사냥개 짖는 소리를 들어보니 bowl~이렇게 짖네요!

사냥개에게 부모인 개의 짖는 행위는 물려받되, 부모꺼를 무시하고 내 짖는 소리를 새로 적용하고 싶어요! 이런 상황인거죠.

 

 

그러면 저렇게 부모와 똑같은 함수를 작성해준 후, 안에 자식에게 맞는 코드를 새로 작성해줍니다. 그림에서는 woof를 bowl로 바꿔주었어요. 이렇게 수정을 위해서도 또는 아예 새로운 기능을 덮어버리는 용도로도 오버라이딩이 사용됩니다.

하여튼~ 이렇게 바꿔주게 되면, 나중에 bark함수를 호출했을 때, 

Hound hound = new Hound();
hound.bark();

결과 값은 woof가 아닌, bowl이 됩니다!

즉 오버라이딩 장점은 잘 만들어진 클래스를 상속 받아서 일부 메소드만 수정(재정의) 해 사용할 수 있다는 것~! 

 

 

오버로딩은 이렇게 함수나 메서드를 쌓아올려도 매개변수 타입에 따라 또는 매개변수의 개수에 따라 자동적으로 구분되는거라면 오버라이딩은 있던 함수를 새로고침하는 거 즉 나한테 맞게 커스터마이징해서 쓰는 거~

부모나 조상 클래스가 가지고 있는 함수를 불러오고 싶을 때는 super라는 키워드를 사용해서 불러올 수도 있습니다.

class Hound extends Dog{
    public void bark(){
        System.out.print("보통 강아지 짖는 소리: ");
        super.bark();
        System.out.print("내가 짖는 소리는 bowl");
    }
}

오버라이딩은 이렇게 특정 자식 클래스에게 부모/조상 클래스를 무시하고 자신의 기능을 우선시 하기 위해서 쓰이지만

추상클래스와 찰떡으로, 개발시 재정의를 강제함으로써 기준을 세울 수 있게 해주는 또 다른 이점을 제공하기도 해요

 

 

그거는 추상클래스 다룰 때 한 번 더 언급하도록 할게요

 

조상 클래스의 메서드를 자손 클래스에 맞게 변경할 수 있게 하는 것이 오버라이딩이다.

 

도움이 됐다면 공감 꾸욱~