이제 정의한 메서드를 호출해보자
클래스 외부에서 메서드 호출하기
메서드도 클래스의 멤버이므로 객체 안에 존재할 것이고, 클래스 외부에서 메서드를 사용하려면 먼저 객체를 생성해야 할 것이다. 이어서 객체의 위치를 저장하고 있는 참조 변수를 이용해 메서드를 호출해야 한다. 다음 실습은 앞에서 알아본 4개의 메서드를 클래스 A에 구성하고 클래스 외부에서 클래스 A의 객체를 생성해 메서드를 호출하는 예다.
이 실습에서 알 수 있는 것처럼 리턴 타입이 void인 메서드의 경우 리턴되는 값이 없어 그대로 메서드만 호출(a.print())하지만, 리턴값이 있는 메서드는 일반적으로 리턴되는 값을 저장할 수 있는 변수를 선언해 대입(int k = a.data())한다. 물론 리턴값을 저장하지 않아도 (a.data()) 문법 오류는 발생하지 않는다. 다만 리턴값이 필요해 그 메서드를 호출햇을 것이므로 일반적이지는 않다.
입력매개변수가 있는 함수를 호출할 때는 해당 자료형의 값을 넘겨줘야 한다.double sum(int a, double b) 메서드에는 2개의 입력매개변수가 있으며, 첫 번째는 int, 두 번째는 double 자료형을 입력값으로 받는다. 따라서 이를 호출하려면 a.sum(3, 5.2)처럼 2개의 값을 각각의 자료형에 맞게 넘겨 줘야 한다. 그러면 sum()메서드의 지역 변수인 a값에는 3, b값에는 5.2가 입력돼 메서드가 종료될 때 값 8.2가 리턴되는 것이다. 입력매개변수를 넘겨주면 메서드 내부에서는 입력매개변수의 선언과 넘어온 값의 대입이 가장 먼저 실행된다. 즉, sum(3, 5.2)와 같이 호출하면 int a; double b; a = 3; b = 5.2; 코드가 가장 먼저 실행된 후 나머지 코드들이 순서대로 실행된다.
// 클래스의 정의
class A {
// 리턴 타입 void, 입력매개변수 없음
void print() {
System.out.println("안녕");
}
// 리턴 타입 int, 입력매개변수 없음
int data() {
return 3;
}
// 리턴 타입 double, 입력매개변수 2개
double sum(int a, double b){
return a + b;
}
//리턴 타입 void, 내부에 리턴 포함(함수를 종료함)
void printMonth(int m) {
if(m < 0||m >12 ){
System.out.println("잘못된 입력");
return;
}
System.out.println(m+ "월입니다.");
}
}
public class jh {
public static void main(String[] args) {
// 객체 생성
A a = new A();
// 메서드 호출(멤버 활용)
a.print();
int k = a.data();
// a.data();
System.out.println(k);
double result = a.sum(3,5.2);
System.out.println(result);
a.printMonth(5);
a.printMonth(15);
}
}
결과
클래스 내부에서 메서드 호출하기
이제 클래스 내부에서 메서드 간에 상호 호출할 때를 살펴보자. 클래스 내부에 있는 메시드끼리는 객체를 생성하지 않고 서로를 호출할 수 있다. 말 그대로 같은 멤버이기 때문이다. 필드 또한 멤버이므로 클래스 내부의 모든 메서드 안에서 객체를 생성하지 않고 자신이 속한 클래스의 필드를 사용할 수 있다. 다만 메서드 앞에 static이 붙어 있을 때는 static이 붙은 필드 또는 메서드만 호출할 수 있다. 이는 나중에 알아보기로 하고, 여기서는 '같은 멤버끼리는 클래스 내부에서 얼마든지 객체를 생성하지 않고 서로를 호출할 수 있다.'는 사실만 기억하자.
다음 예를 살펴보자. main() 메서드 내에서 같은 클래스에 포함된 메서드를 객체 생성 과정 없이 바로 호출해 사용하고 있다는 것을 알 수 있다.
public class jh {
public static void main(String[] args) {
// 같은 클래스 안에 있는 내부 메서드 호출
print();
int a = twice(3);
System.out.println(a);
double b = sum(a, 5.8);
System.out.println(b);
}
public static void print() {
System.out.println("안녕");
}
public static int twice(int k) {
return k * 2;
}
public static double sum(int m, double n){
return m + n;
}
}
결과
입력 매개 변수가 배열인 메서드 호출하기
앞 예제에서 입력매개변수는 모두 기본 자료형이었다. 이제 다음과 같이 입력매개변수가 배열일 때를 살펴보자.
printArray() 메서드는 입력매개변수로 int[]자료형을 포함하고 있다. 따라서 이 메서드를 호출하기 위해서는 int[]객체를 생성해 입력매개변수로 넘겨 줘야 한다. 여기서는 2가지만 기억하자. 첫 번째는 호출할 때의 배열 데이터 입력 방법이다. 첫 번째처럼 new int[] {1, 2, 3}을 입력매개변수로 넘겨 주면 메서드에서는 다음 2줄의 코드가 가장 먼저 실행된다.
int a;
a = new int[] {1, 2, 3};
이 방법은 1차원 배열 객체를 생성하는 두 번째 방법이었다. 만약 세 번재 방법을 사용해 초깃값만 넘겨 준다면 다음과 같은 2줄이 실행되면서 오류가 발생한다.
int[] a;
a = {1, 2, 3};
초깃값만 넘겨줄 때는 선언과 동시에 값을 대입할 때(int[] a = {1, 2, 3})만 가능하기 때문이다.
public class jh {
public static void main(String[] args) {
// 배열을 입력매개변수로 하는 메서드 호출
int[]a= new int[] {1, 2, 3};
printArray(a);
printArray(new int[] {1, 2, 3});
// printArray({1, 2, 3}); // 오류 발생
}
public static void printArray(int[] a){
System.out.println(Arrays.toString(a));
}
}
결과