프로그래밍 언어/JAVA
[JAVA] 메소드 재정의(Override)
김곰댕
2021. 7. 6. 16:17
728x90
메소드 재정의(Override)
부모 클래스의 상속 메소드를 수정해서 자식 클래스에서 재정의하는 것을 말한다.
메소드 재정의 조건
- 부모 클래스의 메소드 선언부와 동일해야 한다.
- 접근 제한을 더 강하게 오버리딩 할 수 없다.
(public을 default나 private으로 수정할 수 없다. / 반대로 default는 public으로 수정할 수 있다.)
새로운 예외(Exception)을 throws 할 수 없다.
@Override 어노테이션
컴파일러에게 부모 클래스의 메소드와 선언부가 동일한지 검사토록 지시한다.
정확한 메소드 재정의를 위해 붙여 주는 것이 좋다.
public class Computer extendsCalculator
{
@Override //아래의 메소드가 부모에 정확히 정의되어 있는지 검사
double areaCircle(double r)
{
System.out.println("Computer 객체의 arearCircle() 실행");
return Math.PI * r * r
}
}
메소드 재정의 효과
부모 메소드는 숨겨지는 효과 발생
- 재정의된 자식 메소드가 실행
예제)
package sec04.exam01_overriding;
public class Calculator
{
double areaCircle(double r)
{
System.out.println("Calculator 객체의 areaCircle() 실행");
return 3.14159 * r * r;
}
}
package sec04.exam01_overriding;
public class Computer extends Calculator
{
@Override //오버라이드 어노테이션을 붙임 ( 컴파일러에게 제대로 작성했는지 확인하기 위해 )
double areaCircle(double r)
{
System.out.println("Computer 객체의 areaCircle() 실행");
return Math.PI * r * r;
}
}
package sec04.exam01_overriding;
public class ComputerExample
{
public static void main(String[] args)
{
int r = 10;
Calculator calculator = new Calculator();
System.out.println("원면적 :" +calculator.areaCircle(r));
System.out.println();
Computer computer = new Computer();
System.out.println("원면적 :" +computer.areaCircle(r));
}
}
부모 메소드 사용(super)
메소드 재정의는 부모 메소드를 숨기는 효과
자식 클래스에서는 재정의된 메소드만 호출된다.
super(...) : 부모의 생성자를 호출 / super : 상속에서 부모 객체를 나타내는 것 -> 둘이 다른것
자식 클래스에서 수정되기 전의 부모 메소드를 호출하고자 할 경우 super를 사용
(자식클래스 안에서만 사용가능)
super는 부모 객체를 참조 (참고 : this는 자신 객체를 참조)
super.부모메소드();
예제)
package sec04.exam02_super;
public class Airplane
{
public void land()
{
System.out.println("착륙합니다.");
}
public void fly()
{
System.out.println("일반비행입니다.");
}
public void takeOff()
{
System.out.println("이륙합니다.");
}
}
package sec04.exam02_super;
public class SupersonicAirplane extends Airplane
{
public static final int NORMAL = 1;
public static final int SUPERSONIC = 2;
public int flyMode = NORMAL;
@Override
public void fly()
{
/*
//부모의 메소드 내용을 활용하면서 새로운 내용을 추가
super.fly();
System.out.println("초음속 비행 모드로 변경합니다.");
System.out.println("초음속 비행합니다.");
*/
if(flyMode == SUPERSONIC) //flyMode의 값이 SUPERSONIC이면
{
System.out.println("초음속 비행합니다.");
}
else //아니면
{
super.fly(); //부모 메소드를 호출
}
}
}
package sec04.exam02_super;
public class SupersonicAirplaneExample
{
public static void main(String[] args)
{
SupersonicAirplane sa = new SupersonicAirplane();
sa.takeOff();
sa.fly();
sa.flyMode = SupersonicAirplane.SUPERSONIC;
sa.fly();
sa.flyMode = SupersonicAirplane.NORMAL;
sa.fly();
sa.land();
}
}
728x90