- 동일한 이름의 파라미터가 다른 메서드를 여러번 정의하는 것
- 비슷한 기능을 수행하지만, 전달받은 데이터 타입이 다른 경우 메서드 이름을 각각 따로 정의하지 않고, 동일한 이름으로 파라미터만으로 구분되는 메서드를 여러 개 정의하는 것
- 주의사항! 메서드 시그니쳐(이름, 리턴타입, 파라미터, 접근제한자) 파라미터를 제외한 나머지는 동일하게 정의함 => 외부에서 메서드를 호출하는 시점에 이름이 동일한 메서드 간에 전달되는 데이터(파라미터값) 만으로 각 메서드가 구분되어야 함
메서드 오버로딩 규칙(택1)
- 메서드 파라미터의 데이터타입이 달라야함
- 메서드 파라미터의 개수가 달라야함
NormalMethod nm = new NormalMethod();
nm.addInt(10, 20); // (int, int)
nm.addDouble(1.5, 3.14); // (double, double)
} // main() 메서드 끝
} // Ex 클래스 끝
class NormalMethod {
// 두 수를 전달받아 덧셈 결과를 출력하는 메서드 정의
// 1. int형 정수 2개를 전달받을 경우
public void addInt(int num1, int num2) {
System.out.println(num1 + num2);
}
// 2. double형 실수 2개를 전달받을 경우
public void addDouble(double num1, double num2) {
System.out.println(num1 + num2);
}
// 일반적으로 메서드명도 식별자에 해당되므로 중복 불가
// 따라서, addInt()와 addDouble() 메서드는 하는 일을 같지만
// 서로 다른 파라미터를 전달받으므로 다른 이름으로 정의했음
// => 메서드 정의 시 메서드명을 달리해야하므로 호출 시 구분 불편할 수 있음
public void printInt(int num) {
System.out.println(num);
}
public void printString(int str) {
System.out.println(str);
}
}
class OverloadingMethod {
// 오버로딩 기능을 활용하여 두 수를 전달받아 덧셈 결과를 출력하는 메서드 정의
// => 동일한 이름의 파라미터 타입만 서로 다른 메서드를 여러 번 정의
// 1. 정수 2개를 전달받아 덧셈 수행
public void add(int num1, int num2) {
System.out.println("add(int, int) 호출됨!");
System.out.println(num1+num2);
}
// 2. 실수 2개를 전달받아 덧셈 수행
public void add(double num1, double num2) {
System.out.println("add(double, double) 호출됨!");
System.out.println(num1+num2);
}
// 3. 정수 3개를 전달받아 덧셈 수행
public void add(int num1, int num2, int num3) {
System.out.println("add(int, int, int) 호출됨!");
System.out.println(num1+num2+num3);
}
}
// 오버로딩이 적용된 메서드를 정의한 OverloadingMethod 인스턴스 생성
OverloadingMethod om = new OverloadingMethod();
// =>호출 시 파라미터를
// 오버로딩 메서드 중에서 파라미터가 일치하는 메서드가 자동 호출됨
// => 단, 메서드 호출 시점에서 각 메서드가 구분되어야 오버로딩 성립됨!
om.add(10, 20);
om.add(1.5, 3.14);
om.add(1,2,3);
} // main() 메서드 끝
} // Ex 클래스 끝
package method_overlodading;
public class Test {
public static void main(String[] args) {
// PrintOverloading 클래스 인스턴스 생성
// 객체의 print() 메서드를 호출하여 정수, 실수, 문자열 전달
PrintOverloading po = new PrintOverloading();
po.print(1);
po.print(3.14);
po.print("땅콩이");
po.print();
}
}
// 정수, 실수, 문자열 데이터 1개를 전달받아 출력하는 print() 메서드 오버로딩
// 파라미터가 없는 print() 메서드까지 정의
class PrintOverloading {
public void print() { // 파라미터가 없는 메서드도 오버로딩에 해당됨
System.out.println();
}
public void print(int data) {
System.out.println(data);
}
public void print(double data) {
System.out.println(data);
}
public void print(String data) {
System.out.println(data);
}
}
계산기 클래스 만들기
* 계산기(Calculator) 클래스 정의
* - 정수를 전달받아 덧셈만 수행하는 add() 메서드 정의
* 1. 정수 2개를 전달받아 덧셈 결과 출력
* 2. 정수 3개를 전달받아 덧셈 결과 출력
* 3. 정수 4개를 전달받아 덧셈 결과 출력
*/
Calculator cal = new Calculator();
cal.add(1, 2); //3
cal.add(1, 2, 3); //6
cal.add(1, 2, 3, 4); //10
} // 메인 메서드 끝
} // 클래스 끝
class Calculator {
public void add(int num1,int num2) {
System.out.println(num1 + num2);
}
public void add(int num1,int num2, int num3) {
System.out.println(num1 + num2 + num3);
}
public void add(int num1,int num2, int num3, int num4) {
System.out.println(num1 + num2 + num3 + num4);
}
public void cal(char opr, int num1, int num2) {
if(opr == '+') {
System.out.printf("%d+%d=%d\\n", num1, num2, (num1+num2));
} else if (opr=='-') {
System.out.printf("%d-%d=%d\\n", num1, num2, (num1-num2));
}
}
}
메서드 오버로딩 문제점
- 동일한 작업을 수행하는 코드들의 중복이 발생! => 만약, 특정 메서드의 코드를 수정 해야할 경우 동일한 코드를 여러 번 수정해야 하는 번거로움이 발생할 수 있음 => 코드의 유지보수성이 나쁘다!
[해결책]
- 오버로딩 된 메서드에서 또 다른 오버로딩 된 메서드를 호출하여 중복되는 작업을 대신 처리하도록 할 수 있다! => 메서드 호출 시 자신이 전달받은 파라미터를 다시 전달 => 이처럼 클래스 내의 다른 메서드를 호출하여 사용 = 코드의 재사용
package method_overlodading;
public class Ex2 {
public static void main(String[] args) {
/*
* 메서드 오버로딩 문제점
* - 동일한 작업을 수행하는 코드들의 중복이 발생!
* => 만약, 특정 메서드의 코드를 수정 해야할 경우
* 동일한 코드를 여러 번 수정해야하는 번거로움이 발생할 수 있음
* => 코드의 유지보수성이 나쁘다!
*
* [해결책]
* - 오버로딩 된 메서드에서 또 다른 오버로딩 된 메서드를 호출하여
* 중복되는 작업을 대신 처리하도록 할 수 있다!
* => 메서드 호출 시 자신이 전달받은 파라미터를 다시 전달
* => 이처럼 클래스 내의 다른 메서드를 호출하여 사용 = 코드의 재사용
*/
PrintClass pc = new PrintClass();
pc.print();
System.out.println("------------");
pc.print("땅콩이");
System.out.println("------------");
pc.print("땅콩이", "따옹이");
System.out.println("------------");
pc.print("땅콩이", "따옹이", "땅캥이");
}
} // Ex2 클래스 끝
class PrintClass {
// 최대 3명까지의 초대 인원에 대한 이름을 입력받아 출력하는 print() 메서드 정의
// => 단, 입력되지 않은 이름은 "없음" 으로 출력
// ex) print("땅콩이", "따옹이","땅캥이") 형태로 호출시
// 초대 멤버 : 홍길동, 이순신, 강감찬 출력
// ex) print("홍길동", "이순신") 형태로 호출시
// 초대 멤버 : 홍길동, 이순신 없음 출력
// ex) print("홍길동") 형태로 호출시
// 초대 멤버 : 홍길동 없음 없음 출력
public void print() {
System.out.println("print() 메서드 호출됨!");
// System.out.println("초대 멤버 : 없음 없음 없음 ");
//print(String, String, String) 메서드를 호출하여
// 없음, 없음, 없음 문자열을 대신 출력
print("없음", "없음", "없음");
}
public void print(String name1) {
System.out.println("print(String) 메서드 호출됨!");
// 전달받음 이름(name1), 없음, 없음 문자열을 대신 출력
//print(String, String, String) 메서드를 호출하여
// System.out.println("초대 멤버 : " + name1 + " 없음 없음 ");
print(name1, "없음", "없음");
}
public void print(String name1, String name2) {
System.out.println("print(String, String) 메서드 호출됨!");
// System.out.println("초대 멤버 : " + name1+ " " + name2+ " 없음");
//print(String, String, String) 메서드를 호출하여
// System.out.println("초대 멤버 : " + name1+ name2 +"없음 ");
print(name1, name2, "없음");
}
public void print(String name1, String name2,String name3) {
System.out.println("print(String, String, String) 메서드 호출됨!");
// System.out.println("초대 멤버 : " + name1+ " " + name2+ " " + name3);
//print(String, String, String) 메서드를 호출하여
// System.out.println("초대 멤버 : " + name1 + name2 + name3 ");
print(name1, name2, name3);
// 주의! 모든 파라미터를 전달받는 마지막 메서드는
// 자기 자신을 호출하지 않고 반드시 직접 작업을 수행해야 한다!
print(name1, name2, name3); //재귀호출
}
}
'JAVA' 카테고리의 다른 글
[JAVA] 배열(array) (0) | 2023.09.11 |
---|---|
[JAVA] 생성자(constructor) (0) | 2023.09.11 |
[JAVA] 접근제한자 (0) | 2023.09.11 |
[JAVA] 객체지향 프로그래밍 이해하고 입출금기능 있는 은행잔고 클래스 만들기 (0) | 2023.09.11 |
[JAVA] break문과 continue문 (1) | 2023.09.11 |