- 메소드를 정의 할 때 같은 이름이지만 서로 다른 매개변수의 형식을 가지고있는 메소드를 여러개를 정의할 수 있는 방법
- 이름은 같지만 시그니처는 다른 메소드를 중복으로 선언 할 수 있는 방법을 메소드 오버로딩(overloading)이라고 한다.
ex)
c1.setOprands(10, 20);
c1.setOprands(10, 20, 30);
위의 것을 아래로 변경을 하고 싶다면
setOprands 함수를 변경해야 한다.
public void setOprands(int left, int right, int third){
this.left = left;
this.right = right;
this.third = third;
}
이것도 하나의 방법이지만 매개변수의 수에 따라서 메소드의 이름이 달라지는 것은 왠지 깔끔한 방법이 아닌 것 같다. 그럼 어떻게 해야 좋을까? 방법은 오버로딩 하는 것이다.
public void setOprands(int left, int right){
System.out.println("setOprands(int left, int right)");
this.left = left;
this.right = right;
}
// 메소드의 이름은 같지만 매개변수가 다르다
public void setOprands(int left, int right, int third){
System.out.println("setOprands(int left, int right, int third)");
this.left = left;
this.right = right;
//this.setOprands(left,right) left,right의 중복 제거를 위해 사용 할 수 있다.
this.third = third;
}
매개변수의 숫자에 따라서 같은 이름의, 서로 다른 메소드를 호출하고 있다는 것을 알 수 있다.
오버로딩의 규칙
매개변수가 다르면 이름이 같아도 서로 다른 메소드가 되는것이 오버로딩이다.
단 매개변수는 같지만 리턴타입이 다르면 오류가 발생
또한 매개변수의 개수는 동일하고 이름만 다르면 오류가 발생
ex )
public class OverloadingDemo {
void A (){System.out.println("void A()");}
void A (int arg1){System.out.println("void A (int arg1)");}
void A (String arg1){System.out.println("void A (String arg1)");}
//int A (){System.out.println("void A()");} 에러 발생(리턴 타입이 다름)
public static void main(String[] args) {
OverloadingDemo od = new OverloadingDemo();
od.A();
od.A(1);
od.A("coding everybody");
}
}
OverloadingDemo를 상속 받았고 OverloadingDemo클래스에 A라는 메소드가 있으므로 이것은 오버라이딩이다.
public class OverloadingDemo2 extends OverloadingDemo{
void A (String arg1, String arg2){System.out.println("sub class : void A (String arg1, String arg2)");}
// 오버라이딩
void A (){System.out.println("sub class : void A ()");}
// 오버라이딩
public static void main(String[] args) {
OverloadingDemo2 od = new OverloadingDemo2();
od.A();
od.A(1);
od.A("coding everybody");
od.A("coding everybody", "coding everybody");
}
}
overriding VS overloading
overriding - 부모 클래스의 메소드의 동작방법을 변경한다.
overloading - 같은 이름, 다른 매개변수의 메소드들을 여러개 만들 수 있다