본문 바로가기

Java 기본 개념

자바를 잡아라 제 8장 - 믿을만한 게 없을 때는 나 자신을 믿자

728x90

 

메서드(method)
: 반복적인 일상이 지겨워

 

 


        메서드는 반복되는 코드를 줄여주고, 좀 더 구조화시켜 우리가 코드를 알아보기 쉽게 함

        객체지향프로그래밍에서 메서드는 '객체가 가져야할 기능을 구현하기 위해 만든다'라고 표현

        메서드의 이름 뒤에는 반드시 소괄호'( )'가 와야 함



      [ 메서드 선언 방법 ]


                < 반환 유형 >  < 메서드 식별자 이름 >  ( 매개 변수)    {
                   

                                     기능 상세;
   

                 }


 

 

 

 

  •     반환 유형(return type)

       메서드가 실행한 후 메서드를 호출한 곳에 반환하는 값의 데이터 타입
  
       메서드는 반환값이 있을 수도 있고 없을 수도 있는데 없는 경우에는 반환 유형에 void를 적어줘야 함

       반환값이 있는 메서드를 호출할 때는 해당 반환유형에 맞는 변수에 반환값을 저장해야 함

       메서드가 실행의 결과값을 반환할 때는 return이라는 키워드를 사용함

 

 

 

 

  • 매개 변수(parameter)

  메서드가 실행될 때 필요한 데이터를 외부로부터 받기 위해 사용

  매개 변수도 일종의 변수이기 때문에 메서드의 소괄호( ) 부분에 데이터 타입과 함께 선언해야 하며 초기화는 하지 않음

  매개 변수를 여러개 선언할 수 있으며, 메서드가 외부로부터 받을 데이터가 없다면 선언하지 않을 수도 있음
    ( 이때는 반환 유형을 적을때와 같이 void를 쓰지 않고 소괄호( ) 안을 비워둬야 함 )


 

  

 

 

   [ 메서드의 유형 ]

 

 

       1. 매개변수 O, 반환 값 O

 

 

 

 

 

 

 

       2. 매개변수 O, 반환 값 X

 

 

 

       3. 매개변수 X, 반환 값 O

 

 

 

       4. 매개변수 X, 반환 값 X

 

         

 

 

 

 

 

 

     [ 메서드 유형 예시 - 매개변수 X, 반환 값 O ]

 

public class MethodEx01 {

	public static void main(String[] args) {

		//메서드는 메서드 내부에 생성 할 수 없음
		//main 밖에, 클래스 안에 어디서든 선언 할 수 있음

		//메서드의 호출 이름()

		//(1_메서드 출력)
		System.out.println(calSum());

		//(2_메서드 출력)
		int result = calSum();
		System.out.println(result);
        
		String result3 = ranStr();
		System.out.println(result3);
		
		 
	} //main 끝


	//반환 O, 매개값 X - 1부터 10까지 합
	static int calSum() {

		//1~10까지 합
		int sum = 0;
		for(int i = 1; i <= 10; i++) {
			sum += i;
		}
		return sum;
	}


	//반환 O, 매개값 X - 문자열의 결과 반환
	static String ranStr() {

		String str = ""; //A + B + C.... + Z
		for(char c = 'A'; c <= 'Z'; c++) {

			str += c;

		}

		return str; //String의 기본값 null

	}
    

	//반환 O, 매개값 X - return 키워드의 활용
	static String ranStr2() {

		double d = Math.random();
		
		if(d > 0.66) {
			return "가위";
		}else if(d > 0.33) {
			return "바위";
		}else {
			return "보";
		}

	}

}

 

 



      // 반환 값 O, 매개변수 X - 1부터 10까지 합


        static int calSum(       ) {          // 1~10까지 합

              int sum = 0;
              for ( int i = 1; i <= 10; i++ ) {           // 매개변수 없이 메서드 내부에서 해결 가능     
                    sum += i;
              }
  
              return sum;                        // 반환 값이 int(정수)이기 때문에 sum(정수)으로 반환

            }


     // 반환 값 O, 매개변수 X - 문자열의 결과 반환

          static String ranStr(      ) {            //  A + B + C.... + Z

              String str = "";             
              for ( char c = 'A'; c <= 'Z'; c++ ) {
                          str += c;
                }
                 return str;                        // 반환 값이 String(문자열)이기 때문에 str(문자열)로 반환
              }


     // 반환 값 O, 매개변수 X - return 키워드의 활용

          static String ranStr2(      ) {

                double d = Math.random ( ); 

                 if ( d > 0.66 ) {

                     return "가위";
                 }else if ( d > 0.33 ) {           // 반환 값이 String(문자열)이므로 문자열로 반환
                     return "바위";                    ( 직접적으로 바로 반환도 가능 )
                 }else {
                     return "보"; }
          }

 

 

 

 

   [ 메서드 유형 예시 -  매개변수 O, 반환 값 O ]

 

public class MethodEx02 {

	public static void main(String[] args) {

		/*
		 * 매개변수(parameter)
		 * 1. 매개변수는 메서드를 호출할 때 필요한 값을 전달하는 매개체
		 * 2. 매개변수는 몇 개 받을지 메서드를 선언할 때 결정해줌
		 *  
		 */

		int result = calSum(10);
		System.out.println("1~10까지의 합:" + result);

		int result2 = calSum(100);
		System.out.println("1~100까지의 합:" + result2);

		int result3 = calSum2(10, 20);
		System.out.println("10~20까지의 합:" + result3);
		
		
	}

	// 반환 O, 매개변수 O
	static int calSum(int end) {

		int sum = 0;

		for(int i = 1; i <= end; i++) {
			sum +=i;
		}

		return sum;

	}

	//반환 O, 매개변수 O - 매개변수가 여러 개
	static int calSum2(int start, int end) {

		int sum = 0;
		for(int i = start; i <= end; i++) {
			sum +=i;

		}

		return sum;
	}


}

 

 


       // 반환 O, 매개변수 O

          static int calSum ( int end ) {         // 매개변수 한 개
             
                int sum = 0;

                for ( int i = 1; i <= end; i++ ) {     // 외부에서 매개변수를 받아 내부에서 메서드의 기능 실행
                             sum += i;
                 }
                  return sum;
           }


       // 반환 O, 매개변수 O - 매개변수가 여러 개

           static int calSum2 ( int start, int end ) {         // 매개변수 두 개

                 int sum = 0;

                 for ( int i = start; i <= end; i++ ) {
                                sum += i; 
                   }
                    return sum;
               }

 

 

 

 [ 메서드 유형 예시 -  반환 값이 있을 때와 없을 때 호출하는 방법 차이 ]

 

public class MethodEx03 {
	public static void main(String[] args) {
		
		/*
		 * 
		 * 반환유형(return type)
		 * 1. 반환유형은 메서드가 돌려주는 값에 대한 타입
		 * 2. 반환유형이 있는 메서드는 호출 구문이 값이 되기 때문에 메서드의 매개값으로 사용될 수도 있음 
		 * ex) println( 메서드 호출 )
		 * 3. 모든 메서드는 return을 만나면 강제종료
		 * 4. 리턴문 아래에는 코드를 작성할 수 없음
		 * 
		 */
		
		
//		int result = add(3, 5);
//		System.out.println("결과:" + result);
//		System.out.println( add(3,5) );
		
		 int result = add( add(1, 2), add(2, 3) );
		 System.out.println(result);
		
		 
		 //int r = sub(1, 2); - 잘못된 사용 1
		 //System.out.println( sub(1, 2) ); - 잘못된 사용 2
		 
		 sub(1,2);
		 
		 noReturn("hello"); 
		 noReturn("bye");
		 
	}
	
	static int add(int a, int b) {
		
		return a + b;
		
		// int result = a + b;
		//return result;
		
	}
	
	// 반환 X , 매개변수 O - 리턴이 없음(단순 실행)
	static void sub(int a, int b) {
		System.out.println("a - b = " + (a-b));
		
	}
	
	//void형에서 return - 종료
	static void noReturn(String s) {
		
		if(s.equals("hello")) {
			System.out.println("실행종료");
			return; //종료
		}
		
		System.out.println(s);
		
	}
	

}

 

 

 
     public static void main(String[ ] args) {           //  main 시작

         반환 값 있는 메서드 호출하는 방법 - [1] 

           int result = add(3, 5);

           System.out.println("결과:" + result);

           System.out.println( add(3,5) );     // 반환 값이 있는 경우에만 출력문으로 바로 호출 가능

           
          반환 값 있는 메서드 호출하는 방법 - [2] 

            int result = add( add(1, 2), add(2, 3) );
            System.out.println( result );

           
           반환 값 없는 메서드 호출하는 방법 

            // int r = sub(1, 2); - 잘못된 사용 1
            // System.out.println( sub(1, 2) ); - 잘못된 사용 2

             sub(1,2);
             noReturn("hello");
             noReturn("bye");


      }    //  main 종료


         // 반환 O , 매개변수 O 

         static int add ( int a, int b) {

 
             return a + b;

      
         }


         
        // 반환 X , 매개변수 O - 리턴이 없음(단순 실행)

           static void sub( int a, int b ) {

               System.out.println( "a - b = " + ( a - b ) );     // 반환 값이 없기 때문에 바로 출력(실행만 가능)

 
          }


         // void형에서 return - 종료

             static void noReturn(String s) {

                  if( s.equals("hello") ) {

                      System.out.println("실행종료");
                       return;      // 종료                                   // 반환 값이 없는데 return이 등장한다면 종료의 의미

              }
                System.out.println(s);
           }
      }

 

 

 

 [ 메서드 유형 예시 -  반환 값 OR 매개변수가 배열인 경우 ]

 

import java.util.Arrays;

public class MethodEx04 {

	public static void main(String[] args) {

		int [] arr = {1, 2, 3, 4, 5};
		String[] arr2 = {"월", "화", "수"};


		method01(arr); // 변수명 or 생성구문
		
		method02(arr, arr2);
		
		int[] arr1 = method03();
		System.out.println(Arrays.toString(arr1));
		
	}

	//정수배열을 매개변수로 받는 메서드
	static void method01(int[] a) {

		//a를 이용해서 배열값의 사용가능
		System.out.println(Arrays.toString(a));
	}

	//정수배열과, 문자열 배열을 매개변수로 받는 메서드
	static int method02(int[] arr, String[] arr2) {

		for(int a: arr) {
			System.out.println(a);
		}
		
		
		return 0;
		
	}

	//배열을 반환하는 메서드 
	static int[] method03() {
		
		int[] arr= new int[5];
		arr[0] = 0;
		arr[1] = 1;
		arr[2] = 2; // 행 복사 : ctrl + alt + 방향키
		arr[3] = 3;
		arr[4] = 4;
		
		
		return arr;
	}

}

 

 


      public static void main( String[ ] args ) {      // main 시작

            int [ ] arr = {1, 2, 3, 4, 5};
            String [ ] arr2 = { "월", "화", "수" };

            method01( arr );               // 변수명 or 생성구문

            method02 ( arr, arr2 );

            int [ ] arr1 = method03 ( ); 
            System.out.println( Arrays.toString(arr1) );
     
     }   // main 종료



          // 반환 값 X, 매개변수 O - 정수배열을 매개변수로 받는 메서드
 
              static void method01( int [ ] a ) {

             System.out.println(Arrays.toString(a));      // a를 이용해서 배열값의 사용가능

           
            }


          // 반환 값 O, 매개변수 O - 정수배열과, 문자열 배열을 매개변수로 받는 메서드

               static int method02 ( int [ ] arr, String [ ] arr2 ) {

                          for ( int a : arr ) {
                                System.out.println(a);
                          }
                           return 0;
                }


           // 반환 값 O, 매개변수 X - 배열을 반환하는 메서드

              static int [ ] method03 (      ) {

                       int [ ] arr = new int [5];

                        arr[0] = 0;
                        arr[1] = 1;
                        arr[2] = 2;
                        arr[3] = 3;
                        arr[4] = 4;
                       
                        return arr;

                 }
       }

 

 

 

   [ 메서드 유형 예시 -  메서드의 실행 방법(동기적 실행, 재귀적 실행) ]

 

public class MethodEx05 {

	public static void main(String[] args) {

		//메서드의 (동기적) 실행
		test01();
		
		//메서드의 재귀적 실행 
		recursive(0);
	
		int result = fac(5);
		System.out.println(result);
	}
	

    static void test01() {
    	System.out.println("1번 메서드 실행");
    	test02();
    	System.out.println("1번 메서드 종료");
    }
    
    static void test02() {
    	System.out.println("2번 메서드 실행");
     	System.out.println("2번 메서드 종료");
    	
    	
    }

    static void recursive(int a) {
    	//재귀적 함수는 탈출의 구문을 반드시 명시
    	if(a == 10) return;
    	
    	
    	System.out.println(a + "번 호출");
    	a++; //1증가
    	recursive(a);
    	
    }
    
    static int fac(int a) {
    	
    	if(a==1) return 1; // f(1) = 1
    	return a * fac(a-1);
   
    	
    }
}

 

 


      public static void main(String[ ] args) {

            // 메서드의 (동기적)
                실행 test01();

          //메서드의 재귀적 실행
                 recursive(0);

                int result = fac(5);
                System.out.println(result);

          } // main 종료



           static void test01(      ) {

              System.out.println("1번 메서드 실행");
              test02();     // 메소드 안에서 다른 메소도 호출 가능
              System.out.println("1번 메서드 종료");
  
           }


            static void test02(       ) {
 
               System.out.println("2번 메서드 실행");
               System.out.println("2번 메서드 종료");

           }


            static void recursive ( int a ) {      // 재귀적 함수는 탈출의 구문을 반드시 명시

                    if ( a == 10 )  return;          //  탈출 구문 ( a가 10이면 종료 )
                    System.out.println ( a + "번 호출" );
                     a++;         
                     recursive(a);

           }


            static int fac ( int a ) {

                      if( a==1 ) return 1;        // f(1) = 1
                      return a * fac (a-1);

          }