메소드


클래스의 일원, 메소드

자바에서의 클래스는 멤버로 속성을 표현하는 필드(field)와 동작을 표현하는 메소드(method)를 가집니다. 이 글에서 소개할 개념은 바로 클래스의 일원인 메소드(method)입니다. 자바의 메소드는 다른 언어에서 이야기하는 함수(function)과 같은 개념으로 볼 수 있습니다. 그러나 자바는 객체지향 언어이므로, 메소드를 클래스 내에서 작성하고 사용합니다.


메소드란 무엇인가?

메소드는 어떠한 특정 작업을 수행하기 위한 명령문의 집합입니다. 메소드를 사용하기 위해서는 정의가 필요하고, 또 정의한 메소드를 호출하는 작업이 필요합니다.
정의란 메소드가 실행하는 특정 작업을 작성하는 것이고, 호출이란 정의된 메소드를 실행하는 것입니다.

메소드를 왜 쓰는가?

메소드를 정의하고 호출하여 사용할 때 얻을 수 있는 이점은 다음과 같습니다.

  1. 불필요하게 중복되는 코드의 반복적인 프로그래밍을 피할 수 있습니다. 이렇게 함으로서 코드의 가독성이 좋아집니다.
  2. 코드에 문제가 생길 경우 문제가 되는 메소드만 수정하면 됨으로써 유지보수에 도움이 됩니다.

우리가 흔히 알고있는 System.out.println() 역시 메소드로서 미리 정의된 메소드를 호출하는 것입니다.


메소드의 구조와 정의

자바의 메소드 구조를 설명하기 위해 다음과 같은 예시를 준비했습니다.

자바의 메소드는 크게 메소드 헤더메소드 바디로 나뉩니다. 이는 선언부실행 블록으로도 불립니다.
각각에는 다음과 같은 정보가 들어갑니다.

메소드 헤더(선언부)

수정자(Modifier)
수정자 혹은 제어자라고 하며, 해당 메소드의 메모리 할당 속성, 접근 권한을 등을 결정합니다. 위의 예시의 경우 public이므로 해당 메소드가 소속한 클래스를 인스턴스화하여 자바 프로젝트 어느 곳에서든 호출이 가능한 메소드이다.

 

반환값 자료형(Return Value Type)
메소드가 호출의 결과를 반환할 때의 반환값의 자료형을 결정합니다. 메소드에 따라 반환값이 있을 수도 있고 없을 수도 있습니다. 그러나 자료형이 명시되어 있다면 반드시 호출한 곳으로 돌려줄 값이 있어야 합니다.
반환할 값이 없다면 void로 명시합니다.

 

메소드 이름(Method Name)
해당 메소드를 식별할 수 있는 이름입니다. 자바에서는 다음과 같은 사항에 주의하면 됩니다.

  • 숫자로 시작하면 안 되며, $와 _를 제외한 특수 문자를 사용하지 말아야 한다.
  • 관례적으로 메소드명은 소문자로 작성하고, 서로 다른 단어가 혼합된 이름이라면 뒤이어 오는 단어의 첫머리 글자는 대문자로 작성한다. (이 규칙은 camelCase라는 명칭으로도 불린다.)

매개변수(Parameters)
메소드 호출 시, 메소드가 기능을 수행할 때 필요한 값을 전달하기 위해 필요한 변수입니다. 메소드를 호출할 때 전달된 값은 인자(Argument)라고 합니다.
전달할 값이 없다면 빈칸으로 놔 둡니다.

메소드 바디(실행 블록)

반환값(Return Value)
메소드가 기능을 수행한 후 반환하는 값입니다. 반환값의 자료형이 void일 경우 return은 생략됩니다. (반드시 생략되는 것은 아닙니다.)


메소드의 동작

위의 내용을 미루어 보아 메소드의 동작은 다음과 같습니다.

  1. 미리 정의한 메소드의 이름으로 메소드를 호출하고, 호출할 때 입력값으로 인자를 전달합니다.
    1. 매개변수가 정의되지 않았을 경우 빈칸으로 둡니다. 예시) sum();
  1. 매개변수를 통하여 입력값을 받고, 미리 정의한 내용대로 메소드의 기능을 수행한 후 결과값을 return으로 반환합니다.
    1.  반환값의 자료형이 void일 경우 return을 생략할 수 있습니다.
public void main() {
    int a = 1;
    int b = 2;
    int result = sum(a, b); // 해당 위치에서 호출, 변수 a와 b를 인자로 전달
    System.out.println(result); // 3
}

public int sum(int a, int b) {
    return a+b; // 메소드를 수행하고 a+b라는 결과값을 반환
}

메소드의 책임

소프트웨어 전문가 로버트 C. 마틴은 저서 클린 코드에서 함수를 정의할 때에 있어서 다음과 같은 충고를 남겼습니다.

함수는 한 가지를 해야한다. 그 한 가지를 잘 해야 한다. 그 한 가지만을 해야 한다.

그러면서 함수를 만드는 규칙은 작게, 더 작게 만드는 것이라고 표현한다.

하나의 메소드가 너무 많은 역할을 하면 안되고, 일관적인 추상화 수준을 유지하여 하나의 역할만을 해야한다고 한다.


문제

다음 문제를 읽고 답안을 작성하세요.

  1. 두 정수 a, b를 인자로 받고, 두 정수를 곱한 결과를 정수로 반환하는 메소드 이름이 multiple인 메소드를 Java 코드로 정의하세요. (단, 접근자는 public)
  2. 두 정수 a, b를 인자로 받고, 두 정수의 크기를 비교하여 a가 더 크면 -1, b가 더 크면 1, 서로 같으면 0을 반환하는, 메소드 이름이 compare인 메소드를 Java 코드로 정의하세요. (단, 접근자는 public)

출처

  • 생활코딩 자바 - 메소드 (https://opentutorials.org/course/1223/5369)
  • 신용권, 이것이 자바다: 신용권의 Java 프로그래밍 정복 (한빛미디어, 2015), 214-232p
  • 로버트 C. 마틴, 클린 코드 (2008)

+ Recent posts