메소드 오버라이딩
메소드 오버라이딩
메소드오버라이딩은 슈퍼 클래스와 서브 클래스의 메소드 사이에서 발생하는 관계이며,
슈퍼클래스의 메소드를 동일한 이름으로 서브클래스에서 작성하는 것을 말한다.
메소드 오버라이딩은 다음 제약 조건을 가진다.
-
메소드 오버라이딩은 슈퍼클래스 메소드와 같은이름, 같은 리턴타입, 같은 매개변수를 갖는 메소드를 작성해야한다.
-
슈퍼클래스의 메소드의 접근 지정자 보다 접근의 범위가 좁아 질 수 없다.
<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/>