1. 오버라이딩

 

메서드의 오버라이딩이란 무엇인가? 네이버 사전에 따르면,

 

1) 동사 (직권을 이용하여 결정·명령 등을) 기각[무시]하다 (=overrule)

 

2) 동사 …보다 더 중요하다[우선하다]

 

3) 동사 (자동으로 진행되는 과정을) 중단시키다

 

법률 용어 같기도 하고 좀 어려운 것 같다. 자바의 메소드 오버라이딩은 상위클래스에서 물려받은 메소드를 하위클래스에서 재정의 한다는 것이다. 상위 클래스의 메소드 정의를 무시하고 코드를 다시 쓴다. 단 조건이 오버라이딩을 하려면 메소드가 똑같아야 한다. 그 기준은

 

1. 반환형(return 값)

2. 메서드 이름

3. 매개변수의 개수와 자료형(순서도 같아야함)

 

컴파일러가 재정의하려는 메소드를 특정해서 확인하기 위해서는 위의 조건이 맞아야 한다.

 

public class OOPTest2 {
	public static void main(String[] args) {
		B2 b2 = new B2();
		b2.num1 = 10;
		System.out.println(b2.newNumber(3));
		
		System.out.println("Good Day, dear my lord!");
	}
}
class A2 {

	int num1;
	String name;
	
	A2(){
		System.out.println("A2");
	}
	public int newNumber(int a) {
		return this.num1 * a;
	}
}
class B2 extends A2{	
	double realNumber;	
	B2(){
		System.out.println("B2");
	}
	/* public int newNumber(int a) {
		return this.num1 * a * 2;
	} */
}

클래스 A2의 newNumber(int a) 메소드이다. 결과값은 30이 나온다.

 

아래쪽의 주석 /* */ 을 풀고 실행하면 60이 나온다. 동일한 반환형 int 동일한 이름 newNumber 동일한 매개변수와 개수 int a 내용만 바꿔쓰면 된다.

 

@Override
public int newNumber(int a) {
return this.num1 * a * 2;

 

컴파일러는 클래스 B2를 검사하면서 이것이 오버라이드인지 알겠지만 좀더 명시적으로 컴파일러에게 정보를 줄 수도 있다. @Override 주석(Anootation) 을 사용하면 컴파일러에게 직접적으로 알려준 것이 된다. 

 

위의 코드는 B2 클래스 A2 클래스 B2인스턴스를 A2 참조변수에 할당했다. 결과는 62가 자손클래스가 오버라이드한 메소드이다. 특이한 것은 상위 클래스 A2 참조변수가 하위클래스의 오버라이드된 메소드를 호출했다.

 

그림에서 보는 것처럼 메소드의 선택은 참조변수가 아니라 메모리에 생성된 인스턴스에 따라 결정된다. B2 하위클래스의 인스턴스이기 때문에 B2의 오버라이드된 메소드를 선택한다. 오버라이드에서 기존의 선언부 형태를 엄격하게 지키는 것은 당연하다. 상위클래스에 없는 하위클래스의 멤버변수를 매개변수로 더 한다거나 하면 하위클래스보다 작은 상위 클래스에서는 참조가 안되는 변수들이 있다면 오류가 날 것이다. 

 

 

메서드 구조는 그림과 같다.

 

메서드는 멤버 변수와 달리 스택메모리에 생성되며 클래스가 상속받을때마다 생기지 않는다. 상위클래스의 메서드 주소를 공유한다.

 

java.lang.Object는 모든 클래스의 조상인데 이 클래스의 메서드 주소를 다 공유한다. 만약 Object의 메서드들을 하나라도 오버라이드했다면 그 메서드는 새로 생겨난다. 그리고 하위 클래스에서 새로 추가되는 메서드들도 새로운 공간이 필요하다. 이것을 가상 메서드 방식이라고 한다. 논리적으로 매치 시킨다.

 

상속을 하다보면 5개 6개 이상을 상속하는코드가 있는데 상속할 때 마다 모든 메서드를 새로 만드는 것은 비효율 적이다. 같은 메서드의 주소를 공유하는 시스템이 자원사용에 훨씬 유리하다, 단지 내용이 바뀌었을때 (오버라이딩 시에)는 새로 메모리 공간이 필요하다. 

공유하기

facebook twitter kakaoTalk kakaostory naver band