Programing Language/Java

[Java] 오버라이드(Override)

vinedpillar 2022. 7. 1. 00:07

오버라이드(Override)

  • 부모 클래스의 메서드를 상속하면 자식 클래스에서 메서드를 바로 사용할 수 있습니다.

  • 하지만 상황에 따라서 부모 클래스의 메서드가 자식 클래스에서 사용하기 적합하지 않을 수 있습니다.

  • 자바에서는 이 경우 부모 클래스의 메서드를 자식 클래스에서 재정의하여 사용할 수 있도록 메서드 오버라이드라는 기능을 지원하고 있습니다.

 

 

 

 

메서드 오버라이드

  • 메서드 오버라이드는 부모 클래스로부터 상속받은 메서드와 동일한 이름의 메서드를 자식 클래스에서 재정의해서 사용하는 것을 뜻합니다.

  • 유사한 기능의 메서드를 재정의하여 사용함으로써 코드의 중복을 줄이고, 메서드 종류를 단순화 시켜줍니다.

  • 메서드가 오버라이딩 되면 가상 메서드 기법에 의해 부모 클래스의 메서드는 가려지고 자식 클래스의 메서드가 우선되게 됩니다.

  • 메서드를 오버라이딩 시키기 위한 조건 조건은 아래와 같습니다.
    • 메서드의 선언부가 상위클래스의 선언부와 완전히 동일해야 합니다.
      (선언부: 반환 자료형, 메서드 이름, 매개변수)
    • 접근 제어자의 범위가 상위 클래스의 메서드보다 같거나 넓어야 합니다.
    • 상위 클래스의 메서드보다 예외를 많이 선언할 수 없습니다.
메서드 오버라이딩 예시

// 동물 클래스
public class Animal {
    public int moveSpeed(int speed) {
    	return speed;
    }
}

// 개 클래스
public class Dog extends Animal {
    // 오버라이드 했음을 알리는 애너테이션
    @Override
    public int moveSpeed(int speed) {
    	return 3 * speed;
}

// 고양이 클래스
public class Cat extends Animal {
    @Override
    public int moveSpeed(int speed) {
    	return 2 * speed;
}

// 토끼 클래스
public class Rabbit extends Animal {
    @Override
    public int moveSpeed(int speed) {
    	return 10 * speed;
}

// 실행용 클래스
public class OverrideExample {
    public static void main(String[] args) {
    	Animal animal = new Animal();
        Dog dog = new Dog();
        Cat cat = new Cat();
        Rabbit rabbit = new Rabbit();
        
        // 같은 메서드를 사용해도 모두 다른 결과 출력
        // 동물의 속도는 50입니다. 출력
        System.out.println("동물의 속도는 " + animal.moveSpeed(50) + "입니다.")
        // 개의 속도는 150입니다. 출력
        System.out.println("개의 속도는 " + dog.moveSpeed(50) + "입니다.")
        // 고양이의 속도는 100입니다. 출력
        System.out.println("고양이의 속도는 " + cat.moveSpeed(50) + "입니다.")
        // 토끼의 속도는 500입니다. 출력
        System.out.println("토끼의 속도는 " + rabbit.moveSpeed(50) + "입니다.")
    }
}

 

 

 

 

 

가상 메서드(Virtual Method)

  • 메서드는 클래스 영역(메서드 영역)이라는 별도의 메모리에 저장이 됩니다.

  • 메서드를 실행하는 것은 메서드가 저장된 메모리의 주소를 호출하는 것과 같습니다.

  • 이러한 작업의 편의를 위해 자바는 가상 메서드라는 테이블을 이용하여 메서드를 관리합니다.

  • 상속 관계에 있는 클래스에서 메서드가 재정의된다면 재정의된 메서드의 테이블이 신규로 생성되고, 다른 메서드 주소를 가지게 됩니다.

  • 만약 선언된 자료형과 인스턴스의 자료형이 다르다면 선언된 자료형보다 인스턴스 자료형의 메서드가 우선적으로 호출되게 됩니다.
재정의된 메서드의 사용

// 동물 클래스
public class Animal {
    public int moveSpeed(int speed) {
    	return speed;
    }
}

// 개 클래스
public class Dog extends Animal {
    // 오버라이드 했음을 알리는 애너테이션
    @Override
    public int moveSpeed(int speed) {
    	return 3 * speed;
}

// 고양이 클래스
public class Cat extends Animal {
    @Override
    public int moveSpeed(int speed) {
    	return 2 * speed;
}

// 토끼 클래스
public class Rabbit extends Animal {
    @Override
    public int moveSpeed(int speed) {
    	return 10 * speed;
}

// 실행용 클래스
public class OverrideExample {
    public static void main(String[] args) {
    	// 동물 클래스 변수로 개 인스턴스 생성        
        Animal a1 = new dog();
        
        // 동물 클래스로 선언했지만 생성된 인스턴스에 맞게 메서드가 적용
        // 동물의 속도는 150입니다. 출력
        System.out.println("동물의 속도는 " + animal.moveSpeed(50) + "입니다.")
    }
}