[JAVA] 오버라이딩과 오버로딩 (Overriding, Overloading

오버라이딩 (Overriding)

오버라이딩이란, 상속 받은 클래스에서 상위 클래스의 메서드를 재정의하는 것을 말한다. 메서드 오버라이딩을 하려면 반환형, 메서드 이름, 매개변수 개수, 매개변수 자료형이 반드시 같아야 한다.

public class OverridingPrac {
  static int sum=0;

  class A {
      public void add () {
              sum=sum+1;
              }
          }

  class B extends A{
        @Override
        public int add () {
              sum= sum=10;
             }
         }

   public static void main (String[] args) {
   A a = new A();
   B b = new B();

   a.add();
   System.out.println(sum);
   b.add();
   System.out.println(sum);

 	}
}

 /* 출력결과
 1
 11
 */

만약 여기서 객체 인스턴스를 생성하는 코드를 A a = new B();로 바꾸면 어떤 클래스의 add가 실행될까?
멤버 변수와 메서드는 선언한 클래스형에 따라 호출되니 A클래스의 add가 호출될까?

상속에서 상위 클래스와 하위 클래스에 같은 이름의 메서드가 존재할 때 호출되는 메서드는 인스턴스에 따라 결정된다. 따라서 B클래스에 있는 add가 호출된다.

이렇게 인스턴스의 메서드가 호출되는 기술을 가상메서드 (virtual method)라고 한다.

오버로딩 (Overloading)

오버로딩이란 같은 메서드 이름을 사용하지만 매개변수의 개수나 자료형, 반환형을 다르게 정의하는 것을 말한다. 오버로딩은 주로 생성자를 만들 때 볼 수 있다.

public class name {
    String firstName;
    String middleName;
    String lastName;

    public name (String fn) {
      this.firstName = fn;
      }
        
    public name (String fn, String ln) {
      this.firstName = fn;
      this.lastName = ln;
      }
      
    public name (String fn, String mn, String ln) {
      this.firstName = fn;
      this.middleName = mn;
      this.lastName = ln;
      }
  }

위 예제에서 생성자(메서드)이름은 모두 name으로 동일하지만 매개변수의 개수가 다르다.
자바 컴파일러는 사용자가 name메서드를 호출하면 호출된 name과 같은 매개변수 타입, 같은 매개변수 개수, 같은 반환형을 가지는 name을 찾아 호출한다.

좋은 웹페이지 즐겨찾기