코딩

Day 07 - 메소드

Ledlaputa 2019. 12. 27. 01:09

Method(메소드)개요

메소드는 일명 함수라 불리워진다. 쉽게 입력과 출력이 있고 들어온 값이 함수 안에서 처리되고 출력을 통해 값을 내보내는 형태이다. 

 

함수의 구성

  • 프로그램은 모듈별로 나눈다. (한번에 쭉 쓰지 않는다) main에는 긴 내용이 들어 있지 않다. 
  • 예) main에는 각종 함수들이 포함되어있어 표시를 해준다. 각각 짠 프로그램을 mian에서 합쳐서 완성 시킨다. 
  • 일을 분담할때 함수 스타일로 분담한다. main()식으로 

1. 메소드 1형식

1형식 구성

메소드 호출문 (사장) 

call();         
메소드 정의문 (비서)       

public void(or static) answer(){

   시킨일

} 

예제) 윤년 프로그램을 모듈화로 바꾸기 

public class MethodTest { // class 시작
     public static void main(String[] args) { // main의 시작
           //메소드 1형식
           yunnyeon(); // 메소드(함수) 호출문
     } // main의 끝
     
     // 메소드(함수) 정의문
     public static void yunnyeon() { // 메소드의 시작
           
           int y=2019;
           
           if (y%4==0 && y%100!=0 || y%400==0) //윤년 확인  
                System.out.println("윤년");
           else
                System.out.println("평년");
           
     } // 메소드의 끝
}// class 끝

 

윤년을 계산하는 윤년 메소드 프로그램을 제작해본다. 2019년에 대해 윤년인지 평년인지를 계산해 보는 프로그램이다. 

main메소드에서 yunnyeon(); 으로 해당 메소드를 호출한다. 

그러면 뒤에 있던 yunnyeon() { .. }메소드에서 윤년을 계산하는 프로그램을 작동시킨다. 

yunnyeon(); 메소드 호출 --> public static void yunnyeon() {...}로 --> yunnyeon()다음 문장으로 돌아옴. 

 

클래스안에 실행 메소드인 main메소드에 직접 윤년 계산 공식을 넣어 프로그램을 운영해도 된다. 하지만 이렇게 메소드로 분리하여 main외부에 위치하게 하고 해당 메소드를 필요할때 호출하는 방식이다. 

이렇게 되면 실행 메소드인 main()메소드는 보다 간결해지고 안에 속해있는 메소드는 따로 관리하면 되므로 전체적으로 가독성과 운영성을 높일 수 있게 된다. 


메소드 2형식

2형식의 구성

매소드 호출문 : 인자, 인수, argument가 있다.

kaja2(300);
메소드 정의문 : 매개변수, parameter가 있다. 

public static void kaja2(int i) {

 

메소드 2형식은 1형식과 달리 parameter라고 하는 인자 값이 추가 되었다.

기존 1형식은 main메소드 밖에 있는 메소드를 호출을 할때 해당 메소드 명을 호출하는 것 이외에 어떠한 조작도 불가능했다. 입력값을 바꾸고 싶으면 직접 해당 메소드로 가서 수정했어야 한다. 

하지만 2형식은 main메소드에서 밖의 메소드를 호출할 때 인자값을 포함할 수 있다. 

 

예제 ) 은행 입금 메소드 2형식 구현

           //메소드 2형식 main 메소드
           public static void main(String[] args) {
           bank(300); // 메소드 2형식, 인자,인수, argument가  포함되면 2형식
         }
           
           //메소드 2형식 bank 메소드 
           private static void bank(int money) { //매개변수,  parameter
                System.out.println(money+"만원 입금.");
           }

bank() 메소드를 main()메소드에서 호출한다. 이때 bank(인자값)을 넣을 수 있다. 이 인자값은 호출 시 함께 포함되어 가져가게 되고 인자값을 받아 해당 실행 구문에서 인자값을 이용할 수 있는 것이다. 

여기 예제에서는 bank(300)으로 300의 정수값을 인자값으로 가지고 있다. 

 

이때 호출을 부름 받은 메소드에서는 호출 받는 인자값에 대한 정의를 해주어야 한다. 

bank(int money) { 형태로 받게되는 인자가 int 형이라고 정의해주고 수식에서 받은 money 인자 값 (300)을 대입시켜 실행한다. 

출력은 300 만원 입금. 이라고 출력될 것이다. 

 

이렇게 main밖의 메소드를 호출하며 추가로 인자값을 함께 사용하는 형태를 메소드2형식이라고 한다. 


메소드 3형식 

3형식의 구조 

메소드 3형식은 다소 정리하고 넘어가야할 부분이 있다. 

  • 메소드 정의문(main밖의 호출되는 메소드) 이 처리한 자료를 가지고 온다. 
  • return 으로 값을 가지고 간다. (그냥 return;로 끝나면 강제 종료된다)
  • 대신 return으로 가져가는 값의 종류를 알아야한다. 
  • void는 return 값이 없을때 사용한다. 
int형 자료를 리턴할때는 반환형이 int

  private static int kaja3() {
  
Stinrg형 자료를 리턴할때는 반환형이 String

  private static String kaja3() {
  
3형식은 되돌아 올때 출발한 그자리로 다시 돌아온다. (1,2형식은 뒤로) 

kaja3();  --> String bada=kaja3(); 

3형식은 일명 return값을 가지고 있는 것이다. 
기존 1,2 형식과 차이가 무엇으로 보이나? 뒤의 인자는 1형식과 같이 없으나 대신 메소드 명앞에 void라는 것 대신에 int 나 String과 같은 자료형이 추가되어 있다.

이것은 바로 return되는 반환형의 자료형을 나타낸것이다. 그렇다면 1,2 형식에서 사용한 void는 무엇인가? 

void는 return값 즉 반환형이 없을때 사용하는 것이다.

이렇게 메소드 정의문에서 반환할 반환형에 대해서 자료형 언급을 반드시 해줘야 한다. 

 

예제) 메소드 3형식 

            //메소드 3형식
           public static void main(String[] args) {
           String bada=javaAze();// return값을 받기 위해 bada변수가 있다. 
                               //return값은 javaAze()를 지우고 대신 반환값이 들어간다. 
            System.out.println("역시"+bada); // 반환값을 받은 변수 bada를 출력
         } // main끝

           
           // 메소드 3형식 - return이 있다.
           private static String javaAze() { // 여기서 String을  반환형이라고 한다.
                System.out.println("자바와 우리반에  대하여 말한다면");
                return "최고야~~"; // 값을 가지고 가게 한다. 대신 값을 종류를 알아야 한다.
           } // 메소드 3형식 끝

위의 호출문에서  호출되는  javaAze() 메소드는 반환형이 있는 3형식이다. 

기존 1,2 형식처럼 메소드만을 호출하는게 아니라 bada라는 String변수에 javaAze의 반환 값을 받아 대입하는 것이다. 

 

1. 우선 String bada=javaAze();에서 리턴값을 받기 위한 String 자료형의 bada 변수를 선언하고 메소드를 호출하였다. 

2. javaAze() 메소드로 가서 반환형을 String javaAze() {로 선언하고 

3. 첫번째 출력 문장을 실행한다. 

4. 리턴 값인 "최고야~" 을 다시 main 메소드에서 반환한다. 

5. bada에 리턴된 "최고야~"를 대입한다. 

6. bada를 출력 한다. 

7. main 메소드가 종료된다. 

 

메소드 1,2,3형식에 대해서 이해가 되는가? 

필요에 따라 이 3가지 형식을 혹은 혼합하여 복합적으로 다양하게 사용하게 된다. 

자바는 객체지향언어로 함수형 언어와 차이점을 지니고 있다. 하지만 여전히 함수(메소드)는 매우 중요한 부분이라 메소드로 기본을 충분히 익히고 이후에 객체지향 부분에 대한 학습이 이루어져야 한다. 


 

종합 문제) BMI를 메소드 2형식+3형식으로 , kaja(키, 몸무게), 게산은 메소드 정의문, 출력은 메인 

public class MethodTest2 {
     public static void main(String[] args) {
           
        // 메소드
        double ki=aze1(); // 키입력 받기과 반환받기
        double mom=aze2(); // 몸무게 입력 받기고 반환받기
        int bmi=(int)aze3(ki, mom); // BMI 계산하고 받은 반환값을 int 바꾸기 
        String printBmi=aze4(bmi); // BMI로 출력 내용 만들기
        //결과 출력물
        System.out.println("당신의 몸무게는 "+mom+"kg이며,  당신의 키는 "+(ki*100)+"m입니다.");
        System.out.println("당신의 BMI수치는 "+bmi+" 입니다.");
        System.out.println("당신의 BMI는 "+printBmi+" 입니다.");   // 최종 결과 출력하기
    }
     
     // aze1 - 키 입력 메소드
     private static double aze1() {  
        Scanner sc2 = new Scanner(System.in);
        System.out.println("당신의 키를 센치미터로 입력하세요 : ");
        double ki = (sc2.nextFloat()/100);
        return ki;
     }
     
     // aze2 - 몸무게 입력 메소드
     private static double aze2() {  
        Scanner sc1 = new Scanner(System.in);
        System.out.println("당신의 몸무게를 입력하세요 : ");
        double mom = sc1.nextFloat();
        return mom ;
     }
     
     // aze3 - BMI 계산 메소드
     private static double aze3(double ki, double mom) {
        double bmi = mom / (ki*ki);
        return bmi;
     }
     
     // aze4 - BMI 출력 메소드
    private static String aze4(double bmi) {
       String result;
       if ( 30<= bmi) {
             result = "비만";
       }
       else if (25 <= bmi && bmi < 30)
       {
        result = "과체중";
       }
       else if(20 <= bmi && bmi < 25 )
       {
        result = "정상";
       }
       else
       {
        result = "저체중 ";
       }
       return result;
     }
  
}

결과 화면

자 이번 예제는 지금까지 해왔던 예제들에 비해 확실히 어려워 보인다. 하지만 하나씩 차근차근 살펴 보면 그리 어렵지 않게 이해되는 부분이다. 코드를 나누어서 살펴 보도록 하자 

 

1. main() 메소드

     public static void main(String[] args) {
           
        // 메소드
        double ki=aze1(); // 키입력 받기과 반환받기
        double mom=aze2(); // 몸무게 입력 받기고 반환받기
        int bmi=(int)aze3(ki, mom); // BMI 계산하고 받은 반환값을 int 바꾸기 
        String printBmi=aze4(bmi); // BMI로 출력 내용 만들기
        //결과 출력물
        System.out.println("당신의 몸무게는 "+mom+"kg이며,  당신의 키는 "+(ki*100)+"cm입니다.");
        System.out.println("당신의 BMI수치는 "+bmi+" 입니다.");
        System.out.println("당신의 BMI는 "+printBmi+" 입니다.");   // 최종 결과 출력하기
    }

우선main() 메소드를 살펴 보도록 하자. 여기에서는 메소드를 호출하고 리턴받기위해 총 4개의 변수를 선언했다. 

- 키입력 받고 반환받기 위한 double형 ki 변수와 aze1()메소드 

- 몸무게 입력 받고 반환받기 위한 double형 mom 변수와 aze2() 메소드

- BMI를 계산하고 받은 반환값을 int형으로 바꾸기 위한 int형 bmi변수와 aze3(ki, mom) 2형식+3형식 메소드 

- 그리고 받은 변수를 이용하여 출력하는 출력문으로 구성되어 있다. 

 

2. double aze1(); 메소드 

     // aze1 - 키 입력 메소드
     private static double aze1() {  
        Scanner sc2 = new Scanner(System.in);
        System.out.println("당신의 키를 센치미터로 입력하세요 : ");
        double ki= (sc2.nextFloat()/100);
        return ki;
     }

리턴값이 있는 3형식 메소드 이다. 자료형은 double이다. 키는 소수점이 나오니 정수가 아닌 실수를 사용해야 한다. 

우선 입력을 받기 위해서 Scanner메소드를 사용해야한다. (이부분은 이전에 배웠으니 잘 모르겠으면 다시한번 돌아가 복습하기 바란다) 

입력을 실수로 받고 이것을 100으로 나누어 double ki변수에 대입한다  

그리고 ki을 반환한다. main()메소드에서 aze1()의 반환값을 대입받은 ki는 aze3의 인자로 사용되며 또 아래 출력에서도 변수 값이 사용된다. 

 

3.double aze2() 메소드

     // aze2 - 몸무게 입력 메소드
     private static double aze2() {  
        Scanner sc1 = new Scanner(System.in);
        System.out.println("당신의 몸무게를 입력하세요 : ");
        double mom = sc1.nextFloat();
        return mom ;
     }

이번에는 몸무게를 입력받아 마찬가지로 반환하는 메소드이다. 키를 구하는 메소드와 동일하다 

 

4. double aze3(double ki, double mom)  메소드 

     // aze3 - BMI 계산 메소드
     private static double aze3(double ki, double mom) {
        double bmi = mom / (ki*ki);
        return bmi;
     }

BMI계산 공식은 구글링으로 찾으면 된다. BMI = 몸무게 / (cm*cm) 이다. 공식을 굳이 외울 필요는 없다. 여기에서 중요한건 BMI공식이 아니라 3형식과 2형식이 결합된 메소드 유형을 잘 확인하는 것이다. 

우선 반환값이 있는 3형식이며, 안에 인자 2개를 지닌 2형식이다. 정확이 앞에 2개의 3형식 메소드는 3형식 + 1형식이라고 해도 될 것이다. 

aze3메소드는 계산 결과로 bmi값을 반환해준다. 그리고 두개의 인자값 double ki와 double  mom을 가지고 있다. 이 인자값은 aze1()과 aze2()의 반환값을 받은 변수인 것이다. 

이 두개의 변수로 BMI값에 대한 계산을 마치고 반환값을 main에 보내면 이제 계산된 BMI값으로 정상인지 비만인지를 판단하는 메소드를 실행해야 한다. 여기에서는 우리가 이전에 배운 if조건문을 사용하게 된다. (드디어 실전) 

 

5. String aze4(double bmi)  메소드 

     // BMI 출력 메소드
    private static String aze4(double bmi) {
       String result;
       if ( 30<= bmi) {
             result = "비만";
       }
       else if (25 <= bmi && bmi < 30)
       {
        result = "과체중";
       }
       else if(20 <= bmi && bmi < 25 )
       {
        result = "정상";
       }
       else
       {
        result = "저체중 ";
       }
       return result;
     }

마찬가지로 3형식+2형식이다.  String값을 반환하며, 인자값으로 위에서 계산된 BMI값을 사용한다. 

If조건문으로 BMI값과 판정 기준값을 사용하면 비만, 과체중, 정상, 저체중 중에 하나의 값을 result 변수에 받고 이를 반환하게 된다. 

이부분은 생각보다 어렵지 않으리라 생각된다. 그럼 이제 main메소드로 이동해서 계산된 모든 값들을 적절하게 출력해 주면 완성된다. 

 

이 예제는 간단하지만 실제 당신과 친구들의 BMI를 계산할 수 있는 프로그램이다. 이전에 달력날짜 구하기나 윤년 구하기보다는 좀더 프로그램의 모양새가 갖추어진 제대로된 프로그램이라고 할수 있을것 같다. 

 

만약에 여러분이 조금더 응용을 한다면 안드로이드 앱을 간단히 개발할 수도 있는것이다. BMI계산기라는 이름의 앱이 될수도 있을 것이다. 

우리의 목표는 자바의 기본을 배우고 이후에 웹에 대한 교육으로 확장할까 생각한다. 

 

스마트폰에서 사용하는 많은 앱중에 안드로이드 전용 앱은 자바로 개발되어진다. 만약 자바 교육을 마치고 네이트브하게 자바로 앱을 만드는 것도 가능하고, 웹을 만든 뒤에 이 웹을 안드로이드앱에 웹을 불러와 앱으로 사용할 수도 있다. 

 

어떻게 개발하던 모두 훌륭한 앱과 웹이 될 것이다. 우리의 목표는 자바를 공부하고 이러한 응용 프로그램까지 개발해 보는데 있다. 

나도 이제 겨우 자바의 기본을 한번 공부한것 뿐이라 어찌보면 도전과 같은 목표일 수도 있지만, 지금 이 교육 자료를 정리하는 것은 다시한번 복습하며, 함께 안드로이드앱 혹은 웹을 만들어 보는데 있다. 

 

오늘은 중요한 메소드에 대해서 살펴보았다. 그리고 메소드를 이용한 BMI계산기까지 실습을 해보았다. 

어떤가 이제 겨우 일주일을 했을 뿐인데 자바란 언어로 그럴싸한 프로그램까지 만들수 있다는 것을 보면 자바란 언어가 한번 배워볼만한 언어라는 생각이 들지 않는가?

 

조건문과 반복문 그리고 메소드만 활용해도 정말 다양한 프로그램 개발이 가능하다. 그러기 위해 구글이나 참고 서적을 통해 다양한 예제를 연습해 보자.