[기본 개념] 1 | (2.2) 메서드 선언/구현

728x90

[기본 개념] 1 | (2.2) 메서드 선언/구현

1 선언 위치에 따른 변수의 종류

2 클래스변수와 인스턴스변수

3> 메서드

4> 메서드의 선언과 구현

5 메서드의 호출

6 return문

7 JVM의 메모리구조

8 기본형 매개변수와 참조형 매개변수

9 참조형 반환타입

10 재귀호출

11 클래스 메서드와 인스턴스 메서드

12 클래스 멤버와 인스턴스 멤버간의 호출

3. 메서드

 메서드가 작업을 수행하는데 필요한 값만 넣고 원하는 결과를 얻으면 될 뿐, 메서드가 내부적으로 어떤 과정을 거쳐 결과를 만들어내는지는 전혀 몰라도 된다. 즉, 메서드에 입력과 출력만 알면 된다.

 

메서드를 사용하는 이유

1. 높은 재사용성(reusability)

 

 이미 Java API에서 제공하는 메서드들을 사용하면서 경험한 것처럼 한번 만들어 놓은 메서드는 몇 번이고 호출할 수 있으며, 다른 프로그램에서도 사용 가능하다.

 

2. 중복된 코드 제거

 

 프로그램 작성 시, 같은 내용의 문장이 여러 곳에서 반복해서 나타난다. 이렇게 반복되는 문장을 묶어 하나의 메서드로 작성하면, 메서드를 호출하는 한 문장으로 대체할 수 있다. 그러면, 길이도 짧아지고, 변경사항이 발생했을 때 수정해야 할 코드의 양도 줄어들어 오류발생 빈도가 줄어든다.

 

public static void main(String[] args) {

         · · ·

        for (int i = 0 ; i < 10 ; i++)

                numArr[i] = (int) (Math.random( ) * 10) ;

 

        for (int i = 0 ; i < 10 ; i++)

                System.out.printf("%d", numArr[i]) ;

        System.out.println( ) ;

                      · · · 중간생략 · · ·

        for (int i = 0 ; i < 10 ; i++)

                System.out.printf("%d", numArr[i]) ;

        System.out.println( ) ;

 

같은 내용의 코드를 printArr라는 메서드를 만들어 이전의 코드에 적용을 하자.

 

static void printArr(int [ ] numArr) {

        for (int i = 0 ; i < 10 ; i++)

                System.out.printf("%d", numArr[i]) ;

        System.out.println( ) ;

}

 

public static void main(String[] args) {

        · · ·

        for (int i = 0 ; i < 10 ; i++)

                numArr[i] = (int) (Math.random( ) * 10) ;

 

        printArr(numArr) ;  // 배열을 출력

                      · · · 중간생략 · · ·   

        printArr(numArr) ;  // 배열을 출력

}

 

 이처럼 반복적으로 나타나는 문장들을 메서드로 만들어서 사용하면 코드의 중복이 제거되고, 변경사항이 발생했을 때, 이 메서드만 수정하면 되므로 관리가 쉽고, 오류 발생 빈도도 줄어든다.

 

3. 프로그램의 구조화

 

 지금까지는 main메서드 안에 모든 문장을 넣는 식으로 프로그램을 작성해왔다. 길어야 100줄 정도 되는 작은 프로그램을 작성할 때는 이렇게 해도 되지만, 몇 천 줄, 몇 만 줄이 넘는 프로그램도 이런 식으로 작성할 수 없다. 큰 규모의 프로그램에서는 문장들을 작업 단위로 나눠서 여러 개의 메서드에 담아 프로그램의 구조를 단순화시키는 것이 필수다. 작업단위 별로 나누어서 메서드로 만들면 아래와 같이 main메서드가 간단해진다.

 

public static void main (String[] args) {

        int[ ] numArr = new int [10] ;

 

        initArr(numArr) ;     // 1. 배열을 초기화

        printArr(numArr) ;   // 2. 배열을 출력

        sortArr(numArr) ;    // 3. 배열을 정렬

        printArr(numArr) ;   // 4. 배열을 출력

}

 

 이처럼 main메서드는 프로그램의 전체 흐름이 한눈에 들어올 정도로 단순하게 구조화하는 것이 좋다. 그래야 나중에 프로그램에 문제가 발생해도 해당 부분을 쉽게 찾아서 해결할 수 있다.

 

4. 메서드의 선언과 구현

 메서드는 '선언부(header, 머리)'와 '구현부(body, 몸통)'로 이루어져 있다.

 

반환타입 메서드이름 (타입 변수명, 타입 변수명, · · ·)     ▷ 선언부

{                                                                     

        // 메서드 호출 시 수행될 코드                          ▷ 구현부

}                       

 

메서드 선언부(method declaration, method header)

 

 메서드 선언부는 '메서드의 이름''매개변수 선언', 그리고 '반환타입'으로 구성되어 있다. 예를 들어 아래에 정의된 메서드 add는 두 개의 정수를 입력받아서, 두 값을 더한 결과(int타입의 값)를 변환한다.

 

반환타입(출력)ㄱ    매개변수선언(입력)ㄱ

               int     add     (int x, int y) {

                                ㄴ메서드이름

                   int result = x + y ;

                   return result ;   // 결과를 반환

               }

 

 메서드의 선언부는 후에 변경사항이 발생하지 않도록 신중히 작성해야 한다. 메서드의 선언부를 변경하게 되면, 그 메서드가 호출되는 모든 곳도 같이 변경해야 하기 때문이다.

 

매개변수 선언(parameter declaration)

 

 매개변수는 메서드가 작업을 수행하는데 필요한 값들(입력)을 제공받기 위한 것이며, 일반적인 변수선언과 달리 두 변수의 타입이 같아도 변수의 타입을 생략할 수 없다.

 

int add(int x, int y)  {  · · ·  }  // OK.

int add(int x, y)       {  · · ·  }  // 에러. 매개변수 y의 타입이 없다.

 

 선언할 수 있는 매개변수의 개수는 제한이 없지만, 입력해야 할 값의 개수가 많은 경우 배열이나 참조변수를 사용하면 된다.

 

메서드의 이름(method name)

 

 메서드는 특정 작업을 수행하므로 'add'처럼 동사인 경우가 많으며, 이름만으로도 메서드의 기능을 쉽게 알 수 있도록 함축적이면서 의미 있는 이름을 지어야 한다.

 

반환타입(return type)

 

 메서드의 작업수행 결과(출력)인 '반환값(return value)'의 타입을 적는다. 반환값이 없는 경우 반환타입으로 'void'를 적어야 한다.

 

메서드의 구현부(method body, 메서드 몸통)

 

 메서드의 선언부 다음에 오는 괄호{ }를 '메서드의 구현부'라고 하는데, 여기에 메서드를 호출했을 때 수행될 문장들을 넣는다.

 

return문

 

 메서드의 반환타입이 'void'가 아닌 경우, 구현부{ }안에 'return 반환값;'이 반드시 포함되어 있어야 한다. 이 문장은 작업을 수행한 결과인 반환값을 호출한 메서드로 전달하는데, 이 값의 타입은 반환타입과 일치하거나 적어도 자동 형변환이 가능한 것이어야 한다. 단 하나의 값만 반환할 수 있는데, 메서드로의 입력(매개변수)은 여러 개일 수 있어도 출력(반환값)은 최대 하나만 허용한다.

 

지역변수(local variable)

 

 메서드 내에 선언된 변수들은 그 메서드 내에서만 사용할 수 있으므로 서로 다른 메서드라면 같은 이름의 변수를 선언해도 된다. 이처럼 메서드 내에 선언된 변수를 '지역변수(local variable)'라고 한다.

 

        int add(int x, int y) {

            int result = x + y ;

            return result ;

        }

        int multiply(int x, int y) {

            int result = x * y ;

            return result ;

        }

 

 

 

출처 | Java의 정석 (남궁 성)

728x90