Java Chapter6. 메소드(Method)

2011. 10. 18. 02:17

현 블로그는 모바일 환경이 아닌 PC환경에 최적화 되어있습니다.

 Mir의 운영환경


이번챕터에서는 Method에 대해 자세히 알아보겠다.

필자가 원래 5개의 Chapter이후 바로 클래스의 설명으로 들어갈려고 했는데
이전에 조건식과 반복문으로 만들어지는 메소드를 먼저 설명하고 가는게 훨씬 나을것 같다. 


메소드는 어떠한 작업을 수행하기 위한 명령문의 집합이다.
세금을 계산하는 작업을 할수도 있고 값을 더해 평균을 구하는 작업을 할수도 있다.
즉 x라는 변수를 가지고 이리볶고 저리 볶고 난뒤에 그 결과값 y를 되돌려 주는 비교하자면 요리기계와 같다.

"어떠한 요리기계가 있는데 이 기계를 사용자가 설명서를 읽고 난뒤  알맞는 재료를 넣어준다.
그럼 요리기계는 그 재료가 적당한것이면 지지고 볶고 한뒤에 요리를 완성시켜주지만
재료가 적당하지 않으면 고장이 나게된다. "


위 글은 메소드를 요리기계에 비유하여서 메소드의 기능을 간략하게 나타낸 글이다.
위 글에서 처리할 재료가 되는 값을
인수(파라메터)라고 하며, 완성된 요리 즉 결과값을 반환값(리턴값)이라고 부른다.
(경우에 따라서 인수가 없는 Method도 있으며 반환값이 없는 Method도 있다.)

우리가 메소드를 사용하는 가장 큰 이유는 반복적으로 사용되는 코드를 줄이기 위해서이다.
자주 사용되는 코드를 메서드로 작성해 놓고 필요한곳에서 호출만 하면 되니
코드의 양도 줄일수 있고 코드를 한 곳에서만 관리하면 되므로 유지보수가 매우 편리하다.
 

 
자 그럼 차근차근 메소드를 만드는 방법을 알아보자.
      리턴타입 메서드이름 (타입 변수명, 타입 변수명, ...... )      ----  선언부
      {
                 메서드 호출시 실행될 코드                                          ---- 구현부
       }
메소드는 크게 선언부와 구현부로 나눠지는데 선언부는 리턴타입, 이름, 매개변수를 선언하고
구현부는 이 메서드를 호출할때 수행되어야 될 코드가 들어간다.
(선언부는 이 Method에 x타입의 재료를 몇개 넣으면 y타입의 요리를 완성시켜준다고 말하는 설명서와 비슷한 역활이다.)
간단한 예제를 보자.
      int  addHap (int a, int b)
      {
              int hap = a + b;
              return hap;
      } 
위 예제를 보면 메소드안에서 모든 변수들을 선언해 주었다. 이것을 해석하면

int
addHap         : int형 값을 돌려주는 addHap이라는 메소드는
(int a, int b)       : int형 변수 a와 b를 매개변수(재료)로 사용하여  ----- 여기까지가 선언부이다.
{ int hap=a+b;  : int형 변수 hap에 a와 b의 더한값을 넣고 난뒤
return hap; }      : hap(결과값)을 돌려준다.  

위 예제 선언부를 보면 int형 a와 b를 재료로 넣으면 int형 값을 돌려준다고 설명서처럼 나와있다.
이 선언부를 보고 거기에 맞는 매개변수(재료)를 넣어주어야 리턴값(요리)가 제대로 나오게 되는것이다.

구현부받은 매개변수(재료)를 어떤방식으로 처리(요리)를 하는지 구현하는 곳이다.
위 예제는 두개의 매개변수 a와 b를 더해서 hap이라는 변수에 넣어 그 hap을 리턴값으로 주었다.

여기서 제일 주의해서 봐야 될 부분은 선언부의 리턴타입과 구현부의 return값이다.


선언부의 리턴타입과 리턴값의 타입은 반드시 일치하여야 하는데
선언부에서 String형을 되돌려 준다고 말해놓고 구현부에서 return값을 int형으로 주면 
한마디로 '난 이 재료를 가지고 짬뽕을 만들어 주겠다'고 선언했는데 
전혀 엉뚱한 볶음밥을 만들어서 줄려고 하는거와 같다.
(위 메소드는 hap이라는 int형 변수를 되돌려 주기 때문에 선언부에 리턴타입을 int로 선언해주었다.)

선언부에서 리턴타입은 여러형식으로 쓰이는데 int, float, char등등 기본 8형말고도
배열을 리턴해주거나 클래스자체를 리턴해줄수도 있다.
(메소드에서 return문은 값을 리턴해준다는 의미 말고 메소드를 종료하라는 뜻도 포함되어있다.)

그리고 리턴값이 없는 메소드도 있는데 리턴값이 없을때에는 리턴타입을 void로 적어주면된다.
void addHap2 (int a, int b)

   int hap  =  a  +  b
   System.out.println("a 와 b의 합은" + hap + "입니다.") 

위 예제처럼 return값이 없는 메소드는 리턴타입을 void로 사용하면 된다.
반환값이 없는 메소드는 그 메소드 안에서 모든 작업을 완료 하게 된다.
위 예제를 보면 a와 b를 받아서 합을 구해 바로 출력까지 시킨다.
그리고 난뒤 남는것이 없는 것이다.

쉽게 설명하면 재료를 넣어서 요리기계를 가동시켰는데 그 요리기계에서 완성된 음식을 바로 나에게 주지 않는것이다.
그렇다고 음식이 만들어지지 않는것이 아니다. 그럼 그 음식은 어디로 갔을까?
위와 같이 System.out.println( )메소드를 사용하여 화면으로 완성된 음식을 보여 줄수도 있는것이고
혹은 다른 저장장소에 담아서 보관할수도 있는것이다.

return값이 있는 메소드일 경우에는 그 요리를 바로 나에게 주기 때문에
그 요리를 담을 접시(변수)를 준비 해야 하지만
return값이 없는 메소드일 경우에는 그 요리를 바로 나에게 주는 것이 아니라
어딘가에 저장을 했다가 내가 다시 불러야지 요리를 준다고 생각하자.
(위 예제에서는 print( )구문으로 다시 부른거다.)

자 그럼 return값이 있는 메소드와 없는 메소드의 사용법을 알아보자.

public class ex6_1 {


public static void main(String[] args) {

            addHap2(1, 2);
            addHap2(3, 4);

            int hap = addHap(1 ,2); 

System.out.println(hap);

}


 

             
int  addHap (int a, int b)
{       

                     int hap = a + b;

                     return hap;

             } 


              void addHap2 (int a, int b) {

                      int hap  =  a  +  b

                      System.out.println(a+"  "+b+" 합은" + hap + "입니다.") 

             } 



 

}

메소드의 사용방법은 매우 간단하다.
사용설명서
(선언부)를 읽은후에 메소드 이름을 적어 주고 이름 뒤 ( ) 안에 메소드로 보낼 값을 적어주면 된다. 
그리고 난뒤 혹시 그 메소드가 return값이 있는 메소드이면 나에게 줄 값(요리)을 받기위한  변수(접시)를 준비해주면 된다.
(메소드 리턴형식앞에 붙은 static는 객체를 생성하지 않고 바로 메소드를 호출할수 있게 하는 속성값이다.
자세한 설명은 후에 static메소드를 설명할때 하도록 하겠다. 일단은 그냥 어디서든 호출할수 있게 하는 명령이라고 생각하자.)


그럼 하나하나 보도록 하자.
우선 위 예제를 보면 addHap, addHap2 그리고 main메소드 총 3개의 메소드가 있다.

main메소드는 필자가 처음 자바의 기본개념을 설명할때 잠시 말했었다.
main메소드는 프로그램 실행시 꼭 필요한 메소드이며 프로그램의 시작점이므로 
만약 main메소드가 없을시에는 프로그램의 시작점을 찾지 못하여서 프로그램 자체가 실행이 되지 않는다.

자 그럼 위 예제를 실행시키면 당연히 main메소드에서 부터 프로그램이 실행될것이다.

그리고 난뒤 addHap2( )메소드를 호출 하였다.
아래 내려가서 addHap2( )메소드의 구현부를 보면 int a와 int b를 인수로 받으며 반환값이 없다고 되어 있다.
다시 올라가서 메소드 호출구문을 보면 1과 2를 인수로 준것이 확인된다.
그럼 addHap2( )메소드는 1과 2를 인수로 받아 그 합을 구하고 합을 출력까지 시켜준다.

다시 한줄 아래보면 addHap2( )메소드를 한번더 호출 하였다.
자 여기서 한가지 짚고 넘어가야 될 부분이 있는데
메소드를 호출하면 그 메소드는 메모리상에 올라가서 모든 명령을 수행하게 된다.
그리고 메소드가 자신이 할일을 마치고 나면 메모리상에 올라간 메소드는 모두 지워지게 된다.

무슨 뜻이냐면 내가 요리기계를 사용하여 요리를 만들었는데
다시 그 요리기계를 사용할려고 하니 이전에 만든 요리의 흔적이 남아있으면
이전 재료의 찌꺼기와 합쳐져서 요리가 이상하게 만들어진다.
그래서 요리기계를 한번 사용하면 그 요리기계를 요리했던 흔적이 없도록
깨끗이 씻어 내린다고 생각하면 된다.
(후에 메모리의 구조를 배울때 확실하게 이해 될것이다.)
 
자 그렇게 addHap2( )메소드를 한번더 실행하고 난뒤 이번엔 addHap( )메소드를 호출하였다. 

아래 내려가서 addHap( )메소드 구현부를 보니 int a와 int b를 인수로 받으며 int형의 반환값이 있다고 되어있다.
그럼 바로 음식을 받아야 되니 접시가 필요하다.
그래서 앞에 int hap이라는 변수를 선언하고 리턴값을 hap이라는 변수에 받아내는 것이다.
그리고 난뒤 마지막으로 리턴값을 받은 hap을 프린트 시켰다.

여기서도 한가지 짚고 넘어가야 할 부분이 있는데
addHap( )메소드 안에서의 변수 hap과 main( )메소드 안의 변수 hap은 같은 변수가 아니다.
필자가 방금위에서 설명했듯이 메소드는 호출후 자기 할일이 끝나면
자기가 메모리상에서 해놨던 일들을 모두 가지고 사라지게 된다.
즉 int hap으로 hap이라는 변수를 선언했었다가 그 변수를 사용후에
메소드의 할일이 끝나면 hap이라는 변수도 같이 사라지게 되는것이다.

이러한 변수를
지역변수라고 하는데 "그 지역에서만 존재한다" 라는 뜻으로 해석하면 된다.
결국 addHap( )의 변수 hap은 addHap( )에서만 존재하는 변수로 인식되며
main( )메소드의 변수 hap 또한 main( )메소드에서만 존재하는 변수로 인식된다.
(서로 같은 변수라고 생각해서 두 메소드중 하나라도 변수를 선언하지 않으면 오류가 일어나게 된다.)


자 Method에 대해서 간단히 알아보았는데 마무리로 정리하자면 결국 우리가 예전에 배운 함수와 같다.
"f(x) = 10 + x 라고 가정해놓고 다음식에서 50 + f(x) + 2f(x) = 100 일때 x의 값을 구하라"
위와 같은 함수식이 생각난다면 훨신 쉽게 이해가 될것이다.
이런식으로 f(x) 즉 Method를 한번 선언해 놓고 필요할때마다 호출해서 사용하는 것이다.


마지막으로 한가지 예제만 보자.
int max(int a, int b)
{
  if (a >b )
  return a;
} 
자 위 예제는 잘못만들어진 메소드중 하나이다.
어디서 잘못되었는지 보이는가?

리턴값을 int형으로 주고 int형 a와 b를 매개변수로 사용하여 a를 반환해 주었다.
겉으로 보기엔 별로 틀린점이 없다 리턴타입과 return문의 타입도 일치한다.

하지만 위 예제는 만약 b가 a보다 더 커져버리면 return할 값이 없다.
모든 메소드는 결과값이 있어야 하는데 b가 더 크면 돌려줄 결과값이 없기때문에 오류가 나게 되는것이다.

위 예제를 오류가 나지 않게 할려면 아래와 같이 else구문을 추가해주어야 한다.
int max(int a, int b)
{
  if(a>b)
 return a;
 else
 return b;
} 




자 이번 Chapter에서는 메소드에대해 좀더 자세히 알아보았다.
메소드에서는 리턴타입 그리고 지역변수 두개만 기억하면 메소드를
만들고 이용하는것에 별로 어려움이 없을것이다.









 

+ Recent posts