[java] 오버로딩과 오버라이딩

오버로딩과 오버라이딩

메소드 오버로딩(method overloading)

메소드 시그니처(method signature)

메소드 시그니처(method signature)란 메소드의 선언부에 명시되는 매개변수의 리스트를 가르킴

메소드 오버로딩(method overloading)
  • 메소드 오버로딩(overloading)이란 같은 이름의 메소드를 중복하여 정의하는 것을 의미
  • 객체 지향 프로그래밍의 특징 중 하나인 다형성(polymorphism)을 구현하는 방법 중 하나임
메소드 오버로딩의 조건
  1. 메소드의 이름이 같아야 함
  2. 메소드의 시그니처, 즉 매개변수의 개수 또는 타입이 달라야 함
메소드 오버로딩의 예제
class Test {
    static void display(int num1) { System.out.println(num1); }
  static void display(int num1, int num2) { System.out.println(num1 * num2); }
    static void display(int num1, double num2) { System.out.println(num1 + num2); }
}

public class Method06 {
    public static void main(String[] args) {
        Test myfunc = new Test();
        myfunc.display(10);
        myfunc.display(10, 20);
        myfunc.display(10, 3.14);
      myfunc.display(10, 'a');
    }
}

//실행 결과
10
200
13.14
970

메소드 오버라이딩(method overriding)

메소드 오버라이딩(method overriding)

오버라이딩(overriding)이란 상속 관계에 있는 부모 클래스에서 이미 정의된 메소드를 자식 클래스에서 같은 시그니쳐를 갖는 메소드로 정의하는 것

오버라이딩의 조건
  1. 오버라이딩이란 메소드의 동작만을 재정의하는 것이므로, 메소드의 선언부는 기존 메소드와 완전히 같아야 함
  2. 하지만 메소드의 반환 타입은 부모 클래스의 반환 타입으로 타입 변환할 수 있는 타입이라면 변경할 수 있음
  3. 부모 클래스의 메소드보다 접근 제어자를 더 좁은 범위로 변경할 수 없음
  4. 부모 클래스의 메소드보다 더 큰 범위의 예외를 선언할 수 없음
오버라이딩 예제
class Parent {
    void display() { System.out.println("부모 클래스의 display() 메소드입니다."); }
}

class Child extends Parent {
    void display() { System.out.println("자식 클래스의 display() 메소드입니다."); }
}
 
public class Inheritance05 {
    public static void main(String[] args) {
        Parent pa = new Parent();
        pa.display();
        Child ch = new Child();
        ch.display();
        Parent pc = new Child();
        pc.display(); // Child cp = new Parent();
    }
}

//실행 결과
부모 클래스의 display() 메소드입니다.
자식 클래스의 display() 메소드입니다.
자식 클래스의 display() 메소드입니다.

오버로딩과 오버라이딩

차이점
  1. 오버로딩(overloading)은 새로운 메소드를 정의하는 것
  2. 오버라이딩(overriding)은 상속받은 기존의 메소드르르 재정의하는 것
예제
class Parent {
    void display() { System.out.println("부모 클래스의 display() 메소드입니다."); }
}

class Child extends Parent {
    // 오버라이딩된 display() 메소드
    void display() { System.out.println("자식 클래스의 display() 메소드입니다."); }
    void display(String str) { System.out.println(str); } // 오버로딩된 display() 메소드
}

public class Inheritance06 {
    public static void main(String[] args) {
        Child ch = new Child();
        ch.display();
        ch.display("오버로딩된 display() 메소드입니다.");
    }
}

//실행 결과
자식 클래스의 display() 메소드입니다.
오버로딩된 display() 메소드입니다.