오버라이드(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) + "입니다.")
}
}
'Programing Language > Java' 카테고리의 다른 글
[Java] 오버로딩(Overloading) (0) | 2022.07.04 |
---|---|
[Java] 클래스의 다형화(Polymorphism) (0) | 2022.07.01 |
[Java] 논리 연산자(Logical Operators) (0) | 2022.06.29 |
[Java] 클래스 형 변환(Class Casting) (0) | 2022.06.28 |
[Java] 클래스 상속(Inheritance) (0) | 2022.06.27 |