[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