코린이의 소소한 공부노트

메서드의 매개변수 본문

Java

메서드의 매개변수

무지맘 2022. 3. 6. 16:52

메서드의 매개변수는 메서드 선언 시 입력값으로 작성하는 변수로, 메서드가 호출되면 콜러(caller)에서 넘겨준 값을 매개변수에 복사(대입)한 후 메서드 구현부를 실행하게 된다.

일반 변수도 그렇듯 매개변수도 기본형과 참조형으로 구분된다.

1. 기본형 매개변수

  - 정수형(byte, short, int, long), 실수형(double, float), 논리형(boolean), 문자형(char)

  - 콜러에서 넘겨준 변수의 값을 읽기만 할 수 있고 변경할 수 없다.(=read only)

2. 참조형 매개변수

  - 문자열형(String), 배열, 기타 사용자 정의 객체

  - 콜러에서 넘겨준 변수의 값을 읽고 변경할 수 있다.(=read & write)

 

매개변수로 넘기는 것이 기본형일 때와 참조형일 때 어떤 차이가 생기는지 확인해보려 한다.

1. 예시 코드가 하는 일 확인

2. 각각의 코드를 읽고 결과 예측

3. 실제 결과와 호출 스택의 흐름 확인

 

1) 예시 코드는 다음과 같은 일을 한다.

    메인 메서드에서 객체를 생성하고 객체의 멤버변수 값을 println문으로 확인한다.

-> change 메서드를 호출해 객체의 멤버변수 값을 매개변수로 넘기고, 그 값을 변경한다.

-> change 메서드 내에서 변경한 값을 println문으로 확인한다.

-> 메인 메서드로 돌아와 객체의 멤버변수 값을 println문으로 다시 한번 확인한다.

 

2) 기본형 매개변수 - read only

  - 예시 코드

class Data { int x; }

class Ex_1 {
    public static void main(String[] args) {
        Data d = new Data();
        d.x = 4;
        System.out.println("main: x = " + d.x);
        change(d.x);
        System.out.println("change() 호출 후");
        System.out.println("main: x = " + d.x); }
    static void change(int x) {
        x = 2;
        System.out.println("change: x = " + x); }
}

  - 메서드 호출 스택 흐름

3) 참조형 매개변수 - read & write

  - 예시코드

class Data2 { int x; }

class Ex_2 {
    public static void main(String[] args) {
        Data2 d = new Data2();
        d.x = 4;
        System.out.println("main: x = " + d.x);
        change(d);
        System.out.println("change() 호출 후");
        System.out.println("main: x = " + d.x); }
    static void change(Data2 d) {
        d.x = 2;
        System.out.println("change: x = " + d.x); }
}

  - 메서드 호출 스택 흐름

 

change 메서드를 호출할 때

1) 기본형 매개변수: 변수 값을 복사해 넘기기 때문에 메인에서 만든 객체 d의 변수 x와 다른 변수가 생성됨

2) 참조형 매개변수: 객체의 주소값을 복사해 넘기기 때문에 change 메서드에서 만든 객체 d도 메인에서 만든 객체 d의 변수 x를 가리키게 됨

이 때문에 기본형에서는 read only, 참조형에서는 read&write가 되는 것이다.

 

여기까지 이해가 됐다면, 반환타입이 참조형인 메서드를 호출했을 때의 흐름도 잘 이해할 수 있다.

  - 예시 코드

class Data3 { int x; }

class Ex_3 {
    public static void main(String[] args) {
        Data3 d = new Data3();
        d.x = 10;
        Data3 d2 = copy(d); 
        System.out.println("d.x = " + d.x);
        System.out.println("d2.x = " + d2.x); }
    static Data3 copy(Data3 d) {
        Data3 tmp = new Data3();
        tmp.x = d.x;
        return tmp; }
}

  - 메서드 호출 스택 흐름

-> 반환타입이 참조형인 메서드는 구현부 수행 후 객체의 주소를 반환한다.

 

# 같은 클래스 내에 선언된 메서드 / static메서드는 객체 생성 없이 호출 가능

-> 추후 업로드 예정

'Java' 카테고리의 다른 글

메서드 오버로딩  (0) 2022.03.09
스태틱/인스턴스 메서드  (0) 2022.03.07
메서드의 호출 스택  (0) 2022.03.05
메서드의 생성(선언)과 사용(호출)  (0) 2022.03.04
선언 위치에 따른 변수의 종류  (0) 2022.03.03