메서드를 호출할 때 괄호( ) 안에 지정해준 값들을 ‘인자’ 또는 ‘인수’ 라고 한다.
인자의 개수와 순서는 호출된 메서드에 선언된 매개변수(파라미터) 와 일치해야 한다.
int result = add(1, 2, 3); // '인자' 또는 '인수'
그리고 인자는 메서드가 호출되면서 매개변수에 대입되므로,
인자의 타입은 매개변수의 타입과 일치하거나 자동 형변환이 가능한 것이어야 한다.
만일 메서드에 선언된 매개변수의 개수보다 많은 값을 괄호( ) 에
넣거나 타입이 다른 값을 넣으면 컴파일러가 에러를 발생 시킨다.
class aaa {
int add(int x, int y) {
int result = x + y;
return result;
}
}
class bbb {
public static void main(String[] args) {
int result = add(1, 2, 3); // 에러. 매개변수의 개수가 다름
int result = add(1.0, 2.0); // 매개변수의 타입이 다름
}
}
같은 클래스 내의 메서드끼리는 참조변수를 사용하지 않고도 서로 호출이 가능하지만
static 메서드는 같은 클래스 내의 인스턴스 메서드를 호출할 수 없다.
aaa 클래스의 add(int x, int y)를 호출하기 위해서는 먼저 aaa a = new aaa( ); 와 같이 해서,
aaa클래스의 인스턴스를 생성한 다음 참조변수 a을 통해서 해야 한다.
class aaa {
int add(int x, int y) {
int result = x + y;
return result;
}
}
class bbb {
public static void main(String[] args) {
aaa a = new aaa();
int result = a.add(5L, 3L);
}
}
호출 시에 입력된 값은 메서드의 매개변수에 대입되는 값이므로,
long형의 값을 double 형변수에 저장하는 것과 같아서 ‘double a = 5L;’ 을 수행 했을 때와
같이 long형의 값인 5L은 double형 값인 5.0으로 자동 형변환 되어 divide의 매개변수 a에 저장된다.
그래서 divide 메서드에 두 개의 정수값(5L, 3L)을 입력하여 호출하였음에도 불구하고
연산결과가 double형의 값이 된다.
이와 마찬가지로 add(long a, long b) 메서드에도 매개변수 a, b 에 int형의 값을
넣어 add(5, 3) 과 같이 호출하는 것이 가능하다.
코드로 보면 이렇다. (자세히 봐야 할건 double 과 int 자동형변환 부분이다.)
class My {
long add(long a, long b) {
long result = a + b;
return result;
}
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;
}
}
class aaa {
public static void main(String[] args) {
My mm = new My();
long result1 = mm.add(5, 3); // 업케스팅
long result2 = mm.subtract(5L, 3L);
long result3 = mm.multiply(5L, 3L);
double result4 = mm.divide(5L, 3L); // 업케스팅
System.out.println("add :" + result1);
System.out.println("subtract :" + result2);
System.out.println("multiply :" + result3);
System.out.println("divide :" + result4);
}
}
출력 값.
add : 8
<br/>subtract : 2
<br/>multiply : 15
<br/>divide : 1.6666666666666667
Reference
남궁 성 지음, 『자바의 정석』, 도우출판.