Java - 메서드는 무엇인가?

김영한님의 Java 강의로 기초다지기 - 메서드란?

Posted by Warner on December 7, 2023

메서드의 시작

만약 프로그램의 여러 곳에서 같은 계산을 반복해야 한다면? 같은 코드를 여러번 반복해서 작성해야 할 것이다.
더 나아가서 어떤 연산을 수행하는지 출력하는 부분을 변경하거나 또는 제거하고 싶다면 해당 코드를 다 찾아다니면서 모두 수정해야 할 것이다.

이런 문제를 어떻게 깔끔하게 해결할 수 있을까?

method.png

함수 정의 add(a, b) = a + b

  • 이름이 add 이고, a, b 라는 두 값을 받는 함수이다. 그리고 이 함수는 a + b 연산을 수행한다.

함수 사용

add(1,2) -> 결과:3
add(5,6) -> 결과:11
add(3,5) -> 결과:8
  • 함수를 한번 정의해두면 계속해서 재사용할 수 있다.

메서드 사용

자바에서는 함수를 메서드(Method)라 한다

public class Method1Ref {
    public static void main(String[] args) {
        int sum1 = add(1, 2);
        System.out.println("sum1 = " + sum1);

        int sum2 = add(10, 20);
        System.out.println("sum2 = " + sum2);
    }

    private static int add(int a, int b) {
        return a + b;
    }
}

메서드 정의

private static int add(int a,int b){
    return a+b;
}

이 부분이 바로 메서드이다.

메서드는 크게 메서드 선언메서드 본문으로 나눌 수 있다.

메서드 선언(Method Declaration)

public static int add(int a,int b)

메서드 선언 부분으로, 메서드 이름, 반환 타입, 매개변수(파라미터) 목록을 포함한다.

메서드 본문(Method Body)

return a+b;
  • 메서드가 수행해야 하는 코드 블록이다.
  • 메서드 본문은 블랙박이다. 메서드를 호출하는 곳에서는 메서드 선언은 알지만 메서드 본문은 모른다.

메서드 호출과 용어정리

메서드를 호출할 때는 다음과 같이 메서드에 넘기는 값과 매개변수(파라미터)의 타입이 맞아야 한다. 물론 넘기는 값과 매개변수(파라미터)의 순서와 갯수도 맞아야 한다.

호출:call("hello",20)
메서드 정의:int call(String str,int age)

인수(Argument) 여기서 “hello”, 20 처럼 넘기는 값을 영어로 Argument(아규먼트), 한글로 인수 또는 인자라 한다.
실무에서는 아규먼트, 인수, 인자라는 용어를 모두 사용한다.

매개변수(Parameter) 메서드를 정의할 때 선언한 변수인 String str, int age를 매개변수, 파라미터라 한다.
메서드를 호출할 때 인수를 넘기면, 그 인수가 매개변수에 대입된다.
실무에서는 매개변수, 파라미터 용어를 모두 사용한다.

메서드 정의

public static int add(int a,int b){
    //메서드 본문, 실행 코드
}
제어자 반환타입 메서드이름(매개변수 목록){
    메서드 본문
}
  • 제어자(Modifier): public , static 과 같은 부분이다. 제어자는 뒤에서 설명한다. 지금은 항상 public static 키워드를 입력하자.
  • 반환 타입(Return Type): 메서드가 실행 된 후 반환하는 데이터의 타입을 지정한다. 메서드가 값을 반환하지 않는 경우, 없다는 뜻의 void 를 사용해야 한다. 예) void print( String str)
  • 메서드 이름(Method Name): 메서드의 이름이다. 이 이름은 메서드를 호출하는 데 사용된다.
  • 매개변수(Parameter): 입력 값으로, 메서드 내부에서 사용할 수 있는 변수이다. 매개변수는 옵션이다. 입력값이 필요 없는 메서드는 매개변수를 지정하지 않아도 된다. 예) add()
  • 메서드 본문(Method Body): 실제 메서드의 코드가 위치한다. 중괄호 {} 사이에 코드를 작성한다.

반환 타입

반환 타입이 있으면 반드시 값을 반환해야 한다.

반환 타입이 있는 메서드는 반드시 return 을 사용해서 값을 반환해야 한다.

return 문을 만나면 그 즉시 메서드를 빠져나간다.

메서드 오버로딩

다음과 같은 메서드를 만들고 싶다.

  • 두 수를 더하는 메서드
  • 세 수를 더하는 메서드

이 경우 둘다 더하는 메서드이기 때문에 가급적 같은 이름인 add를 사용하고 싶다.
자바는 메서드의 이름 뿐만 아니라 매개변수 정보를 함께 사용해서 메서드를 구분한다.
따라서 다음과 같이 이름이 같고, 매개변수가 다른 메서드를 정의할 수 있다.

add(int a,int b)
add(int a,int b,int c)
add(double a,double b)

이렇게 이름이 같고 매개변수가 다른 메서드를 여러개 정의하는 것을 메서드 오버로딩(Overloading)이라 한다.
오버로딩은 번역하면 과적인데, 과하게 물건을 담았다는 뜻이다. 따라서 같은 이름의 메서드를 여러개 정의했다고 이해하면 된다.

오버로딩 규칙

메서드의 이름이 같아도 매개변수의 타입 및 순서가 다르면 오버로딩을 할 수 있다. 참고로 반환 타임은 인정하지 않는다.

오버로딩 실패

int add(int a,int b)
double add(int a,int b)

메서드 시그니처(method signature)

메서드 시그니처 = 메서드 이름 + 매개변수 타입(순서)

자바 입장에서는 각각의 메서드를 고유하게 구분할 수 있어야한다. 따라서 메서드 이름이 같아도 메서드 시그니처가 다르면 다른 메서드로 간주한다.

변수명 vs 메서드명

변수 이름은 일반적으로 명사를 사용한다. 한편 메서드는 무언가 동작하는데 사용하기 때문에 일반적으로 동사로 시작한다.

  • 변수명 예): customerName , totalSum , employeeCount , isAvailable
  • 메서드명 예): printReport() , calculateSum() , addCustomer() , getEmployeeCount() , setEmployeeName()

메서드 사용의 장점

  • 코드 재사용: 메서드는 특정 기능을 캡슐화하므로, 필요할 때마다 그 기능을 다시 작성할 필요 없이 해당 메서드를 호출함으로써 코드를 재사용할 수 있다.

  • 코드의 가독성: 이름이 부여된 메서드는 코드가 수행하는 작업을 명확하게 나타내므로, 코드를 읽는 사람에게 추가적인 문맥을 제공한다.

  • 모듈성: 큰 프로그램을 작은, 관리 가능한 부분으로 나눌 수 있다. 이는 코드의 가독성을 향상시키고 디버깅을 쉽게 만든다.

  • 코드 유지 관리: 메서드를 사용하면, 코드의 특정 부분에서 문제가 발생하거나 업데이트가 필요한 경우 해당 메서드만 수정하면 된다. 이렇게 하면 전체 코드 베이스에 영향을 주지 않고 변경 사항을 적용할 수 있다.

  • 재사용성과 확장성: 잘 설계된 메서드는 다른 프로그램이나 프로젝트에서도 재사용할 수 있으며, 새로운 기능을 추가하거나 기존 기능을 확장하는 데 유용하다.

  • 추상화: 메서드를 사용하는 곳에서는 메서드의 구현을 몰라도 된다. 프로그램의 다른 부분에서는 복잡한 내부 작업에 대해 알 필요 없이 메서드를 사용할 수 있다.

  • 테스트와 디버깅 용이성: 개별 메서드는 독립적으로 테스트하고 디버그할 수 있다. 이는 코드의 문제를 신속하게 찾고 수정하는 데 도움이 된다.