메소드 오버라이딩

메소드오버라이딩은 슈퍼 클래스와 서브 클래스의 메소드 사이에서 발생하는 관계이며,

슈퍼클래스의 메소드를 동일한 이름으로 서브클래스에서 작성하는 것을 말한다.

메소드 오버라이딩은 다음 제약 조건을 가진다.

  • 메소드 오버라이딩은 슈퍼클래스 메소드와 같은이름, 같은 리턴타입, 같은 매개변수를 갖는 메소드를 작성해야한다.

  • 슈퍼클래스의 메소드의 접근 지정자 보다 접근의 범위가 좁아 질 수 없다.

<br/>

<ol style="margin-left:40px">

  • 슈퍼클래스 메소드가 Public 이라면 Public

  • 슈퍼클래스 메소드가 Protected 라면 Public 또는 Protected

  • 슈퍼클래스 메소드가 Private 라면 오버라이딩 불가!

<br/>

  • static, private, final로 선언된 메소드는 오버라이딩 할 수 없다.

<br/>

<ol style="margin-left:40px">

  • static - static은 컴파일시 정의되기 때문에 불가능(하단의 동적바인딩 참고)

  • private - 상속자체가 안됨으로 오버라이딩 불가능.

  • final - 오버라이딩 할 수 없는 메소드임을 표시 했음으로 불가능.

<br/>

<br/>

<span style="color:null">동적바인딩

<span style="color:null">정적 바인딩의 반대말로, 컴파일시가 아닌 실행 시에 실행할 메소드를 결정 하는 것을 말한다.

자바는 모두 기본적으로 동적바인딩을 한다. <span style="color:null">사실 이 뜻이 그렇게 와닿지는 않으므로 쉽게 설명해보자.

<br/>

<span style="color:null">정적 바인딩을 하는 C를 예로 들어보자.

int sum(int a, int b){
 return a + b;
}

void main(){
 int c;
 c = sum(1, 2);
}

다음 코드를 컴파일 한다면, <span style="color:null">컴파일 시에 sum(1,2)이라는 명령어에 호출될 메소드는 int sum(int a, int b)로 결정하게 된다.

<br/>

동적바인딩을 통하여 오버라이딩을 보자

class SuperObject{
	public void draw() {
		System.out.println("Super!");
	}
}

public class SubObject extends SuperObject{
	
	public void draw() {
		System.out.println("Sub!");
	}

	public static void main(String[] args) {
		SuperObject obj1 = new SubObject();
		obj1.draw(); // Sub! 호출
	}
}
<br/>

다음 코드를 컴파일 한다면, <span style="color:null">컴파일 시에는 obj1.draw()라는 명령어에 호출될 메소드는 정해지지 않는다.

<span style="color:null">컴파일 후 obj.draw() 명령어가 호출되는 시점에서 메소드가 정해지게 된다. 자바는 이 호출 시점에 메소드 오버라이딩을 확인하고, SubObject의 draw() 메소드를 결정한다.

<span style="color:null">만약에 자바가 정적바인딩을 한다면, 컴파일 시에 obj1.draw() 명령어의 메소드를 SuperObject의 draw() 메소드로 결정해버릴 것이다.

<br/>

<br/>

Super , Super()

슈퍼클래스에 대한 레퍼런스를 말한다. 한가지 예시를 보면 쉽게 이해할 수 있다.

class SuperObject{
	public SuperObject(String str) {
		System.out.println("Make Super!! " + str);
	}
	
	public void draw() {
		System.out.println("Super!");
	}
}

public class SubObject extends SuperObject{
	public SubObject(String str, String str2) {
		super(str);
		System.out.println("Make Sub!! " + str2);
	}
	
	public void draw() {
		System.out.println("Sub!");
		super.draw();
	}

	public static void main(String[] args) {
		SuperObject obj1 = new SubObject("Hello", "World");
		obj1.draw(); // Sub! 호출
	}
}
<br/>

<br/>

출력값

Make Super!! Hello
Make Sub!! World
Sub!
Super!
<br/>

<br/>

<br/>

<br/>

0
이전 댓글 보기
등록
TOP