오버라이딩이란, 상속 받은 클래스에서 상위 클래스의 메서드를 재정의하는 것을 말한다. 메서드 오버라이딩을 하려면 반환형, 메서드 이름, 매개변수 개수, 매개변수 자료형이 반드시 같아야 한다.
public class OverridingPrac {
static int sum=0;
class A {
public void add () {
sum=sum+1;
}
}
class B extends A{
@Override
public int add () {
sum= sum=10;
}
}
public static void main (String[] args) {
A a = new A();
B b = new B();
a.add();
System.out.println(sum);
b.add();
System.out.println(sum);
}
}
/* 출력결과
1
11
*/
만약 여기서 객체 인스턴스를 생성하는 코드를 A a = new B();
로 바꾸면 어떤 클래스의 add
가 실행될까?
멤버 변수와 메서드는 선언한 클래스형에 따라 호출되니 A클래스의 add
가 호출될까?
상속에서 상위 클래스와 하위 클래스에 같은 이름의 메서드가 존재할 때 호출되는 메서드는 인스턴스에 따라 결정된다. 따라서 B클래스에 있는 add
가 호출된다.
이렇게 인스턴스의 메서드가 호출되는 기술을
가상메서드 (virtual method)
라고 한다.
오버로딩이란 같은 메서드 이름을 사용하지만 매개변수의 개수나 자료형, 반환형을 다르게 정의하는 것을 말한다. 오버로딩은 주로 생성자를 만들 때 볼 수 있다.
public class name {
String firstName;
String middleName;
String lastName;
public name (String fn) {
this.firstName = fn;
}
public name (String fn, String ln) {
this.firstName = fn;
this.lastName = ln;
}
public name (String fn, String mn, String ln) {
this.firstName = fn;
this.middleName = mn;
this.lastName = ln;
}
}
위 예제에서 생성자(메서드)이름은 모두 name
으로 동일하지만 매개변수의 개수가 다르다.
자바 컴파일러는 사용자가 name
메서드를 호출하면 호출된 name
과 같은 매개변수 타입, 같은 매개변수 개수, 같은 반환형을 가지는 name
을 찾아 호출한다.