본문 바로가기

카테고리 없음

7_1 상속_메소드재정의(Overriding)

어떤 부모 클래스는 자식 클래스가 사용하기에 적합하지 않을 수 있다. 

이 경우 상속된 일부 메소드는 자식클래스에서 다시 수정 할 수 있다. 

=메소드 재정의 = overriding

 


-메소드가 재정의되었다면 부모 객체의 메소드는 숨겨진다.

자식 객체에서 메소드를 호출하면 재정의된 자식 메소드가 호출된다. 

class Parent {

void method1(){}

void method2(){}

}

 

class Cild extends Parent {

@Overrid

method2(){ 재정의된 메소드 }

}

 

class ChileExample{

public static void main(String[] args){

child.method1(); =>①호출

child.mehtod2(); =>③호출 ②는 숨겨짐

}

}

 

 

 


메소드 재정의 규칙

1. 부모의 메소드와 동일한 시그너처

(리턴 타입, 메소드 이름, 매개 변수 목록)를 가져야 한다. 

 

2. 접근 제한을 더 강하게 재정의 할 수 없다. 반대는 가능. 

public -> default/private(X)

default -> default/public(O)

 

3. 새로운 예외를 throw 할 수 없다. (10장에서 공부)

 

 

 


이클립스의 재정의 메소드 자동생성

1. 자식 클래스에서 재정의 메소드를 작성할 위치로 입력 커서를 옮김

2. [Source] - [Override/Implement Methods] 메뉴를 선택

3. 부모 클래스에서 재정의될 메소드를 선택하고 OK

 


예시

public class Calculator {
	double areaCircle(double r) {
		System.out.println("Calculator 객체의 areaCircle() 실행");
		return 3.14159 * r * r;
				//3.14159는 정밀한 계산을 위해 오버라이드 할 것임
	}
}

 

//자식클래스
public class Computer extends Calculator{

	@Override	//메소드 재정의인지 컴파일러가 확인시켜줌
	double areaCircle(double r) {
		System.out.println("3.14...-> PI로 재정의한 Computer객체의 areaCircle() 실행");
		return Math.PI * r * r;
	}
}

 

 

public class ComputerExample {

	public static void main(String[] args) {
		int r = 10;
		
		Calculator c = new Calculator();	//부모클래스 객체생성(3.14...)
		System.out.println("원면적: " + c.areaCircle(r));
		System.out.println();
		
		Computer pi = new Computer();	//자식클래스 객체 생성(PI)
		System.out.println("원면적: " + pi.areaCircle(r));
									//재정의된 메소드를 호출한다. 

	}

}

 

실행결과:

Calculator 객체의 areaCircle() 실행
원면적: 314.159

3.14...-> PI로 재정의한 Computer객체의 areaCircle() 실행
원면적: 314.1592653589793