본문 바로가기

Dev.BackEnd/JAVA

[JAVA] 5. 오버로딩과 오버라이딩




Chapter 5. 오버로딩(Overloading)과 오버라이딩(Overriding)

이름도 비슷한 두 개는 완전히 다른 개념이다.

객체 지향적으로 설계하기 위해서는 반드시 알아야만 하는 개념이다.


오버로딩(overloading)
클래스에 메소드를 정의할 때, 같은 이름이지만 서로 다른 매개변수의 형식을 가지고 있는 메소드를 여러개 정의하는 것
매개변수의 선언형태가 다를 때 동일한 이름의 메소드를 정의할 수 있는 것.
단 반환형이 다른 것은 메소드 오버로딩이 성립되지 않는다.
중복되는 부분을 어떻게 처리할 것인가가 또 문제가 된다.
this를 이용해도 중복되는 출력을 낳는다.
code>
class A
{
  int a;
  int b;

  pubic void methodA(){

  }

  public void methodB(){

  }

  public void methodB(int a){

  }
}

methodB가 오버로딩 된 것을 볼 수 있다.
생성자도 오버로딩의 대상이 된다.
생성자 또한 특수한 형태의 메소드이기 때문이다.
생성자의 오버로딩으로 인해서 하나의 클래스를 기반으로
다양한 형태의 인스턴스 생성이 가능하다.

하지만 생성자는 인스턴스의 생성과정에서만 자동으로 호출될 뿐,
그 이외의 영역에서는 명시적으로 호출할 수 있는 대상이 아니다.
그래서 this라는 키워드가 등장하게 된다.
생성자 내에 한해서 오버로딩 된 다른 생성자의 호출을 허용하는 것이다.
this는 인스턴스 자신을 의미하는 키워드이다.

this를 통해 접근하는 것은 인스턴수 변수와 인스턴스 메소드이기 때문이다. 



오버라이딩(overriding)
상위 클래스에서 정의한 메소드를 하위 클래스에서 다시 정의한다.
메소드의 이름과 반환형, 그리고 매개변수의 선언까지 완전히 동일해야 한다.

어떤 특정 메소드에 대해 그 기능을 덮어쓰기하여 하위 클래스만의 독자적인 메소드를 필요로 하는 경우에 사용한다.
즉 상속의 기본적인 기능은 상위 클래스에서 정의되어 있는 메소드에 또 다른 메소드를 추가한다였는데
여기에서 더 나아가
'그 상위 클래스의 메소드를 수정한다'이다.<재정의>
오버라이딩을 하게 되면 상위 클래스에서 정의되었던 메소드는 무시가 된다. (인스턴스 내에서만)

오버라이딩을 한 문장으로 표현해보자면
어떤 상위 클래스를 상속하고 있는 하위 클래스에서
상위 클래스에서 이미 정의하고 있는 메소드를
자신의 필요에 맞게 재정의 하는 것을 의미한다.
즉, 이미 정의되어 있는 메소드를 덮어쓰기 한다는 의미로 해석할 수 있다.

오버라이딩을 하기 위한 조건으로는
상위 클래스에서 메서드를 정의한 그대로 모두 다 똑같이 써줘야 한다는 것이다.
'그대로 모두 다 똑같이'는
메소드의 이름, 반환형, 매개변수의 선언(매개변수의 데이터 타입, 개수, 입력 순서)까지 모두를 의미한다.
이 모두를 메소드의 서명(signature)라고 한다.

여기서 또 한발자국 더 나아가서,
상속은 새로운 메소드를 추가하는 것이었다.
그 상위 클래스에서 사용했던 메소드를 다 사용하고 거기에 추가적인 사항을 덧붙이는 경우는?
그 메소드를 덮어쓰기 하기 전에 상위 클래스의 메소드를 가져와서 거기에다가 덧붙이면 되지 않을까?
이 때, super를 사용한다. 
class B extends A
{
  public void methodA(int a){

  }
  
  public void methodA(int a, int b){

  }
}




Overriding vs Overloading
두 개념을 비교하기 위해 위에서 정의한 두 클래스를 Main에서 호출해보겠다.
class Main
{
     B e = new B( );
      e.methodA( ); //class A의 메소드 호출
      e.methodA(20); //class B의 메소드 호출 : 오버라이딩(class B 가 덮어쓰기)
      e.methodA(10,20); //class B의 메소드 호출 : 오버라이딩(class B 가 덮어쓰기)
      e.methodB(10); //class B의 메소드 호출 : 오버로딩(class A 내부에서)
}

그냥 아예 다른 개념이라는 것을 알 수 있다.





Chapter 5. The End