본문 바로가기
Work & Study/JAVA (& 혼공자Java)

자바(Java) - 상속3 (메소드 재정의)

by a.k.a DUKI 2020. 11. 2.
728x90
반응형

자바 프로그램을 개발할때 가장 중요한 기술적인 요소 중 하나인 메소드 재정의 이다.

 

메소드 재정의(오버라이딩 overriding)

부모 클래스의 메소드가 자식 클래스에서 사용하기에 부적합할 경우 클래스에서 수정하여 사용 한는 것이다.

 

메소드 재정의 방법

  • 부모의 메소드와 동일한 시그니처(리턴타입, 메소드 이름, 매개 변수 목록)를 가져야 한다.
  • 접근 제한을 더 강하게 재정의할 수 없다.(접근제한자)
  • 새로운 예외(Exception)를 throws할 수 없다.

 

메소드가 재정의될 경우 부모 객체 메소드는 숨겨지기 때문에, 자식 객체에서 메소드를 호출하면 재정의된 자식 메소드가 호출 된다.

혼공자 유툽 참고

 

예시1) 부모 클래스

public class Calculator {
	double areaCircle(double r) {
		System.out.println("Calculator 객체의 areaCircle() 실행");
		return 3.14159 * r * r;
	}
}

자식 클래스

public class Computer extends Calculator{
	//재정의
	@Override
	double areaCircle(double r) {
		System.out.println("Computer 객체의 areaCircle() 실행");
		return Math.PI * r * r;
	}
}

메소드 재정의 테스트

public class ComputerEx {

	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.부모메소드();

유툽 혼공자 참고

예시2) super변수

public class Airplane {
	public void land() {
		System.out.println("착륙");
	}

	public void fly() {
		System.out.println("일반 비행");
	}

	public void takeoff() {
		System.out.println("이륙");
	}
}

super변수

 

public class SupersonicAirplane extends Airplane{ //Airplane 상속
	public static final int NORMAL = 1;
	public static final int SUPERSONIC = 2;
	
	public int flyMode = NORMAL;
	
	@Override
	public void fly() {
		if(flyMode == SUPERSONIC) {
			System.out.println("초음속 비행");
		}else {
			super.fly(); //Airplane 객체의 fly()메소드 호출
		}
	}
}

super변수

 

public class SupersonicAirplaneEx {

	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();
	}

}

 

 

 

 

final 클래스와 final 메소드

  • final 키워드는 클래스, 필드, 메소드를 선언할 때 사용한다.

  • 해당 선언이 최종 상태이며 수정될 수 없음을 의미 한다.

  • 클래스 및 메소드 선언에 사용할 경우 상속과 관련이 있다는 의미이다.

상속할 수 없는 final 클래스

클래스를 선언할 때 final을 클래스 앞에 붙이면 이클래스는 최종적인 클래스이므로 상속할 수 없는 클래스가 된다.

final 클래스는 부모 클래스가 될 수 없어 자식 클래스를 만들 수 없다는 것을 의미

public final class 클래스 { ... }
public final class String { ... }

//자식 클래스에서 만들 수 없다.
public class NewString extends String { ... } //오류

 

재정의할 수 없는 final 메소드

메소드를 선언할때 final을 메소드 앞에 붙이면 이 메소드는 최종적인 메소드이므로 재정의할 수 없는 메소드가 된다.

부모 클래스를 상속해서 자식 클래스를 선언할 때 부모 클래스에 선언된 final메소드는 자식 클래스에서 재정의할 수 없다는 것이다.

 

public final 리턴타입 메소드([매개변수, ...]) { ... }

예시3) 재정의할 수 없는 final 메소드

public class Car {
	// 필드
	public int speed;

	// 생성자
	public void speedUp() {
		speed += 1;
	}

	// final 메소드
	public final void stop() {
		System.out.println("차를 멈춤");
		speed = 0;
	}
}

재정의할 수 없는 final 메소드

 

public class SportsCar extends Car {
	@Override
	public void speedUp() {
		speed += 10;
	}
	
	//재정의 할 수 없음
	@Override
	public void stop() {
		System.out.println("스포츠가를 멈춤");
		speed = 0;
	}

}

stop에 오류난 것을 알수 있다. 재정의 불가

 

 


※용어 정리

  • 메소드 재정의: 부모 메소드를 자식 클래스에서 다시 정의하는 것을 말한다.

  • final 클래스: final키워드로 선언된 클래스는 부모 클래스로 사용할 수 없는 final 클래스 이다.

  • final 메소드: final키워드로 선언된 메소드는 자식 클래스에서 재정의할 수 없는 final메소드 이다.

 

본 내용은 #혼자공부하는자바 책을 참고해 공부하려 작성했습니다.

 

728x90
반응형