자바 면접에서 정말 많이 물어보는 유형이라고 하는 오버라이딩 vs 오버로딩
이번 기회에 제대로 알아보기 위해 정리해봅니다.
부모 클래스로부터 상속받은 메서드를 자식 클래스에서 재정의하는 것을 말합니다.
상속받은 메서드를 그대로 사용할 수 있지만, 자식 클래스에서 상황에 맞게 변경(뒤집어씌운다는 개념:복제)해야 하는 경우 오버라이딩이 필요합니다.
오버라이딩은 부모 클래스의 메서드를 자식클래스 가 재정의하는 것이므로, 자식 클래스에서는 오버라이딩하고자 하는 메서드의 이름, 파라미터, 리턴값이 모두 같아야 합니다.
package test;
public class OverrigingTest {
public static void main(String[] args) {
Person person = new Person();
Man man = new Man();
Woman woman = new Woman();
person.act();
man.act();
woman.act();
}
}
class Person{
void act() {
System.out.println("dodododo");
}
}
class Man extends Person{
@Override
void act() {
// super.act();
System.out.println("zzzzzzzzzz");
}
}
class Woman extends Person{
@Override
void act() {
// super.act();
System.out.println("eeeeeeeeee");
}
}
<결과>
dodododo
zzzzzzzzzz
eeeeeeeeee
한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메소드가 있더라도 메서드 시그니쳐(매개변수의 개수,타입, 리턴타입)을 다르게하여 같은 이름을 사용해서 메소드를 정의할 수 있습니다.(확장)
메소드의 이름이 같고, 매개변수의 개수나 타입이 달라야 한다.
주의할 점
1) '리턴 값만' 다른 것은 오버로딩을 할 수 없습니다.
2) 오버로딩은 오버라이딩과 다르게 상속하는 것과는 상관이 없습니다.
3) 메서드 말고도 생성자에서도 오버로딩이 됩니다.
package test;
public class OverloadingTest {
public static void main(String[] args) {
OverloadingMethods om = new OverloadingMethods();
om.pratice();
System.out.println(om.practice(3));
om.practice("hello world!");
System.out.println(om.practice(1, 2));
}
}
class OverloadingMethods{
void pratice() {
System.out.println("pratice1");
}
// 리턴값만 다른 것은 오버로딩 허용안됨
// String pratice() {
// System.out.println("pratice1");
// return "pratice-리턴값만 다른 것";
// }
String practice(Integer num) {
System.out.println("pratice2");
return num.toString();
}
void practice(String str) {
System.out.println("practice3");
System.out.println(str);
}
String practice(Integer num1, Integer num2) {
System.out.println("pratice4");
return num1.toString() + num2.toString();
}
}
<결과>
pratice1
pratice2
3
practice3
hello world!
pratice4
12