코딩

Day08 - 자바 메소드 오버로딩 가독성의 문제 해결

Ledlaputa 2020. 1. 6. 12:30

오늘은 오버로딩에 대해서 살펴 보겠습니다. 오버로딩은 메소드 중복이라고도 합니다. 

형식만 다른 메소드인경우 동일한 메소드의 이름으로 사용할 수 있는 방법입니다. 

코드의 가독성을 문제를 해결하기 위해 자바에서 동일한 이름을 중복해서 사용할 수 있도록 해준 것입니다. 


Overloading 

클래스의 구조와 형식

public class OverloadingTest {
     public static void main(String[] args) { //main method  (사장)
            azejava();
            azejava2(300,200,500);
     }// main-end

     private static void azejava2(int i, int j, int k) { // azejava2  method - 2형식
           System.out.println(i+j+k);
     }

     private static void azejava() { // azejava method (비서) - 1형식
           System.out.println("오늘도 열공");
     }
     
}// class-end

main()와 azejava()는 모두 class{}안에 위치한다. 

azejava(), azejava2(..)식으로 늘어나면 가독성의 문제가 발생한다. 

c언어 참조 (가독성의 문제 예시)

  • atoi() : alphabet to int : "3" --> 3 / 자바의 Integer.parseInt()와 동일
  • atof() : alphabet to float : "34.1" --> 34.1 /  
  • atol() : alphabet to long : 

가독성의 문제가 생겨서 자바에서 해결 방안을 만들었다. --> 메소드 중복(오버로딩)

public class OverloadingTest {
     public static void main(String[] args) {
            azejava();
            azejava(300,200,500); // 함수 이름을 azejava로 동일하게 사용 ,메소드(함수) 중복
            azejava(32.6, 78.7, 8); // 함수 이름과 인자의 수가 3개로 동일하나, 타입이 틀리다. 중복가능
     }

     }
     private static void azejava() {
           System.out.println("오늘도 열공");
     }

     private static void azejava(int i, int j, int k) { //개수)이름이 같으나 인자수가 틀리다. 
           System.out.println(i+j+k);
     }

     private static void azejava(double d, double e, int k) { //타입) 이름과 인자가 동일하나 타입이 틀리다.  
           System.out.println(d+e+k);
     }

}

메소드(함수) 중복 (Method Overloading)

  • 가독성의 해결을 위해 자바에서 동일한 이름을 중복해서 사용 할 수 있도록 해준다.

메소드 중복 조건

1) 메소드 이름이 같아야 한다. 

2) 중요: 인자의 갯수가 다르거나(or) 또는 인자의 Type이 달라야한다. 

  • 개수 : azejava()=0개, azejava(300,200,500)=3개
  • 타입 : azejava(300,200,500), azejava(32.6, 78.7, 8) 인자의 타입이 틀리다. 


연습문제 

Scanner로 입력받은 초를 "00시간00분00초"로 출력하는 프로그램을 작성하세요

시간이 0시간이나거 분이 0분이면 출력 결과에는 나오지 않는다. 

azejava(초)형식을 사용하시오 

코드

public class Test001 {
     public static void main(String[] args) {
           
           int sec= azejava(); //입력 받기 메소드
            azejava(sec); //초 계산하기 메소드
     }
     
     //초 계산하기 메소드
     private static void azejava(int sec) {
           
           int min=sec/60; // 시간을 구하기 위해 분을 구함
           int hr=min/60; // 분을 60으로 나눠 시간을 구한다. 실제  시간
           int sec1=sec%60; // 분을 구하고 남은 초의 수로. 실제 초
           int min1=min%60; // 시간을 구하고 남은 분의 수로. 실제  분
           
           System.out.println(sec+"초는 ");
           if (hr==0 && min1!=0) { // 시간이 0인 경우 
                System.out.print(min1+"분 "+sec1+"초");
           }
           else if (hr==0 && min1==0) { // 시간과 분이 0인 경우 
                System.out.print(sec1+"초");
           }
           else { // 모두 나오는 경우 
                System.out.print(hr+"시간 "+min1+"분  "+sec1+"초");
           }
           System.out.println("입니다.");
     }
     
     // 초 입력받기 메소드
     private static int azejava() {
           Scanner sc1= new Scanner(System.in);
           
           System.out.println("초를 입력하세요");
           int sec1=sc1.nextInt();
           return sec1;
     }
}

받은 수를 60나눠 분을 계산1 (나머지가 초) 

계산1을 다시 60으로 나눠 시간구함 (나머지가 분)