[JAVA] 메서드 오버로딩 2탄
@욕심쟁이
·2020. 8. 19. 14:39
반응형
메서드 오버로딩 - 매개변수 갯수 또는 순서가 다른 메서드)
- 매개변수의 타입이 같더라도 갯수가 다르면 오버로딩이 성립됨
→ 단, 타입이 같은 매개변수간의 순서변경은 오버로딩이 아님!
public class Ex {
public static void main(String[] args) {
OverloadingMethod om = new OverloadingMethod();
//반드시 호출하려는 메서드의 매개변수 갯수 및 타입이 일치해야함
om.print(10,20);
om.print(10,20,30);
//om.print(10,20,30,40);//!!오류발생!!
om.print2(10, "홍길동");
om.print2(10, "홍길동","이순신");
om.print2(10, "홍길동","이순신","강감찬");
om.print2(10, "홍길동","이순신","강감찬","김유신");
om.sum(1,3.14);
om.sum(3.14,1);
}
}
class OverloadingMethod{
public void print(int n1, int n2) {
System.out.println(n1 + "," + n2);
}
public void print(int n1, int n2,int n3) {
System.out.println(n1 +","+ n2 +","+ n3);
}
/*=================================================================================*/
//정수1개(count)와 문자열(name)2~4개까지 전달받는 print2()메서드 정의
public void print2(int count, String name1) {
System.out.println(count +","+ name1);
}
public void print2(int count, String name1, String name2) {
System.out.println(count +","+ name1+","+ name2);
}
public void print2(int count, String name1, String name2, String name3) {
System.out.println(count +","+ name1+","+ name2+","+ name3);
}
public void print2(int count, String name1, String name2, String name3, String name4) {
System.out.println(count +","+ name1+","+ name2+","+ name3+","+ name4);
}
/*=================================================================================*/
public void sum(int num1, double num2) {
System.out.println(num1 +"+"+ num2 +"="+ (num1 + num2 ));
}
public void sum(double num1, int num2) {
System.out.println(num1 +"+"+ num2 +"="+ (num1 + num2 ));
}
public void sum(int num1, int num2) {
System.out.println(num1 +"+"+ num2 +"="+ (num1 + num2 ));
}
//같은 데이터 타입끼리의 순서는 바꿀 수 없다! = 오버로딩 성립이 안됨!
//public void sum(int num2, int num1) {
//System.out.println(num1 +"+"+ num2 +"="+ (num1 + num2 ));
//}
}
예시)
1. 간단한 계산기(Calculator 클래스)
- calc()메서드 오버로딩
- 연산자(char opr)1개와 정수 2~4개(num1~ num4)를 전달받아 해당연산자에 맞는
연산결과를 출력하는 메서드 오버로딩
public class Test {
public static void main(String[] args) {
Calculator c= new Calculator();
c.calc('+',10,20);
c.calc('+',10,20,30);
c.calc('+',10,20,30,40);
c.calc('-',100,10); //100-10=90
c.calc('-',100,10,20); //100-10-20 =70
c.calc('-',100,10,20,30); //100-10-20-30=40
c.calc('*',10,20); //10*20=200
c.calc('*',10,20,30); //10*20*30=6000
c.calc('/',100,10); //100/10=10
c.calc('/',100,10,2); //100/10/2=5
}
}
class Calculator{
int result = 0;
public void calc(char opr, int num1, int num2) {
if(opr=='+') {
result = num1+num2;
// System.out.println(num1 + "+" + num2 +"="+ (num1+num2));
}else if(opr=='-') {
result = num1-num2;
// System.out.println(num1 + "-" + num2 +"="+ (num1-num2));
}else if(opr=='*') {
result =num1*num2;
// System.out.println(num1 + "*" + num2 +"="+ (num1*num2));
}else if(opr == '/') {
result = num1/num2;
// System.out.println(num1 + "/" + num2 +"="+ (num1/num2));
}
System.out.printf("%d %c %d = %d\n", num1,opr,num2,result);
}
public void calc(char opr, int num1, int num2, int num3) {
if(opr=='+') {
result =num1+num2+num3;
// System.out.println(num1 + "+" + num2 + "+" + num3 +"="+ (num1+num2+num3));
}else if(opr=='-') {
result =num1-num2-num3;
// System.out.println(num1 + "-" + num2 + "-" + num3 +"="+ (num1-num2-num3));
}else if(opr=='*') {
result =num1*num2*num3;
// System.out.println(num1 + "*" + num2 + "*" + num3 +"="+ (num1*num2*num3));
}else if(opr == '/') {
result =num1/num2/num3;
// System.out.println(num1 + "/" + num2 + "/" + num3 +"="+ (num1/num2/num3));
}
System.out.printf("%d %c %d %c %d = %d\n", num1,opr,num2,opr,num3,result);
}
public void calc(char opr, int num1, int num2 , int num3 , int num4) {
if(opr=='+') {
result =num1+num2+num3+num4;
// System.out.println(num1 + "+" + num2 + "+" + num3 + "+" + num4 +"="+ (num1+num2+num3+num4));
}else if(opr=='-') {
result =num1-num2-num3-num4;
// System.out.println(num1 + "-" + num2 + "-" + num3 + "-" + num4 +"="+ (num1-num2-num3-num4));
}
System.out.printf("%d %c %d %c %d %c %d = %d\n", num1,opr,num2,opr,num3 ,opr,num4,result);
}
}
중복코드 예시)
public class Ex2 {
public static void main(String[] args) {
WalkBad wb = new WalkBad();
wb.walk();
wb.walk(2);
wb.walk(2,"cm"); //m로 변환
wb.walk(2,"m");//cm로변환
wb.walk(2,"inch"); //계산불가능한 단위라고 가정
System.out.println("================================");
//하나의 메서드에서 다른메서드 호출을 통해
//중복 코드를 제거할 수 있으며
//중복코드를 제거하면 유지보수성이 향상
WalkGood wg = new WalkGood();
wg.walk();
wg.walk(10);
wg.walk(10, "cm");
}
}
class WalkBad{
//사람의 한걸음(보폭)의 이동거리 출력
public void walk() {
System.out.println("100cm 이동!");
}
//사람 걸음 수에 다른 이동거리 출력
public void walk(int step) {
System.out.println(step * 100 +"cm이동!");
}
//사람걸음수에 따른 이동거리를 지정한 단위에 따라 inch 변환 후 출력
public void walk(int step, String unit) {
//ex) 2걸음 = 100 * 2 = 200cm /2.5한 결과를 출력
//switch - case문을 사용하여 단위판별("cm" or "inch")
switch (unit) {
case "cm":
System.out.println(step * 100 +"m 이동");
break;
case "m":
System.out.println(step / 100 +"cm 이동");
break;
default:
System.out.println("알 수 없는 단위이므로 이동 불가!");
break;
}
}
}
class WalkGood{
//오버로딩 된 메서드끼리 수행할 작업이 중복되는 경우
//하나의 메서드에서 다른 메서드를 호출하여
//필요한 데이터를 전달하므로써 중복되는 코드를 제거할 수 있다!
//사람의 한걸음(보폭)의 이동거리 출력
public void walk() {
// System.out.println("100cm 이동!");
walk(1, "cm");
}
//사람 걸음 수에 다른 이동거리 출력
public void walk(int step) {
// System.out.println(step * 100 +"cm이동!");
//동일한 step*100계산과 "cm이동!"메세지를 출력하는 코드를
//step, unit파라미터를 전달받는 메서드 호출을 통해 중복 제거 수행
walk(step, "cm");
}
//사람걸음수에 따른 이동거리를 지정한 단위에 따라 inch 변환 후 출력
public void walk(int step, String unit) {
//ex) 2걸음 = 100 * 2 = 200cm /2.5한 결과를 출력
//switch - case문을 사용하여 단위판별("cm" or "inch")
switch (unit) {
case "cm":
System.out.println(step * 100 +"m 이동");
break;
case "m":
System.out.println(step / 100 +"cm 이동");
break;
default:
System.out.println("알 수 없는 단위이므로 이동 불가!");
break;
}
}
}
중복코드 예시2)
public class Test2 {
public static void main(String[] args) {
Rectangle r = new Rectangle();
r.cal(10);
System.out.println();
double result = r.cal(10);
System.out.println("정사각형의 넓이 : " + result);
double result2 = r.cal(10,20);
System.out.println("직사각형의 넓이 : " + result2);
System.out.println();
}
}
class Rectangle{
//사각형 한변의 길이를 전달받아 정사각형 넒이 계산
// public double cal(double width) {
// System.out.println("사각형 가로길이 = " + width);
// System.out.println("사각형 세로길이 = " + width);
// return width * width;
// }
// //정사각형 계산코드와 직사각형 계산코드가 거의 동일하므로
// 정사각형에 필요한 가로길이(width)를 직사각형 게산 메서드 호출후
// 가로길이(width)와 세로길이(hieght)에 전달하면 코드중복제거됨
public double cal(double width) {
//cal(width,hieght)메서드를 호출하여
//가로길이를 두매개변수에 전달하면 직사각형 계산과 동일하므로
//계산된 결과를 리턴받아 다시 리턴
return cal(width, width);
}
public double cal(double width, double height) {
System.out.println();
System.out.println("사각형 가로길이 = " + width);
System.out.println("사각형 세로길이 = " + height);
return width * height;
}
}
반응형
'IT > JAVA' 카테고리의 다른 글
[JAVA] 생성자(Constructor) (0) | 2020.08.21 |
---|---|
[JAVA] 메서드 오버로딩 3탄 (0) | 2020.08.19 |
[JAVA] 메서드 오버로딩 1탄 (0) | 2020.08.19 |
[JAVA] 접근제한자(Public, Protected, Private, Default) (0) | 2020.08.18 |
[JAVA]멤버변수(필드) (0) | 2020.08.12 |