[기본 개념] 1 | (2.3) 메서드 호출, RETURN 문
1 선언 위치에 따른 변수의 종류
2 클래스변수와 인스턴스변수
3 메서드
4 메서드의 선언과 구현
5> 메서드의 호출
6> return문
7 JVM의 메모리구조
8 기본형 매개변수와 참조형 매개변수
9 참조형 반환타입
10 재귀호출
11 클래스 메서드와 인스턴스 메서드
12 클래스 멤버와 인스턴스 멤버간의 호출
5. 메서드의 호출
메서드를 호출하는 방법은 다음과 같다.
메서드이름(값1, 값2, ...) ; // 메서드를 호출하는 방법
print99danAll ( ) ; // void print99danAll ( )을 호출
int result = add(3, 5) ; // int add(int x, int y)를 호출하고, 결과를 result에 저장
인자(argument)와 매개변수(parameter)
메서드를 호출할 때 괄호( )안에 지정해준 값들을 '인자(argument)' 또는 '인수'라고 하는데 인자의 개수와 순서는 호출된 메서드에 선언된 매개변수와 일치해야 한다. 또한 인자의 타입은 매개변수의 타입과 일치하거나 자동 형변환이 가능한 것이어야 한다.
메서드의 실행흐름
같은 클래스 내의 메서드끼리는 참조변수를 사용하지 않고도 서로 호출이 가능하지만 static메서드는 같은 클래스 내의 인스턴스 메서드를 호출할 수 없다.
다음은 두 개의 값을 매개변수로 받아서 사칙연산을 수행하는 4개의 메서드를 가진 MyMath클래스를 정의한 것이다.
public class MyMath {
long add(long a, long b) {
long result = a+b;
return result;
// return a + b; // 위 두줄을 한줄로 간단히 할 수 있다.
}
long subtract(long a, long b) { return a - b; }
long multiply(long a, long b) { return a * b; }
double divide(double a, double b) {return a / b; }
}
MyMath클래스의 'add(long a, long b)'를 호출하기 위해서는 먼저 'MyMath mm = new MyMath( ) ;'와 같이 해서, MyMath클래스의 인스턴스를 생성한 다음 참조변수 mm을 통해야 한다.
메서드가 호출되면 지금까지 실행 중이던 메서드는 실행을 잠시 멈추고 호출된 메서드의 문장이 실행된다.
예제/MyMathTest.java
class MyMathTest {
public static void main(String[] args) {
MyMath mm = new MyMath(); // 먼저 인스턴스를 생성한다.
long result1 = mm.add(5L, 3L); // 메서드를 호출한다.
long result2 = mm.subtract(5L, 3L);
long result3 = mm.multiply(5L, 3L);
double result4 = mm.divide(5L, 3L); // double대신 long값으로 호출했지만 double로 자동형변환
System.out.println("add(5L, 3L) = " + result1);
System.out.println("subtract(5L, 3L) = " + result2);
System.out.println("multiply(5L, 3L) = " + result3);
System.out.println("divide(5L, 3L) = " + result4);
}
}
class MyMath {
long add(long a, long b) {
long result = a+b;
return result;
// return a + b; // 위 두줄을 한줄로 간단히 할 수 있다.
}
long subtract(long a, long b) { return a - b; }
long multiply(long a, long b) { return a * b; }
double divide(double a, double b) {return a / b; }
}
실행결과
add(5L, 3L) = 8
subtract(5L, 3L) = 2
multiply(5L, 3L) = 15
divide(5L, 3L) = 1.6666666666666667
사칙연산을 위한 4개의 메서드가 정의되어 있는 MyMath클래스를 이용한 예제이다. 여기서 눈여겨봐야 할 곳은 divide(double a, double b)를 호출하는 부분이다. divide메서드에 선언된 매개변수 타입은 double형인데, 이와 다른 long형의 값인 5L과 3L을 사용해서 호출하는 것이 가능하다. 이와 마찬가지로 add(long a, long b)메서드에도 매개변수 a, b에 int형의 값을 넣어도 add(5, 3)과 같이 호출하는 것이 가능하다.
6. return문
return문은 현재 실행 중인 메서드를 종료하고 호출한 메서드로 되돌아간다. 반환값의 유무에 관계없이 모든 메서드에는 적어도 하나의 return문이 있어야 한다. 그런데 반환타입이 void인 경우, return문 없어도 아무 문제없던 이유는 컴파일러가 메서드 마지막에 'return ;'을 자동으로 추가해주었기 때문이다.
void print99dan (int dan) {
for (int i = 1 ; i <= 9 ; i++) {
System.out.printf("%d * %d = %d%n", dan, i, dan * i) ;
}
return; // 반환타입이 void이므로 생략 가능
}
그러나 반환타입이 void가 아닐 때 return문이 없으면 컴파일 에러(error: missing return statement)가 발생한다.
반환값(return value)
return문의 반환값으로 주로 변수가 오긴 하지만 수식에 대한 결과가 반환될 수도 있다.
int add(int x, int y) { int result = x + y ; return result ; } |
<---> | int add(int x, int y) { return x + y ; } |
아래의 diff메서드는 두 개의 정수를 받아서 그 차이를 절댓값으로 반환한다. 오른쪽 코드는 메서드 abs를 호출하고 그 결과를 받아서 반환한다. 이때 메서드 abs의 반환타입이 메서드 diff의 반환타입과 일치하기에 가능하다.
int diff(int x, int y) { int result = abs(x - y) ; return result ; } |
<---> | int add(int x, int y) { return abs(x - y) ; } |
매개변수의 유호성 검사
메서드의 구현부{ }를 작성할 때, 매개변수의 값이 적절한 것인지 확인해야 한다. 타입만 맞으면 어떤 값도 넘어올 수 있기 때문에 가능한 모든 경우의 수에 대해 고민하고 그에 대비한 코드를 작성해야 한다.
아래에 정의된 메서드 divide는 매개변수 x를 y로 나눈 결과를 실수(float타입)로 반환하는데, 0으로 나누는 것은 금지되어 있기 때문에 y의 값이 0이면 return문을 이용해서 작업을 중단하고 메서드를 빠져나와야 한다.
float divide(int x, int y) {
// 작업을 하기 전에 나누는 수 (y)가 0인지 확인한다.
if (y==o) {
System.out.println("0으로 나눌 수 없습니다.") ;
return 0 ; // 매개변수가 유효하지 않으므로 메서드를 종료한다.
}
return x / (float) y ;
}
출처 | Java의 정석(남궁 성)
'💠프로그래밍 언어 > Java' 카테고리의 다른 글
[기본 개념] 1 | (2.5) 참조형 반환타입, 재귀호출 (0) | 2021.08.23 |
---|---|
[기본 개념] 1 | (2.4) JVM 메모리, 기본형/참조형 매개변수 (0) | 2021.08.18 |
[기본 개념] 1 | (2.2) 메서드 선언/구현 (0) | 2021.08.17 |
[기본 개념] 1 | (2.1) 선언 위치에 따른 변수 종류, 클래스/인스턴스 변수 (0) | 2021.08.17 |
[기본 개념] 1 | (1.3) 객체 배열, 클래스의 정의 (0) | 2021.08.11 |