메서드
‘메서드(method)’는 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것
메서드는 크게 두 부분, ‘선언부(header, 머리)’와 ‘구현부(body, 몸통)’로 이루어져 있다. 메서드를 정의한다는 것은 선언부와 구현부를 작성하는 것을 뜻하며 다음과 같은 형식으로 메서드를 정의한다.
메서드의 선언부
메서드 선언부는 ‘메서드의 이름’과 ‘매개변수 선언’, 그리고 ‘반환 타입’으로 구성되어 있으며, 메서드가 작업을 수행하기 위해 어떤 값들을 필요로 하고 작업의 결과로 어떤 타입의 값을 반환하는지에 대한 정보를 제공한다.
매개변수 선언
매개변수는 메서드가 작업을 수행하는데 필요한 값들(입력)을 제공받기 위한 것이며, 필요한 값의 개수만큼 변수를 선언하며 각 변수 간의 구분은 쉼표’,’를 사용한다. 한 가지 주의할 점은 일반적인 변수 선언과 달리 두 변수의 타입이 같아도 변수의 타입을 생략할 수 없다는 것이다.
int add(int x, int y) {...} // OK.
int add(int x, y) {...} // 에러. 매개변수 Y의 타입이 없다.
*메서드의 호출
메서드를 정의했어도 호출되지 않으면 아무 일도 일어나지 않는다. 메서드를 호출해야만 구현부{}의 문장들이 수행된다. 메서드를 호출하는 방법은 다음과 같다.
main메서드는 프로그램 실행 시 OS에 의해 자동적으로 호출된다.
메서드이름(값1, 값2, ...); // 메서드를 호출하는 방법
hiEveryone(); // void hiEveryone()을 호출
int result = add(3, 5); // int add(int x, int y)를 호출하고, 결과를 result에 저장
2개 이상의 매개변수와 인수(parameter, argument)
메서드를 호출할 때 괄호() 안에 지정해준 값들을 ‘인수(argument)’ 또는 ‘인자’라고 하는데, 인자의 개수와 순서는 호출된 메서드에 선언된 매개변수와 일치해야 한다.
그리고 인수는 메서드가 호출되면서 매개변수에 대입되므로, 인자의 타입은 매개변수의 타입과 일치하거나 자동 형변환이 가능한 것이어야 한다.
만일 아래와 같이 메서드에 선언된 매개변수의 개수보다 많은 값을 괄호()에 넣거나 타입이 다른 값을 넣으면 컴파일러가 에러를 발생시킨다.
int result = add(1, 2, 3); // 에러. 메서드에 선언된 매개변수의 **개수**가 다름
int result = add(1.0, 2.0); // 에러. 메서드에 선언된 매개변수의 **타입**이 다름
반환 타입이 void가 아닌 경우, 메서드가 작업을 수행하고 반환한 값을 대입연자로 변수에 저장하는 것이 보통이지만, 저장하지 않아도 문제가 되지 않는다.
int result = add(3,5); // int add(int x, int y)의 호출결과를 result에 저장
add(3, 5); // OK. 메서드 add가 반환한 결과를 사용하지 않아도 된다.
*반환
반환타입(return type)
메서드의 작업수행 결과(출력)인 ‘반환 값(return value)’의 타입을 적는다. 단, 반환 값이 없는 경우 반환 타입 ‘void’를 적어야 한다.
void : 함수의 반환(return) 값이 없다는 것을 의미.
return문
메서드의 반환 타입이 ‘void’가 아닌 경우, 구현부{} 안에 ‘return 반환 값;’이 반드시 포함되어 있어야 한다. 이 문장은 작업을 수행한 결과인 반환 값을 호출한 메서드로 전달하는데, 이 값의 타입은 반환 타입과 일치하거나 적어도 자동 형변환이 가능한 것이어야 한다.
여러 개의 변수를 선언할 수 있는 매개변수와 달리 return문은 단 하나의 값만 반환할 수 있는데, 메서드로의 입력(매개변수)은 여러 개일 수 있어도 출력(반환 값)은 최대 하나만 허용하는 것이다.
위의 코드에서 ‘return result;’는 변수 result에 저장된 값을 호출한 메서드로 반환한다. 변수 result의 타입이 int이므로 메서드 add의 반환 타입이 일치하는 것을 알 수 있다.
return문은 현재 실행 중인 메서드를 종료하고 호출한 메서드로 되돌아간다. 지금까지 반환 값이 있을 때만 return문을 썼지만, 원래는 반환 값의 유무에 관계없이 모든 메서드에는 적어도 하나의 return문이 있어야 한다. 그런데도 반환 타입이 void인 경우, return문 없이도 아무런 문제가 없었던 이유는 컴파일러가 메서드의 마지막에 ‘return;’을 자동적으로 추가해주었기 때문이다.
void printGugudan(int dan){
for(int i=1; i <= 9; i++){
System.out.printf("%d * %d = %d%n", dan, i, dan * i) ;
}
//return; // 반환 타입이 void이므로 생략가능. 컴파일러가 자동추가
}
그러나 반환타입이 void가 아닌 경우, 즉 반환 값이 있는 경우, 반드시 return문이 있어야 한다. return문이 없으면 컴파일 에러(error: missing return statement)가 발생한다.
int multiply(int x, int y){
int result = x * y;
return result; // 반환 타입이 void가 아니므로 생략 불가
}
아래의 코드는 두 값 중에서 큰 값을 반환하는 메서드이다. 이 메서드의 리턴 타입이 int이고 int타입의 값을 반환하는 return문이 있지만, return문이 없다는 에러가 발생한다.
왜냐하면 if문 조건식의 결과에 따라 return문이 실행되지 않을 수도 있기 때문이다.
int max(int a, int b){
if(a > b)
return a; // 조건식이 참일 때만 실행된다.
}
그래서 이런 경우 다음과 같이 if문의 else블럭에 return문을 추가해서, 항상 결괏값이 반환되도록 해야 한다.
int max(int a, int b) {
if(a > b)
return a; // 조건식이 참일 때 실행된다.
else
return b; // 조건식이 거짓일 때 실행된다.
}
반환 값
return문의 반환 값으로 주로 변수가 오긴 하지만 항상 그런 것은 아니다. 아래 왼쪽의 코드는 오른쪽과 같이 간략히 할 수 있는데, 오른쪽의 코드는 return문의 반환값으로 ‘x+y’라는 수식이 적혀있다. 그렇다고 해서 수식이 반환되는 것은 아니고, 이 수식을 계산한 결과가 반환된다.
int add(int x, int y){
int result = x + y;
return result;
}
↔
int add(int x, int y){
return x + y;
}
수학에서처럼, result의 값이 ‘x+y’와 같으므로 result대신 ‘x+y’를 쓸 수 있다고 생각하면 이해하기 쉽다.
예를 들어 매개변수 x와 y의 값이 각각 3과 5라면, ‘return x+y;’는 다음과 같은 계산과정을 거쳐서 반환 값은 8이 된다.
return x + y;
-> return 3 + 5;
-> return 8;
아래의 diff메서드는 두 개의 정수를 받아서 그 차이를 절댓값으로 반환한다. 오른쪽 코드 역시 메서드를 반환하는 것이 아니라 메서드 abs를 호출하고, 그 결과를 받아서 반환한다. 메서드 abs의 변환 타입이 메서드 diff의 반환 타입과 일치하기 때문에 이렇게 하는 것이 가능하다는 것에 주의하자.
diff(int x, int y){
int result = abs(x-y);
return result;
}
↔
int diff(int x, int y) {
return abs(x-y);
}
간단한 메서드의 경우 if문 대신 조건 연산자를 사용하기도 한다. 메서드 abs는 입력받은 정수의 부호를 판단해서 음수일 경우 부호 연산자(-)를 사용해서 양수로 변환한다.
int abs(int x) {
if(x>=0) {
return x;
}else {
return -x;
}
}
↔
int abs(int x){
return x>=0? x : -x ;
}
'Server > 자바의정석' 카테고리의 다른 글
[Java 입문] Static 메서드와 인스턴스 메서드 (0) | 2022.09.27 |
---|---|
[Java 입문] 매개변수 (0) | 2022.09.27 |
[Java 입문] 호출 스택 (0) | 2022.09.27 |
[Java 입문] 클래스와 객체 (0) | 2022.09.27 |
[Java 입문] 다차원 배열(multi-dimensional) (0) | 2022.09.27 |