본문 바로가기
study_java/java_수강정리(~10.29)

[JAVA]7일차

by developer_j 2020. 5. 19.
728x90
반응형

< 7일차 수업 >

 

함수(method)

 함수는 변수를 가지고 실행할 코드를 정의하는 것으로, 두번 이상 사용하는 연산 등을 함수로 만드는 것이 좋다. 다만 main 함수는 프로그램이 시작되는 시작점이므로 다른 함수를 main함수 밖에서 선언하고 main함수 안에서는 다른 함수들을 사용하는 형태로 전개하는 것이 깔끔하다. 또한 무슨 용도의 함수인지 알기 쉽게 함수명을 정하는 것이 좋다. 아무래도 여러번 사용하는 만큼 매번 함수내용 보러 스크롤을 내릴 수도 없으니 말이다.

만들어 둔 함수를 사용하는 것을 "호출한다"라고 하고, 함수의 괄호()안의 것들을 매개변수 혹은 인자(파라미터)라고부른다(다 똑같은 말이다).

보통 main 함수에서 다른 함수를 호출하는데, 함수명 옆에 바디({ }영역)는 없는데 괄호()안에 여러 변수가 포함되어 있다면 함수 호출이고, 함수명 앞에 여러 키워드가 붙어있고 바디도 있으면 함수 구현이다.

 

public class Report07 {
           public static void main(String[] args) {
                       int result ;
                       result = add(1,2);
                       explain();

                       System.out.println("1+2 = " + result);
                       System.out.println("1.5 x 1.5= " + square(1.5));
           }
           
           //다른 함수 정의
           static void explain(){
                       System.out.println("연산 함수를 진행해봅시다.");
           }
           
           static int add(int num1, int num2) {
                       int addResult = num1 + num2;
                       return addResult;
           }
    
           static double square(double num) {
                       return num * num ;        
           }
}

 

위의 코드를 분석하면 다음과 같다.

0.반환하는 것이 없으면 반환형은 void가 된다. 단순한 출력(print)과 값의 반환은 다른 것이다.

반환하는게 없을 뿐, 매개변수를 넘겨받아 변수에 함수결과를 저장하는 것 등은 가능하다. 그러나 위의 코드에서는 한 클래스 안에서 main함수 안에 변수가 들어있고 그 외의 함수들만이 존재 ㅡ void 함수는 출력 말고는 할 수 있는게 없음. 

위의 void형 함수인 explain()은 출력 기능만 있으므로

int a = explain(); --> 불가능

단, 매개변수는 진짜 굳이 꼭 필요하면 넣을 수도 있긴 하다.

1.add 함수는 int형 변수를 넘겨 받으며 연산식 역시 int형 결과가 return된다.

따라서 함수의 반환형 역시 int형이 된다.

2. square 함수는 double형 변수를 넘겨받으며 연산식 역시 double형 결과가 return된다.

따라서 함수의 반환형 역시 double형이 된다.

3. 매개변수가 실수인지 정수인지에 따라 연산 결과가 달라지므로, 연산 결과를 반환한다면 함수 자료형에 주의해야한다.

 

즉, 함수의 반환형 = 리턴값의 자료형이라고 할 수 있다.


리턴의 두가지 의미

 

public class Report07 {
           public static void main(String[] args) {
                       divide(4,2);
                       divide(6,2);
                       divide(9,0);                  
           }
         
           static void divide(int num1, int num2) {
                       if (num2 == 0) {
                                  System.out.println("0으로 나눌 수 없음");
                                  return; 
                                  // num2가 0인 divide(9,0); 은 아래의 println함수를 거치지 않고 바로 탈출함
                       }
                       System.out.println("나눗셈결과 : " + (num1/num2));
           }
}

 

위의 코드는 두 수를 입력해두고 나눈 결과를 반환하는 코드다. 그러나 0을 다른 숫자로는 나눌 수 있지만( 결과는 0 ), 다른 숫자를 0으로 나눌 수는 없다.

따라서 if 조건으로 걸러지게 해두었다. --> num2가 0이면 더이상 함수 실행하지 않고 함수가 종료된다.

함수의 반환형 = 리턴값의 자료형이라고 했다.

함수가 정수형의 데이터를 결과로 반환한다면 함수 반환형이 int가 된다.

함수가 반환하는 것이 없고, 바로 출력하는 함수라면 void형이 반환형이 된다.

(void라고 해서 return을 쓰지 못하는 건 아니다. 단, 값을 반환하는 return이 아니라, 함수를 종료하는 2번 return;으로 사용한다. 값을 반환하는 return을 쓰면 에러가 발생한다.)

 

즉, return의 두가지 의미는 ①값을 반환하기 혹은 ②메소드 종료(함수 종료) 이다.

 * 한 함수에서 리턴 값으로 두개를 반환할 수는 없다. 


+) 오늘 예제 푼 것 중 의미 있었던 것들

 

1. return이 많으면 보기 별로 안 좋다고 한다.

public class Report07 {
//grade 입력값 하나 받아서 수우미양가 출력하는 함수
           public static void main(String[] args) {
                       int total =10;
                       char grd= grade(total);
                       System.out.println(grd);
           }
       
           public static char grade(int n) { 
                       /*
                        * if(90<=n){
                        *  return '수';
                        * }else if(80<=n){
                        *  return '우';
                        * }else if(70<=n){
                        *  return '미';
                        * }else if(60<=n){
                        *  return '양';
                        * }else{
                        *  return '가';
                        * }
                        * 그런데 return이 많으면 좋은게 아님
                        */
                      
                       char grade;
                       if(90<=n){
                                  grade = '수';
                       }else if(80<=n){
                                  grade = '우';
                       }else if(70<=n){
                                  grade = '미';
                       }else if(60<=n){
                                  grade = '양';
                       }else {
                                  grade = '가';
                       }
                       return grade;      //깰끔!
           }
}

  

2. 공배수 - 최소 공배수

 우선, 정수 num이 2와 3의 공배수인지 확인하는 코드를 짠 적이 있었다.

public class Report07 {
           public static void main(String[] args) {
                       int num = 12;
                       boolean result;
                     
                       //12는 2와 3의 공배수인가?
                       result = ((num % 2 ==0) && (num % 3 == 0));
                       System.out.println(num + "는 2의 배수이자 3의 배수? : " + result);
           }
}

 

여기에 착안해서 최소공배수 구하는 걸 하면 좀더 쉽게 접근할 수 있는데, 엄청 돌아갔다.. 공배수 구하는 계산식에 엄청 집착했음.

 

 <최소 공배수 구하기>

public class Report07 {
           public static void main(String[] args) {
                       int a= 5;
                       int b= 10;
                   
                       int result = getCommonMul(a,b);   //최소 공배수 구하는 함수 호출
                      
                       if(result == -1) {                         //리턴 값이 -1이면 프로그램 실행 X
                                  System.out.println("두 수가 같거나 한 수가 음수라서 프로그램 실행 안됨");
                       }else{
                                  System.out.println(result);
                       };
           }
         
           static int getCommonMul(int a, int b) {
                       int lcm = 1;             		   //최소 공배수 변수 선언 & 초기화
                   
                   	   //두 수가 같거나, 한 수가 음수이면 리턴 값 -1로 반환
                       if ((a == b) || (a<0) || (b<0) ) {  
                                  return -1;
                       }else {
                                  while(true) {                  
                                  //a와 b로 동시에(&&) 나누어 떨어져야 공배수. 
                                  //최소 공배수 구할 수 있도록 lcm = 1부터 계속 1씩 증가
                                              if((lcm % a == 0) && (lcm % b == 0))
                                                         return lcm;
                                              lcm++;
                                  }
                       }                     
           }
}

 

음.. 문제 풀면서 느끼는 건데 간단한 원리? 찾는게 생각보다 코딩 속도를 높이는 것 같다.

728x90
반응형

'study_java > java_수강정리(~10.29)' 카테고리의 다른 글

[JAVA]9일차  (1) 2020.05.21
[JAVA]8일차  (0) 2020.05.20
[JAVA]6일차  (0) 2020.05.19
[JAVA]5일차  (0) 2020.05.15
[JAVA]4일차  (0) 2020.05.15