오버로딩(Overloading)과 오버라이딩(Overriding)의 차이점에 대해 설명해주세요.
오버로딩(Overloading)
은 한 클래스 내에서 같은 이름으로 정의된 메서드가 여러개 있어도 매개변수의 개수, 타입, 순서가 다르다면 이름이 같게 해도 되는 기술이다.
public class Overloading {
public static void main(String args[]) {
print();
print("Hello!");
print(10, 20);
}
public static void print() {
System.out.println("print!");
}
public static void print(String text) {
System.out.println(text);
}
public static void print(int a, int b) {
System.out.println(a);
System.out.println(b);
}
}
print!
Hello!
10
20
위의 코드를 살펴보면 동일한 메서드들이 정의되었지만 매개변수의 개수, 순서들이 다른걸 확인할 수 있다.
오버라이딩(OverRiding)
은 부모에서 상속 받은 메서드를 재정의하는 것으로 매개변수, 반환타입이 같아야하는 기술이다. 즉 상위 클래스의 메서드와 동일한 이름, 매개변수를 가지면 동작 방식을 하위 클래스에서 정할 수 있다.
public class Parent {
public void print() {
System.out.println("Parent!");
}
public void plus(int a, int b) {
System.out.println(a + b);
}
public void multiple(int a, int b, int c) {
System.out.println(a * b * c);
}
public void division(int a, int b, String str) {
System.out.println(str + " " + (a / b));
}
}
public class Child extends Parent{
@Override
public void print() {
System.out.println("Child!");
}
@Override
public void plus(int a, int b) {
System.out.println(b + a);
}
@Override
public void multiple(int a, int b, int c) {
System.out.println(c * b * a);
}
@Override
public void division(int a, int b, String str) {
System.out.println((b / a) + " " + str);
}
}
public class Overriding {
public static void main(String args[]) {
Parent parent = new Parent();
parent.print();
parent.plus(10, 20);
parent.multiple(10, 20, 30);
parent.division(10, 20, "부모 메서드에서 나누기");
System.out.println();
Child child = new Child();
child.print();
child.plus(1, 2);
child.multiple(1, 2, 3);
child.division(1, 2, "자식 메서드에서 나누기");
}
}
Parent!
30
6000
부모 메서드에서 나누기 0
Child!
3
6
2 자식 메서드에서 나누기
위의 코드를 살펴보면 Child
클래스에서 Parent
를 상속받아 하위 클래스에도 상위 클래스의 메서드와 동일한 이름의 메서드가 존재하는 걸 확인할 수 있다. 메서드의 매개변수의 개수, 순서, 반환 타입이 동일하다.
하지만 메서드 안의 내용은 재정의되어 있다.
public
으로 선언되어 있다면 재정의하는 클래스도 public
이어야 한다. 또한 상위 클래스의 메서드가 final
이나 private
로 선언되었다면 하위 클래스에서 재정의할 수 없다.