안녕하세요, 여행벌입니다.
오늘은 자바 메소드 오버로딩에 대해서 알아보겠습니다.
메소드 오버로딩
한 클래스 내에 동일한 이름의 메소드를 둘 이상 정의하는 것이 가능할까요?? 자바는 "메소드 오버로딩"을 지원해주기 때문에, 매개변수만 다르다면 동일한 이름의 메소드를 여러개 정의하는 것이 가능합니다!
메소드를 호출하면 다음 두 가지 정보를 참조하여 메소드를 찾게 됩니다.
● 메소드의 이름
● 메소드의 매개 변수 정보
메소드의 이름은 동일하지마, 매개 변수 정보가 다르다면 다른 메소드로 인식하는 것이 "메소드 오버로딩" 입니다.
정리하면, 메소드의 이름이 같아도 매개변수 선언이 다르면 메소드 호출문의 전달인자를 통해서 호출된 메소드를 구분할 수 있습니다. 따라서 매개변수의 선언이 다르다면 동일한 이름의 메소드 정의를 허용하는데, 이를 "메소드 오버로딩" 이라 합니다.
예시를 통해서 메소드 오버로딩에 대해서 다뤄보겠습니다.
package Hello;
class Calculate{
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a+ b;
}
}
public class test{
public static void main(String args[]) {
Calculate cal = new Calculate();
System.out.println(cal.add(2, 5));
System.out.println(cal.add(2.5, 3.4));
}
}
Calculate 클래스 안에 같은 이름의 메소드 add를 2개 정의했습니다. 하지만, 매개변수가 위의 add는 int 형이고 아래 add는 double형으로 다르므로 "메소드 오버로딩"이 적용되어 문제 없이 클래스가 정의되는 것을 확인할 수 있습니다.
그러면 다음과 같이 매개변수의 수가 다르면 어떻게 될까요?
package Hello;
class Calculate{
public int add(int a, int b) {
return a + b;
}
public int add(int a, int b, int c) {
return a+ b + c;
}
}
public class test{
public static void main(String args[]) {
Calculate cal = new Calculate();
System.out.println(cal.add(2, 5));
System.out.println(cal.add(2, 3, 4));
}
}
매개변수의 수가 달라도 매개변수의 정보가 다르므로 마찬가지로 "메소드 오버로딩"이 문제 없이 적용됩니다.
즉, 매개변수의 수 또는 매개변수의 형(type)이 다르면 메소드 오버로딩이 성립합니다.
그럼 매개변수가 아닌 반환형이 다른 경우에도 메소드 오버로딩이 성립할까요??
package Hello;
class Calculate{
public int add(int a, int b) {
return a + b;
}
public double add(int a, int b) {
return double(a+ b);
}
}
public class test{
public static void main(String args[]) {
Calculate cal = new Calculate();
System.out.println(cal.add(2, 5));
System.out.println(cal.add(2, 3));
}
}
마찬가지로 Calculate 클래스 내에 같은 이름의 메소드 add를 2개 정의했는데, 매개변수는 같지만 반환형을 다르게 해보았습니다.
이때는 매개변수 정보가 같으므로 메소드를 구분할 수 없습니다. 따라서, "메소드 오버로딩"이 성립하지 않고, 먼저 정의된 int 를 반환하는 add 함수만 정의가 진행됩니다.
반환형이 다른 경우에는 메소드 오버로딩이 성립하지 않습니다.
그러면 저번 포스팅에서 다뤘던 생성자 메소드는 오버로딩이 될까요??
생성자도 일종의 메소드이므로 오버로딩이 적용됩니다! 따라서, 다음과 같이 여러 종류의 생성자를 만들 수 있습니다.
class Student{
private int IDNumber;
private String StudentName;
public Student(int IDN, String Name) {
IDNumber = IDN;
StudentName = Name;
}
public Student(int IDN) {
IDNumber = IDN;
StudentName = "이름이없습니다.";
}
public Student(String Name) {
IDNumber = 0;
StudentName = Name;
}
}
인스턴스를 생성할 때, 어떤 값을 매개변수로 넘기냐에 따라 호출되는 생성자가 달라집니다.
이처럼 자바에서는 메소드의 이름과 매개변수 정보를 기반으로 메소드를 호출하므로, 이름이 같더라도 매개변수 정보가 다르다면 동일한 이름의 메소드를 여러 개 정의할 수 있습니다.
'Computer Language > JAVA' 카테고리의 다른 글
[JAVA] #14 자바 String 클래스 특징 및 메소드 정리(2) (0) | 2020.05.28 |
---|---|
[JAVA] #13 자바 String 클래스 특징 및 메소드 정리(1) (0) | 2020.05.28 |
[JAVA] #11 자바 클래스 변수와 클래스 메소드(static) (0) | 2020.05.27 |
[JAVA] #10 자바 접근 수준 지시자(public, protected, private, default) (0) | 2020.05.26 |
[JAVA] #9 자바 클래스 생성자(Constructor) (0) | 2020.05.26 |