메서드 Overloading과 메서드 Overriding

메서드 Overloading

  • 하나의 클래스에 동일한 이름의 메서드가 여러개 중복 정의되는 것(단, 변수의 중복 정의는 불가능)
  • 매개변수의 개수와 타입 혹은 순서만 다르다면 동일한 이름의 메서드라도 다른 기능을 수행할 수 있다는 개념

메서드 Overloading 조건

조건 가능 여부
매개변수의 개수와 타입이 다른 경우 O
리턴 타입이 다른 경우 X
매개변수의 이름이 다른 경우 X
매개변수의 개수와 타입이 같지만, 순서가 다른 경우 O
매개변수가 형변환된 다른 타입인 경우 O

생성자 Overloading

클래스로부터 객체를 생성할 때, 필요한 변수만 적절히 조합하여 초기화하기 위해 생성자 Overloading을 지원

Java
class Employee {
    String name;    // 이름
    int age;        // 나이
    int salary;     // 급여

    // 기본 생성자
    public Employee() {
    }

    // 이름, 나이 초기화 생성자
    public Employee(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 이름, 급여 초기화 생성자
    // 매개변수 개수와 타입이 위의 생성자와 동일하므로 에러발생!
    // 따라서 순서를 바꿔줘야 함
    public Employee(int salary, String name) {
        this.salary = salary;
        this.name = name;
    }

메서드 Overriding

  • 부모 클래스에 정의된 메서드를 자식 클래스에서 수정(재정의)하여 사용하는 것
  • 부모의 메서드를 자식이 논리적으로 재정의 함
  • 부모의 메서드, 해당 부모를 상속받은 모든 자식들의 메서드가 그대로 존재
  • 단순히 자식 클래스에 새로운 메서드를 만들 경우 : 물리적 - 2개 메서드, 논리적 - 2개 메서드(2개의 메서드가 모두 실행됨)
  • 자식 클래스에서 메서드 재정의할 경우 : 물리적 - 2개 메서드, 논리적 - 1개 메서드(재정의한 메서드가 부모 메서드를 덮어써서 자신의 메서드만 실행되는 효과)

메서드 Overriding 조건

  • 메서드 명이 동일해야 함
  • 매개변수의 개수, 타입, 순서가 동일해야 함
  • 리턴 타입이 동일해야 함
  • 접근지정자는 부모보다 넓거나 같게 지정해야 함
  • 예외처리는 부모보다 작거나 같게 지정해야 함

메서드 Overloading과 Overriding

  • 메서드 Overloading : 하나의 클래스에 동일한 이름의 메서드가 여러 개 중복 정의되어 있는 것, 추가 적재
Java
class SuperClass {
    void print(String str) {
        System.out.prinln("SuperClass의 print(String s) 호출");
    }
}
class SubClass extends SuperClass {
    void print() {  // 부모 클래스 메서드와 매개변수가 다르므로 Overloading에 해당
        System.out.prinln("SubClass의 print() 호출");
    }
}

  • 메서드 Overriding : 상속 관계에서 부모가 가진 메서드가 자식 클래스에 새롭게 정의되어 있는 것, 재정의
Java
class Camera {
    String name;
    int sheets;

    public void takePicture() {
        System.out.prinln(name + "로 " + sheets + "번 찍음");
    }
}
class PolaroidCamera extends Camera {
    int batteryGage;

    public void takePicture() {  // 부모 클래스 메서드와 매개변수가 같으므로 Overriding에 해당
        System.out.prinln(name + "로 " + sheets + "번 찍음");
        // super.takePicture();  // super() 예약어를 사용할 경우 부모 클래스 메서드 상속 가능
        System.out.prinln("현재 배터리 : " + batteryGage + "%");
    }
}