메서드 다중 정의
동일한 이름의 파라미터가 다른 메서드를 여러 번 정의하는 것
비슷한 기능을 수행하지만 전달받은 데이터 타입이 다른 경우, 파라미터만으로 구분되는 동일한 이름의 메서드를 여러 개 정의
메서드 시그니처(이름, 리턴타입, 파라미터, 접근제한자) 중 파라미터를 제외한 나머지는 동일하게 정의
-> 메서드 호출 시점에 전달되는 데이터만으로 각 메서드가 구분되어야 함
< 메서드 오버로딩 규칙 (택1) >
1. 메서드 파라미터의 데이터타입이 달라야 함
2. 메서드 파라미터의 개수가 달라야 함
public static void main(String[] args) {
OverloadingMethod om = new OverloadingMethod();
om.add(10, 20);
om.add(15.2, 3.14);
om.add(10, 20, 30);
}
class OverloadingMethod {
public void add(int num1, int num2) {
System.out.println(num1 + num2);
}
public void add(double num1, double num2) {
// 데이터타입이 다르기 때문에 같은 이름으로 메서드 생성 가능
System.out.prinln(num1 + num2);
}
public void add(int num1, int num2, int num3) {
// 파라미터의 개수가 다르기 때문에 오버로딩 가능
System.out.println(num1 + num2 + num3);
public void add(int i, int j) {
// 오류 발생!
// 데이터타입이 달라야지
// 변수명만 다를 경우 오버로딩 불가능
}
public void add(int num1, int num2) {
return num1 + num2;
// 오류 발생!
// 리턴타입만 다를 경우 오버로딩 불가능
}
}
동일한 작업을 수행하는 코드들의 중복 발생
-> 특정 메서드의 코드를 수정해야 하는 경우 동일 코드를 여러 번 수정해야하는 번거로움 발생
= 코드의 유지보수성 나쁨
< 해결책 >
오버로딩 된 메서드에서 또 다른 오버로딩된 메서드를 호출하여 중복되는 작업을 대신 처리하도록 할 수 있다
- 메서드 호출 시 자신의 전달받은 파라미터 다시 전달
- 클래스 내의 다른 메서드를 호출하여 코드 재사용
최대 3명까지 초대 인원에 대한 이름을 입력받아 출력하는 print() 메서드 정의
- 단, 입력되지 않은 이름은 "없음"으로 출력
public static void main(String[] args) {
}
class PrintClass {
public void print() {
print("없음", "없음", "없음");
// println을 이용하여 직접 출력하는 것이 아니라
// print() 메서드를 이용하여 대신 출력
}
public void print(String name1) {
print(name1, "없음", "없음");
}
public void print(String name1, String name2) {
print(name1, name2, "없음");
}
public void print(String name1, String name2, String name3) {
System.out.println("초대 멤버 : " + name1 + ", " + name2 + ", " + name3);
// 모든 파라미터를 전달받는 메서드는 자기 자신을 직접 호출 할 수 없고
// 반드시 직접 작업을 수행해야만 한다!!!!!!
}
}
메서드 오버로딩과 동일
생성자 호출 시 다양한 형태의 파라미터값을 전달하여 객체를 다양하게 초기화 하는 목적
public static void main(String[] args) {
Person p = new Person("김경민", 20);
p.showPersonInfo();
person p2 = new Person("김경민", "대한민국", 20);
p2.showPersonInfo();
}
class Person {
String name;
String nation;
int age;
public Person() {
// 기본 생성자 정의
}
public Person(String name, int age) {
// 파라미터 두 개를 전달받아 초기화하는 생성자 정의
nation = "대한민국";
// 국가를 대한민국으로 고정
this.name = name;
this.age = age;
}
public Person(String name, String nation, int age) {
// 파라미터 세 개를 전달받아 초기화하는 생성자 정의
this.name = name;
this.nation = nation;
this.age = age;
}
public void showPersonInfo() {
System.out.println("이름 : " + name);
System.out.println("국적 : " + nation);
System.out.println("나이 : " + age);
}
}
< 생성자 오버로딩 단축키 >
Shift + Alt + S -> O