메서드 시작
- 두 숫자를 입력 받아서 더하고 출력하는 단순한 기능을 개발해보자. 먼저
1 + 2를 수행하고, 그 다음으로 10 + 20을 수행할 것이다.
int a = 1;
int b = 2;
int sum1 = a + b;
int x = 10;
int y = 20;
int sum2 = x + y;
- 계산1, 계산2 둘 다 변수를 두 개 선언하고, 어떤 연산을 수행하는지 출력하고, 두 변수를 더해서 결과를 구한다. 만약 프로그램의 여러 곳에서 이와 같은 게산을 반복한다면? 같은 코드를 여러번 반복해서 작성해야한다. 더 나아가 어떤 연산을 수행하는지 출력하는 부분을 변경하거나 또는 제거하고 싶다면 해당 코드를 다 찾아다니며 모두 수정해야한다. 이런 문제를 어떻게 깔끔하게 해결할 수 있을까?
함수 정의
add(a, b) = a + b
- 이름이
add이고 a,b라는 두 값을 받는 함수이다. 그리고 이 함수는 a+b연산을 수행한다.
함수 사용
add(1,2) -> 결과: 3
add(5,6) -> 결과: 11
add(3,5) -> 결과: 8
- 함수에 값을 입력하면, 함수가 가진 연산을 처리한 다음 결과를 출력한다. 여기서 단순히
a+b라는 연산을 수행한다.
- 여러번 같은 계산을 해야 한다면 지금처럼 함수를 만들어두고(정의), 필요한 입력 값을 넣어서 해당 함수를 호출하면 된다. 그러면 계산된 결과가 나온다.
- 함수는 마치 블랙박스와 같아서 함수를 호출할 때 외부에서 필요한 값만 입력하면 된다. 그러면 계산된 결과가 출력된다.
- 여기서 핵심은 함수를 한번 정의해두면 계속해서 재사용할 수 있다는 점이다!
메서드 사용
java에서는 함수를 메서드(Method)라 한다. 메서드도 함수의 한 종류라고 생각하면 된다.
int sum1 = add(5, 10);
int sum2 = add(15, 20);
public static int add(int a, int b){
int sum = a + b;
return sum;
}
메서드 정의
public static int add(int a, int b){
int sum = a + b;
return sum;
}
- 이 부분이 바로 메서드이다. 이것을 함수를 정의하는 것과 같이, 메서드를 정의한다고 표현한다. 메서드에 값을 입력하면, 어떤 연산을 처리한 다음에 결과를 반환한다.
- 특별한 기능을 가진
코드의 집합 정도로 이해한다.
- 메서드는 크게
메서드 선언과 메서드 본문으로 나눌 수 있다.
메서드 선언(Method Declaration)
public static int add(int a, int b)
- 메서드의 선언 부분으로, 메서드 이름, 반환 타입, 파라미터 목록을 포함한다. 이름 그대로 이런 메서드가 있다고 선언하는 것이다. 메서드 선언 정보를 통해 다른 곳에서 해당 메서드를 호출할 수 있다.
public static
▶️ public: 다른 클래스에서 호출할 수 있는 메서드라는 뜻이다.
▶️ static: 객체를 생성하지 않고 호출할 수 있는 정적 메서드 라는뜻이다.
▶️ 두 키워드의 자세한 내용은 뒤에서 다루며, 지금은 단순히 메서드를 만들 때 둘을 사용해야 한다고 생각하자.
int add(int a, int b)
▶️ int: 반환 타입을 정의한다. 메서드의 실행 결과를 반환할 때 사용할 반환 타입을 지정한다.
▶️ add: 메서드에 이름을 부여한다. 이 이름을 통해 메서드를 호출할 수 있다.
▶️ (int a, int b): 메서드 호출 시 전달하는 입력 값을 정의한다. 이 변수들은 해당 메서드 안에서만 사용되며 이렇게 메서드 선언에 사용되는 변수를 영어로 파라미터, 한글로 매개변수라 한다.
메서드 본문(Method Body)
{
int sum = a + b;
return sum;
}
- 메서드가 수행해야 하는 코드 블록이다.
- 메서드를 호출하면 메서드 본문이 순서대로 실행된다.
- 메서드 본문은 블랙박스다. 메서드를 호출하는 곳에서는 메서드 선언은 알지만 메서드 본문은 모른다.
- 메서드의 샐행 결과를 반환시에는
return문 다음에 반환할 결과를 꼭 사용해야 한다. 해주지 않으면 결과를 반환해주지 않기 떄문이다.
메서드 호출
- 앞서 정의한 메서드를 호출해서 실행하려면 메서드 이름에 입력 값을 전달하면 된다. 보통 메서드를 호출한다고 표현한다.
int sum1 = add(5, 10);
int sum2 = add(15, 20);
int sum1 = add(5, 10);
int sum1 = 15
자세히 보면
public static int add(int a=5, int b=10){
int sum = a(5) + b(10);
return sum;
}
- 메서드 호출이 끝나면 더 이상 해당 메서드가 사용한 메모리를 낭비할 이유가 없다. 메서드 호출이 끝나며 사용한 파라미터 변수는 몰론이고, 그 안에서 정의한 코드 또한 제거된다.
메서드 용어정리
- 메서드 호출시 다음과 같이 메서드에 넘기는 값과 매개변수(파라미터)의 타입이 맞아야 한다. 몰론 넘기는 값과 매개변수(파라미터)의 순서와 갯수도 맞아야 한다.
호출: call("hello", 20)
메서드 정의: int call(String str, int age)
인수(Argumnet)
- 여기서
"hello", 20처럼 넘기는 값을 영어로 Argumnet(아규먼트), 한글로 인수 또는 인자라 한다. 메서드 내부로 들어가는 값이다. 실무에서도 사용한다.
매개변수(Parameter)
- 메서드 정의시 선언한 변수인
String str, int age를 매개변수, 파라미터라 한다. 메서드를 호출할 때 인수를 넘기면, 그 인수가 매개변수에 대입된다.
메서드 정의
public static int add(int a, int b) {
}
제어자 반환타입 메서드이름(매개변수 목록) {
메서드 본문
}
- 제어자(Modifier):
public, static과 같은 부분이다.
- 반환 타입(Return Type): 메서드가 실행 된 후 반환하는 데이터의 타입을 지정한다. 메서드가 값을 반환하지 않는 경우, 없다는 뜻의
void를 사용한다.
- 메서드 이름(Method name): 메서드의 이름이다. 이 이름은 메서드를 호출할때 사용한다.
- 매개 변수(Parameter): 메서드가 호출시 필요한 변수로 입력값이 필요 없는 메서드는 매개변수를 지정하지 않아도 된다 예)
add()
매개변수가 없거나 반환 타입이 없는 경우
public static void main(String[] args) {
printHeader();
System.out.println("프로그램이 동작합니다.");
printFooter();
}
public static void printHeader() {
System.out.println("= 프로그램을 시작합니다 =");
return;
}
public static void printHeader() {
System.out.println("= 프로그램을 시작합니다 =");
}
printHeader(),printFooter() 메서드는 매개변수가 없고, 반환 타입도 없다.
- 매개변수가 없는 경우
▶️ 선언: public static void printHeader()와 같이 매개변수를 비워두고 정의하면 된다.
▶️ 호출: printHeader();와 같이 인수를 비워두고 호출하면 된다.
- 반환 타입이 없는 경우
▶️ 선언: public static void printHeader()와 같이 반환 타입을 void로 정의하면 된다.
▶️ 호출: printHeader();와 같이 반환 타입이 없으므로 메서드만 호출하고 반환 값을 받지 않으면 된다.
void와 return 생략
- 모든 메서드는 항상
return을 호출해야 한다. 그런데 반환 타입 void의 경우에는 예외로 printFooter()와 같이 생략해도 된다. 자바 컴파일러가 반환 타입이 없는 경우에는 return을 마지막줄에 넣어준다. 참고로 return을 만나면 해당 메서드는 종료된다.