컴퓨터공학/기타 프로그래밍

[java] @Override 메소드 오버라이딩에 대한 이해

TaeGyeong Lee 2024. 1. 13. 18:49

개요

메소드 오버라이딩은, 부모 클래스에서 정의된 메소드를 재정의하는 것입니다.

 

기본

어노테이션 @Override 를 선언하여 기존 클래스의 동일한 메소드를 재정의함을 명시합니다. 아래 소스 코드는 클래스 A를 상속받는 클래스 B에서 메소드 hello()를 오버라이딩했습니다.

클래스 A에서 정의한 hello()가 아닌 클래스 B에서 정의한 hello()가 실행되었습니다.

▶ 소스 코드

class A {
    public void hello() {
        System.out.println("Hello, A");
    }
}

class B extends A {
    @Override
    public void hello() {
        System.out.println("Hello, B");
    }
}

class HelloWorld {
    public static void main(String[] args) {
       B b = new B();
       b.hello();
    }
}

▶ 출력 결과

Hello, B

 

super

오버라이딩한 메소드에서 부모 클래스의 메소드를 호출할 수도 있습니다. 메소드명 앞에 super 를 명시하여 부모 메소드를 호출할 수도 있습니다. 

아래 소스 코드는 오버라이딩한 메소드 hello() 내부에서 부모 클래스의 메소드 hello()를 호출합니다.

▶ 소스 코드

class A {
    public void hello() {
        System.out.println("Hello, A");
    }
}

class B extends A {
    @Override
    public void hello() {
        super.hello();
        System.out.println("Hello, B");
    }
}

class HelloWorld {
    public static void main(String[] args) {
       B b = new B();
       b.hello();
    }
}

▶ 출력 결과

Hello, A
Hello, B

 

override override override .. ?

하나가 아닌 두 개 이상의 조상을 가질 땐 어떻게 될까요? 똑같습니다.

▶ 소스 코드

class A {
    public void hello() {
        System.out.println("Hello, A");
    }
}

class B extends A {
    @Override
    public void hello() {
        System.out.println("Hello, B");
    }
}

class C extends B {
    @Override
    public void hello() {
        System.out.println("Hello, C");
    }
}

class HelloWorld {
    public static void main(String[] args) {
       C c = new C();
       c.hello();
    }
}

▶ 출력 결과

Hello, C

 

override super override super override .. ?

아래 코드는 어떻게 될까요? 클래스 B,C에서 메소드 오버라이딩 시 super 문법을 통해 각 클래스의 부모 메소드를 호출합니다. 

▶ 소스 코드

class A {
    public void hello() {
        System.out.println("Hello, A");
    }
}

class B extends A {
    @Override
    public void hello() {
        super.hello();
        System.out.println("Hello, B");
    }
}

class C extends B {
    @Override
    public void hello() {
        super.hello();
        System.out.println("Hello, C");
    }
}

class HelloWorld {
    public static void main(String[] args) {
       C c = new C();
       c.hello();
    }
}

▶ 출력 결과

Hello, A
Hello, B
Hello, C