본문 바로가기
교육, 학습/스프링 입문을 위한 자바 객체지향의 원리와 이해

JAVA의 OOP - 오버라이딩되면 하위클래스의 메서드가 우선된다

by 개발하는 경제학도 2022. 2. 4.

책 소개

현재 읽고 있는 '스프링 입문을 위한 자바 객체 지향의 원리와 이해' 중의 일부를 적은 내용입니다.


오버 라이딩

메서드 재정의로 상위 클래스에서 상속받은 메서드를 하위 클래스에서 재정의한 것이다.

상위 클래스의 메서드와 동일한 메서드 이름을 가지며, 같은 인자 리스트를 가진다.

 

[상위 클래스]

public class Human {
	pulic void Hi() {
    	System.out.println("Hi");
    }
}

 

[하위 클래스]

public class Korean extends Human {
	// 메서드 오버라이딩(= 재정의)
    pulic void Hi() {
    	System.out.println("안녕하세요";
    }
}

 

[실헹]

public class Human {
	pulic static void main(String[] args) {
    	
        // 1번: 상위 클래스의 객체 생성
        Human h1 = new Human();
        // 상위 클래스의 메서드 호출
        h1.hi(); // Hi
        
        // 2번: 하위 클래스의 객체 생성
        Korean k1 = new Korean();
        k1.hi(); // 안녕하세요

        // 3번: 상위 클래스의 타입으로 하위 클래스의 객체 생성
        Human k2 = new Korean();
        k2.hi(); // 안녕하세요 
    	
    }
}

 

[출력 결과]

Hi
안녕하세요
안녕하세요

 

오버 라이딩 시 메서드의 우선순위

오버 라이딩된 Hi메서드가 어떻게 출력되는지 확인해본다.

 

코드에서 1번에서는 당연히 Human클래스의 Hi메서드를 호출해서 Hi가 출력된다.

 

2번, 3번은 오버 라이딩된 Hi메서드를 호출하는 상황이다.

2번에서는 하위 클래스에서 재정의된 메서드가 호출되는 것을 알 수 있다.

 

하지만 3번은 조금 헷갈릴 수 있다.

3번에서는 '상위 클래스 타입'으로 하위 클래스의 객체를 생성했기 때문이다. 이런 경우에도 하위 클래스에서 오버 라이딩된 메서드가 호출된다. 따라서 2번과 마찬가지로 '안녕하세요'가 출력된다.

댓글