본문 바로가기
✏️Java 공부/Java의 정석

[Java 공부/Java의 정석] Chapter.06 : 객체지향 프로그래밍 1 - 3 (기본형 매개변수와 참조형 매개변수)

by 코코의 주인 2022. 7. 1.

매개변수의 종류

 자바에서는 메서드를 호출할 때 매개변수로 지정한 값을 메서드의 매개변수에 복사해서 넘겨준다. 매개변수의 타입이 기본형(primitive type)일 때는 기본형 값이 복사되겠지만, 참조형(reference type)이면 인스턴스의 주소가 복사된다.

기본형 매개변수            변수의 값을 읽기만 할 수 있다.(read only)
참조형 매개변수           변수의 값을 읽고 변경할 수 있다.(read & write)

 

기본형 매개변수의 예

class Data {
    int x;
}

public class PrimitiveParam {
    public static void main (String args[]) {
        Data data = new Data();
        data.x = 10;
        System.out.println("X의 값은:" + data.x + "입니다.");
        change(data.x);
        System.out.println("X의 값은:" + data.x + "입니다.");
    }

    static void change(int x) {
        x = 1000;
        System.out.println("X의 값은:" + x + "입니다.");
    }
}
실행 결과
x의 값은: 10입니다.
x의 값은: 1000입니다.
x의 값은: 10입니다.

 change 메서드에서 main 메서드로부터 넘겨받은 data.x의 값은 1000으로 변경했는데도 main 메서드에서는 data.x의 값이 그대로다. 그 이유는 data.x의 값이 변경된 것이 아니라, change 메서드의 매개변수 x의 값만 변경되었기 때문이다.

 change 메서드의 매개변수 x에는 data.x의 값이 복사되었고, 이를 아무리 수정한다 한들 원본에는 아무런 영향을 미치지 못한다.

 

참조형 매개변수의 예

class Data {
    int x;
}
public class ReferenceParam {
    public static void main (String args[]) {
        Data data = new Data();
        data.x = 10;
        System.out.println("X의 값은:" + data.x + "입니다.");
        change(data);
        System.out.println("X의 값은:" + data.x + "입니다.");
    }

    static void change(Data d) {
        d.x = 1000;
        System.out.println("X의 값은:" + d.x + "입니다.");
        System.out.println(d);
    }
}
실행 결과
x의 값은: 10입니다.
x의 값은: 1000입니다.
x의 값은: 1000입니다.

 이번엔 change 메서드로 인해 x의 값이 변경되었다. change 메서드의 매개변수를 참조형으로 선언했기 때문에, 때문에 단순히 값을 복사하는 것이 아니라 '값이 저장된 주소'를 change 메서드에 넘겨주었기 때문이다. 이 경우 main 메서드의 참조변수 data와 change 메서드의 참조변수 d는 같은 객체를 가리키게 된다. 때문에 d를 변경하는 것이 곧 data를 변경하는 것과 같은 것이다.


총평

기본형 매개변수와 참조형 매개변수의 차이를 정확하게 모르면 코딩을 하다가 가끔씩 헷갈릴 때가 있다.

이번 글을 작성하면서 나도 확실한 차이를 알게 된 거 같아서 좋았다.

댓글