package ex_overloading;
public class Ex2 {
public static void main(String[] args) {
/*
* 메서드 오버로딩과 코드의 재사용
*
*/
WalkBad wb = new WalkBad();
wb.walk();
wb.walk(2);
wb.walk(2, "m"); // m로 변환
wb.walk(2, "cm"); // cm 그대로 출력
wb.walk(2, "inch"); // 계산 불가능한 단위!
System.out.println("============================");
WalkGood wg = new WalkGood();
wg.walk();
wg.walk(2);
wg.walk(2, "m");
// => 하나의 메서드에서 다른 메서드 호출을 통해 중복 코드를 제거할 수 있으며
// 중복 코드를 제거하면 유지보수성이 향상!
}
}
class WalkGood {
// 오버로딩 된 메서드끼리 수행할 작업이 중되는 경우
// 하나의 메서드에서 다른 메서드를 호출하여
// 필요한 데이터를 전달함으로써 중복되는 코드를 제거할 수 있다!
// 사람의 한 걸음의 이동 거리 출력
public void walk() {
// System.out.println("100cm 이동!");
walk(1, "cm");
}
// 사람 걸음 수에 따른 이동 거리 출력
public void walk(int step) {
// System.out.println(step * 100 + "cm 이동!");
walk(step, "cm");
}
// 사람 걸음 수에 따른 이동 거리를 지정한 단위에 따라 변환 후 출력
public void walk(int step, String unit) {
// ex) 2 걸음, m => 100 * 2 = 200cm / 100 = 2m 결과를 출력
// switch ~ case문을 사용하여 단위 판별("cm" or "m")
switch (unit) {
case "cm" :
System.out.println(step * 100 + "cm 이동!");
break;
case "m" : // step * 100 결과를 m로 변환하기 위해 / 100
System.out.println(step * 100 / 100 + "m 이동!");
break;
default :
System.out.println("알 수 없는 단위이므로 이동 불가!");
}
}
}
class WalkBad {
// 사람의 한 걸음의 이동 거리 출력
public void walk() {
System.out.println("100cm 이동!");
}
// 사람 걸음 수에 따른 이동 거리 출력
public void walk(int step) {
System.out.println(step * 100 + "cm 이동!");
}
// 사람 걸음 수에 따른 이동 거리를 지정한 단위에 따라 변환 후 출력
public void walk(int step, String unit) {
// ex) 2 걸음, m => 100 * 2 = 200cm / 100 = 2m 결과를 출력
// switch ~ case문을 사용하여 단위 판별("cm" or "m")
switch (unit) {
case "cm" :
System.out.println(step * 100 + "cm 이동!");
break;
case "m" : // step * 100 결과를 m로 변환하기 위해 / 100
System.out.println(step * 100 / 100 + "m 이동!");
break;
default :
System.out.println("알 수 없는 단위이므로 이동 불가!");
}
}
}
연습
package ex_overloading;
public class Test2 {
public static void main(String[] args) {
/*
* 사각형(Rectangle) 넓이 계산하는 클래스
* cal() 메서드 작성
* 정사각형을 계산하는 메서드 => 매개변수 1개 (리턴타입 : double)
* 직사각형을 계산하는 메서드 => 매개변수 2개 (리턴타입 : double)
*
*/
Rectangle r = new Rectangle();
double result = r.cal(10);
System.out.println("정사각형 넓이 : " + result);
double result2 = r.cal(10, 20);
System.out.println("직사각형 넓이 : " + result2);
}
}
class Rectangle {
// 사각형 한변의 길이를 전달받아 정사각형 넓이 계산
// public double cal(double width) {
// System.out.println("사각형 가로 길이 = " + width);
// System.out.println("사각형 세로 길이 = " + width);
//
// return width * width;
//
// }
// 정사각형 계산 코드와 직사각형 계산 코드가 거의 동일하므로
// 정사각형에 필요한 가로길이를 직사각형 계산 메서드 호출 후
// 가로길이와 세로길이에 전달하면 코드 중복 제거됨
public double cal(double width) {
// cal(width, height) 메서드를 호출하여
// 가로 길이를 두 매개변수에 전달하면 직사각형 계산과 동일하므로
// 계산된 결과를 리턴받아 다시 리턴
return cal(width, width);
}
// 사각형 가로, 세로 길이를 전달받아 직사각형 넓이 계산
public double cal(double width, double height) {
System.out.println("사각형 가로 길이 = " + width);
System.out.println("사각형 세로 길이 = " + height);
return width * height;
}
}