백엔드/JAVA_이론공부

JAVA_메서드 오버라이딩

반 불혹 2022. 9. 18. 20:59

메서드 오버라이딩

이전에 설명한 오버로딩과는 전혀 다른 개념이다. 

오버로딩은 같은 이름을 가진 여러게의 메서드가 들어오는 변수에 따라 다르게 작동되는 것을 의미 하면, 오버라이딩은 같은 이름을 가진 메서드가 서로 다른 클래스 안에 있는 경우, 사용되는 클래스 안의 메서드로 덮어 써진다. 

또 뭔말이냐고?

코드를 보면서 설명하면 쉽다.

코드예시

class Vehicle {
    void run() {
        System.out.println("Vehicle is running");
    }
}

public class Bike extends Vehicle { // Vehicle 클래스 상속
    void run() {
        System.out.println("Bike is running"); // 메서드 오버라이딩
    }

    public static void main(String[] args) {
        Bike bike = new Bike();
        bike.run();
    }
}

// 출력값
"Bike is running"

위의 코드를 보면 Vehicle 클래스에 run 메소드가 있는 것과, 상속받은 Bike 클래스에도 run 메소드가 있는 것을 볼 수 있다.

Bike bike = new Bike();로 객체를 생성 하고, bike.run();으로 메서드를 실행 시키면 

Bike 클래스의 run 메소드가 작동된다. 

원래 Vehicle 클래스에 run이 정의되어있지 않느냐? 할 수 있는데, 상속받은 Bike에 run을 또 정의 하면서 해당 메서드를 덮어씌운 것이라고 이해하면 쉽다.

이를 메서드 오버라이딩이라고 한다. 

위의 예시에서 Bike bike = new Bike(); 뿐 아니라 상위클래스를 이용한 정의 Vehicle  bike = new Bike();으로 정의 후 bike.run();를 실행해도 오버라이딩 된 결과가 나온다

메서드 오버라이딩에는 조건이 있다.

  1. 메서드의 선언부 (메서드 이름, 매개변수, 반환타입)이 상위 클래스(메서드 이름, 매개변수, 반환타입)와 일치해야 한다.

  2. 접근 제어자의 범위가 상위클래스의 메서드보다 같거나 넓어야 한다. 

  3. 예외는 상위 클래스의 메서드보다 많이 선언 할 수 없다.

TIP : 일일히 선언하고, run을 쓰는게 힘들다면 배열과 반복문을 이용해서 해결 가능하다.

// 배열로 한번에 관리하기

Vehicle[] vehicles = new Vehicle[] { new Bike(), new Car(), new MotorBike()};
for (Vehicle vehicle : vehicles) {
		vehicle.run();
}

// 출력값
Bike is running
Car is running
MotorBike is running

향상된 배열로 객체를 생성하고, 향상된 for문으로 메서드를 반복해서 돌린다.

 

'백엔드 > JAVA_이론공부' 카테고리의 다른 글

JAVA_캡슐화, 패키지, import  (0) 2022.09.18
JAVA_super, super()  (0) 2022.09.18
JAVA_상속  (0) 2022.09.18
JAVA_내부 클래스  (0) 2022.09.18
JAVA_this(), this  (0) 2022.09.18