메소드(함수)
•
메소드는 입력을 받아서 처리를 하고 결과를 반환하는 가상적인 상자와 같다.
•
메소드는 클래스의 멤버 함수이다.
•
메소드 앞에 접근 지정자는 public, private, protected, default 4가지 유형으로, 메소드가 다른 클래스에서 호출될 수 있는지 지정하기 위해 사용한다.
매개변수(파라미터)와 인수
•
매개변수(parameter)는 메소드에 입력으로 전달된 값을 받는 변수를 의미하고, 인수(arguments)는 메소드를 호출할 때 전달하는 입력값을 의미한다.
int sum = add(25, 47); // 25, 47이 인수
Java
복사
int add(int x, int y) { // int x, int y가 매개변수
return x + y;
}
Java
복사
메소드의 구조
리턴자료형 메소드명(입력자료형1 매개변수1, 입력자료형2 매개변수2, ...) {
...
return 리턴값; // 리턴자료형이 void 인 경우에는 return 문이 필요없다.
}
Java
복사
•
리턴자료형은 메소드 수행 후 돌려줄 값의 자료형을 의미한다. 메소드의 리턴값은 return 이라는 명령을 사용한다.
•
메소드는 입출력 유무에 따라 다음과 같이 4가지로 분류할 수 있다.
◦
입력과 출력이 모두 있는 메소드
◦
입력과 출력이 모두 없는 메소드
◦
입력은 없고 출력은 있는 메소드
◦
입력은 있고 출력은 없는 메소드
•
메소드 관련 예제)
public static void main(String[] args) {
System.out.println("프로그램의 시작");
hiEveryone(12); // 변수 age로 12 전달 -> hiEveryone() 메소드 호출
hiEveryone(13);
System.out.println("프로그램의 끝");
}
public static void hiEveryone(int age) {
System.out.println("좋은 아침입니다.");
System.out.println("제 나이는 " + age + "세 입니다.");
}
Java
복사
*메서드의 호출
메서드를 정의했어도 호출되지 않으면 아무 일도 일어나지 않는다. 메서드를 호출해야만 구현부{}의 문장들이 수행된다. 메서드를 호출하는 방법은 다음과 같다.
main메서드는 프로그램 실행 시 OS에 의해 자동적으로 호출된다.
메서드이름(값1, 값2, ...); // 메서드를 호출하는 방법
hiEveryone(); // void hiEveryone()을 호출
int result = add(3, 5); // int add(int x, int y)를 호출하고, 결과를 result에 저장
Java
복사
2개 이상의 매개변수와 인수(parameter, argument)
메서드를 호출할 때 괄호() 안에 지정해준 값들을 ‘인수(argument)’ 또는 ‘인자’라고 하는데, 인자의 개수와 순서는 호출된 메서드에 선언된 매개변수와 일치해야 한다.
그리고 인수는 메서드가 호출되면서 매개변수에 대입되므로, 인자의 타입은 매개변수의 타입과 일치하거나 자동 형변환이 가능한 것이어야 한다.
만일 아래와 같이 메서드에 선언된 매개변수의 개수보다 많은 값을 괄호()에 넣거나 타입이 다른 값을 넣으면 컴파일러가 에러를 발생시킨다.
int result = add(1, 2, 3); // 에러. 메서드에 선언된 매개변수의 개수가 다름
int result = add(1.0, 2.0); // 에러. 메서드에 선언된 매개변수의 타입이 다름
Java
복사
반환 타입이 void가 아닌 경우, 메서드가 작업을 수행하고 반환한 값을 대입연자로 변수에 저장하는 것이 보통이지만, 저장하지 않아도 문제가 되지 않는다.
int result = add(3,5); // int add(int x, int y)의 호출결과를 result에 저장
add(3, 5); // OK. 메서드 add가 반환한 결과를 사용하지 않아도 된다.
Java
복사
*반환
반환타입(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이므로 생략가능. 컴파일러가 자동추가
}
Java
복사
그러나 반환타입이 void가 아닌 경우, 즉 반환값이 있는 경우, 반드시 return문이 있어야 한다. return문이 없으면 컴파일 에러(error: missing return statement)가 발생한다.
int multiply(int x, int y){
int result = x * y;
return result; // 반환 타입이 void가 아니므로 생략 불가
}
Java
복사
아래의 코드는 두 값 중에서 큰 값을 반환하는 메서드이다. 이 메서드의 리턴타입이 int이고 int타입의 값을 반환하는 return문이 있지만, return문이 없다는 에러가 발생한다.
왜냐하면 if문 조건식의 결과에 따라 return문이 실행되지 않을 수도 있기 때문이다.
int max(int a, int b){
if(a > b)
return a; // 조건식이 참일 때만 실행된다.
}
Java
복사
그래서 이런 경우 다음과 같이 if문의 else블럭에 return문을 추가해서, 항상 결과값이 반환되도록 해야한다.
int max(int a, int b) {
if(a > b)
return a; // 조건식이 참일 때 실행된다.
else
return b; // 조건식이 거짓일 때 실행된다.
}
Java
복사
반환 값
return문의 반환값으로 주로 변수가 오긴 하지만 항상 그런 것은 아니다. 아래 왼쪽의 코드는 오른쪽과 같이 간략히 할 수 있는데, 오른쪽의 코드는 return문의 반환값으로 ‘x+y’라는 수식이 적혀있다. 그렇다고 해서 수식이 반환되는 것은 아니고, 이 수식을 계산한 결과가 반환된다.
int add(int x, int y){
int result = x + y;
return result;
}
Java
복사
int add(int x, int y){
return x + y;
}
Java
복사
수학에서처럼, result의 값이 ‘x+y’와 같으므로 result대신 ‘x+y’를 쓸 수 있다고 생각하면 이해하기 쉽다.
예를 들어 매개변수 x와 y의 값이 각각 3과 5라면, ‘return x+y;’는 다음과 같은 계산과정을 거쳐서 반환값은 8이 된다.
return x + y;
-> return 3 + 5;
-> return 8;
Java
복사
아래의 diff메서드는 두 개의 정수를 받아서 그 차이를 절대값으로 반환한다. 오른쪽 코드 역시 메서드를 반환하는 것이 아니라 메서드 abs를 호출하고, 그 결과를 받아서 반환한다. 메서드 abs의 변환타입이 메서드 diff의 반환타입과 일치하기 때문에 이렇게 하는 것이 가능하다는 것에 주의하자.
int diff(int x, int y){
int result = abs(x-y);
return result;
}
Java
복사
int diff(int x, int y) {
return abs(x-y);
}
Java
복사
간단한 메서드의 경우 if문 대신 조건연산자를 사용하기도 한다. 메서드 abs는 입력받은 정수의 부호를 판단해서 음수일 경우 부호연산자(-)를 사용해서 양수로 변환한다.
int abs(int x) {
if(x>=0) {
return x;
}else {
return -x;
}
}
Java
복사
int abs(int x){
return x>=0? x : -x ;
}
Java
복사