Java 기본 과정

메소드

지금까지 배운 것으로도 얼마든지 프로그램을 만들 수 있다. 반복문, 조건문, 변수, 상수와 같은 것들은 사실상 프로그램을 만드는 가장 중요한 도구들이라고 할 수 있다. 지금부터 배우게 될 메소드나 객체지향과 같은 개념들은 웅장하고, 결함이 없고, 유지보수가 쉬운 애플리케이션을 만들기 위한 기법들이라고 할 수 있다. 이것들 없이도 프로그램을 만들 수는 있지만, 이것들 없이 규모있는 애플리케이션을 만든다는 것은 현실적으로 어려운 일이다. 지금까지 만드는 방법을 배웠다면 이제부터는 잘 만드는 방법을 익히는 것이라고 해도 과언이 아니다.

메소드

메소드(method)는 코드를 재사용할 수 있게 해준다. 이번 시간에는 경제적으로 로직을 작성하는 방법에 대해서 알아볼 것이다.

메소드의 형식

여러분은 이미 메소드를 만들고 사용했다. 아래 그림을 보자.

 

이것이 메소드다. 지금까지 수없이 만들었던 저 main이라고 하는 것이 바로 메소드인 것이다. 위의 그림을 자세히 보면 핑크색으로 된 부분과 검은색으로 된 부분이 있다. 이 중에서 검은색으로 된 부분은 이번 토픽에서 다루지 않을 개념이다. 여러분이 주목할 것은 핑크색으로 강조한 부분이다.

 

메소드의 정의와 호출

직접 메소드를 만드는 것을 정의라고 하고, 만들어진 메소드를 실행하는 것을 호출이라고 한다.

 

위의 예제는 numbering이라는 이름의 메소드를 정의하고 있다. 이 메소드는 main이라는 이름의 메소드 안에서 호출되고 있다. 위의 코드는 아래의 코드와 정확하게 동일한 의미를 갖는다.

핑크색으로 표시한 부분의 코드를 numbering이라는 이름의 메소드로 묶어서 외부로 분리한 것이다. 그리고 메소드 numbering의 로직이 필요할 때 numbering();이라고하면 메소드 numbering의 로직이 실행된다.

main

main 메소드는 규칙이다. 여러분이 만들고 싶은 프로그램이 있다면 여러분은 반드시 public static void main(String[] args)가 이끄는 중괄호 안에 실행되기를 기대하는 로직을 위치시켜야 한다.

그렇게 코드를 작성하면 자바를 실행할 때 자바는 여러분이 작성한 main 메소드를 최초로 실행하게 되는 것이다.  

메소드가 없다면

반복문 수업에서 0부터 9까지 출력하는 애플리케이션을 만들었다. 그런데 0부터 9까지를 5번 출력해야 한다면 어떻게 해야 할까?  같은 로직을 여러 번 추가시켜야 한다.

 

하지만 메소드를 사용한다면 이러한 문제를 현저히 줄일 수 있다. 로직은 단 한 번만 등장한다. 이러한 것을 재활용성이라고 한다.

 

입력과 출력

살아있는 것들은 외부의 자극에 따라서 반응한다. 외부의 자극이 입력이라면 반응은 출력이라고 할 수 있다.

우리가 아는 쓸모 있는 대부분의 프로그램이 사용자의 입력에 따라서 다른 결과를 출력한다. 메소드는 프로그램 안에서 동작하는 하나의 작은 프로그램이라고 할 수 있다.

위에서 살펴본 numbering이라는 메소드는 항상 똑같은 동작만을 반복한다. 이것도 재활용이라는 측면에서는 장점이 있지만, 입력 값에 따라서 출력 값을 달리 제공한다면 더욱 쓸모 있는 프로그램이 될 수 있을 것이다.

매개변수와 인자

메소드의 입력 값은 매개변수(parameter)를 통해서 이루어진다. 위의 예제를 조금 개선해보자.  

아래는 매개변수의 값에 따라서 다른 결과가 출력되고 있다. 입력을 통해서 메소드의 동작을 제어하고 있다.  

메소드 numbering의 괄호 안에 위치한 숫자 5는 이 메소드가 호출될 때 limit이라는 변수의 값이 된다. 이 값은 메소드 numbering의 중괄호 안에서만 사용할 수 있다.

여기서 limit이라는 변수는 메소드 numbering의 정의 부에 있는 로직들에게 5라는 값을 전달하고 있다. 호출에서 입력한 값을 로직으로 매개 한다는 의미에서 이러한 변수를 매개변수라고 부른다. 영어로는 parameter. 그리고 메소드를 호출할 때 전달된 값인 5 '인자' 영어로는 argument라고 한다. 관습적으로는 매개변수와 인자를 구분하지 않고 부르는 경우도 많다.

 

복수의 인자

만약 메소드로 여러개의 입력값을 전달하고 싶다면 어떻게 해야 할까? 다음 예제는 위의 예제를 개선해서 출력할 숫자의 시작 값과 마지막 값을 입력값으로 전달하는 예제다.  

 

public static void numbering(int init, int limit) {

    int i = init;

    while (i < limit) {

        System.out.println(i);

        i++;

    }

}

이 메소스를 호출할 때는 매개변수의 순서대로 인자를 배치하면 된다.

 

return

위의 예제는 화면에 숫자를 출력한다. 물론 이것도 출력이지만 좀 더 활용도가 높은 출력 방법이 있다. 아래 예제를 보자.  

 

public static String numbering(int init, int limit) {

int i = init;

// 만들어지는 숫자들을 output이라는 변수에 담기 위해서 변수에 값을 주었다.

String output = "";

while (i < limit) {

    // 숫자를 화면에 출력하는 대신 변수 output 담았다.

    output += i;

    i++;

}

// 문자열을 메소드 외부로 반환하려면 아래와 같이 return 키워드 뒤에 반환하려는 값을 배치하면 된다.

return output;

}

 

메소드 내에서 사용한 return return 뒤에 따라오는 값을 메소드의 결과로 반환한다. 동시에 메소드를 종료 시킨다. 한가지 잊지 말아야 할 점은 return을 통해서 반환할 값의 데이터 형식을 메소드의 이름 앞에 명시해주어야 한다는 것이다.

이것은 JavaScript PHP와 같은 언어들에는 없는 부분이다. 만약 반환 값이 없다면 아래와 같이 void를 적어준다.

굳이 이렇게 복잡하게 데이터를 리턴하는 이유는 무엇일까결론적으로 말하면 부품으로서의 가치를 높이기 위해서라고 할 수 있다.

만약 여러분이 이 메소드가 출력한 값을 화면에 출력하는 것이 아니라 파일에 기록하고 싶다면 어떻게 해야 할까? 또는 이메일로 보내고 싶다면 어떻게 해야 할까? 3개의 메소드를 만들고 용도에 따라서 코드를 재작성하는 것도 좋은 방법이다. 하지만 더 좋은 방법은 숫자를 출력하고, 숫자를 파일에 기록하고, 숫자로 이메일을 보내는 작업으로부터 숫자를 계산하는 로직을 분리하는 것이다.  

return메소드를 중단시키는 역할도 한다.  

 

public static int one() {

    return 1;

    return 2;

    return 3;

}

위의 코드는 컴파일조차 되지 않는다. 왜냐하면, return 은 메소드를 종료시키는 역할을 하므로 return이 처음 등장한 이후의 구문은 실행되지 않기 때문이다.

하지만 아래의 예제는 문제가 전혀 없다.

public static String num(int i) {

  if(i==0){

    return "zero";

  } else if(i==1){

    return "one";

  } else if(i==2){

    return "two";

  }

  return "none";

}

 

return이 여러 번 등장하지만 return중복적으로 실행될 가능성이 없기 때문이다. return "none";를 제거하면 컴파일이 되지 않을 것이다

 

복수의 리턴

메소드는 여러 개의 입력 값을 가질 수 있다. 그렇다면 여러 개의 값을 출력하고 싶다면? 자바는 문법적으로 그런 기능을 제공하지 않는다. 복수의 리턴을 위해서는 하나의 변수에 여러 개의 값을 담아서 출력하면 된다. 배열을 사용하거나 사용자 정의 변수(클래스)를 사용하면 된다.  

 

댓글

댓글 본문