Java : Method OverLoading, OverRiding(매서드 오버로딩, 오버라이딩)

2023. 3. 20. 15:37java


// 메서드 오버로딩(Method Loading)
//  - 같은 이름의 메서드를 다양하게 정의
//  - 메서드 복사
//  - 상속 관계 상관 없이 가능

// 메서드 오버라이딩(Method Overriding) = 상속 관계에서만 가능
//  - 상위 클래스에 정의되어있는 메서드를
//    서브 클래스에서 다시 정의하는 것을 의미
//      → 기존의 메서드를 새롭게 재 정의
//  - 오버라이딩된 메서드(하위 클래스의 메서드)가
//    우선 순위가 높기 때문에 상위 클래스의 메서드는
//    기본적으로 실행되지 않는다.
//      → 오버라이딩된 메서드를 호출하면
//        무조건 오버라이딩된 메서드가 호출
//      → 참조 변수를 기준으로 하는 것이 아닌
//        참조하는 인스턴스를 기준으로 한다.
//  - 상위 클래스의 메서드를 호출하려면 super 레퍼런스를 이용

// 메서드 오버라이딩의 조건
//  - 식별자(이름)가 일치
//  - 매개변수의 타입과 개수가 모두 일치
//  - 반환 타입 일치
//  - static 키워드 유무 일치
//  - 접근 지정자의 범위는 상위 클래스의 메서드보다
//    범위가 넓거나 같아야한다.
//      범위 : public > protected > default(생략) > private

// 메서드 오버라이딩의 조건이 맞지 않아도
// 오류가 발생하지 않는 경우가 많기 때문에
// 이를 방지가 어렵다.
//  → 이러한 도움을 주기 위한 기능
//  → @Override  = 어노테이션 중 하나
//               = 아래 메서드가 오버라이딩된 메서드임을 알리는 태그
//               = 메서드 오버라이딩의 조건을 검사를 해준다.

class SuperA {
    void print() {
        System.out.println("SuperA Class");
    }
}

class SubA extends SuperA{
    // 메서드의 선언부가 일치하면 이는 오버라이딩된 메서드이다.
    @Override
    void print() {
        //super.print(); // 상위 클래스의 print() 메서드를 호출
        System.out.println("SubA Class");
    }
   
    // 이름이 같지만 매개변수가 다르기 때문에
    // 이는 '메서드 오버로딩'이다.
    void print(int a) {
        System.out.println("SubA Class : " + a);
    }
}

class SubB extends SuperA {
    void print() {
        System.out.println("SubB Class");
    }
}


public class File01_MethodOverriding {
   
    static void print(SuperA sup) {
        // SuperA 클래스 내에 있는 메서드를 지정해서 호출하는 것이 아닌
        // 참조하고 있는 인스턴스 내에 print() 메서드를 호출
        //  → 인스턴스에 오버라이딩된 메서드가 있으면
        //    오버라이딩된 메서드를 호출한다.
        //  → 동적 바인딩(Dynamic Binding)
        //      : 프로그램 실행 도중에 값 또는 타입, 호출 메서드가
        //        변경되어 사용되는 경우
        //  ↔ 정적 바인딩(Static Binding)
        //      : 프로그램이 실행 될 때 이미 정해진 경우
        //          = 메서드 오버로딩, 일반 메서드
        sup.print();
       
        // sup.print(5);
        // → 해당 메서드는 SubA 클래스에만 정의되어있기 때문에
        //   해당 메서르를 호출하려면 다운 캐스팅을 해야한다.
    }
   
   
    public static void main(String[] args) {
       
        SuperA sp1 = new SuperA();
        SubA sb1 = new SubA();
        SubB sb2 = new SubB();
       
        sp1.print();
        sb1.print();
        sb2.print();
        System.out.println("----------------");
        print(sp1);
        print(sb1);
        print(sb2);
        System.out.println("----------------");
        sb1.print(5);
        // → SubA 클래스에만 정의되어있기 때문에
        //   프로그램 실행할 때 호출될 메서드가 결정된다.
    }
}









'java' 카테고리의 다른 글

Java : Interface(인터페이스)  (0) 2023.03.20
Java : Abstract(추상)  (0) 2023.03.20
Java : Casting(캐스팅)  (0) 2023.03.20
Java : Constructor(생성자) 2  (0) 2023.03.20
Java : Inheritance(상속)  (0) 2023.03.20