7.2.3 메서드 호출하기 - 1

jh·2022년 1월 29일
0

Do it! 자바 완전 정복

목록 보기
60/70

이제 정의한 메서드를 호출해보자

클래스 외부에서 메서드 호출하기
메서드도 클래스의 멤버이므로 객체 안에 존재할 것이고, 클래스 외부에서 메서드를 사용하려면 먼저 객체를 생성해야 할 것이다. 이어서 객체의 위치를 저장하고 있는 참조 변수를 이용해 메서드를 호출해야 한다. 다음 실습은 앞에서 알아본 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));
    }
}

결과

profile
코딩 공부 중...

0개의 댓글