프로그래밍 언어/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