본문 바로가기

Java의 정석

객체 지향 개념 - 7 기본형 매개변수, 참조형 매개변수

기본형 매개변수

자바에서는 메서드를 호출할 때 매개변수로 지정한 값을 메서드의 매개변수에 복사해서 넘겨준다. 매개변수의 타입이 기본형일 때는 기본형 값이 복사되어 저장된 값을 얻으며 변수의 값을 읽기만 할 수 있다(read only).

class Data { int x; }
class primitiveParam {
    public static void main(String[] args){
        Data d = new Data();
        d.x = 10;
        System.out.println("main() class의 x = " + d.x); // main() class의 x = 10
        
        change(d.x);
        System.out.println("change() 후");
        System.out.println("main() class의 x = " + d.x); // main() class의 x = 10
    }
    
    static void change(int x){
        x = 1000;
        System.out.println("change() 내부 x = " + x); // change() 내부 x = 1000
    }
}

 

  1. change 메서드가 호출되면서 d.x가 change 매개변수의 x에 복사
  2. change 메서드 내부에서 복사된 값 x의 값을 1000으로 변경
  3. change 메서드가 종료되면서 x는 호출 스택에서 제거

이처럼 기본형일 때는 넘겨준 d.x가 변경된 것이 아니라 복사된 매개변수 x의 값이 변경된 것으로 원본에는 아무런 영향을 미치지 못한다.

 

참조형 매개변수

매개변수의 타입이 참조형일 때는 인스턴스의 주소가 복사된다. 이처럼 값이 저장된 곳의 주소를 알 수 있기 때문에 값을 읽어 오는 것은 물론 값을 변경하는 것도 가능하다(read & write).

class Data { int x; }
class referenceParam {
    public static void main(String[] args){
        Data2 d = new Data2();
        d.x = 10;
        System.out.println("main() class의 x = " + d.x); // 1. main() class의 x = 10
        
        change(d);
        System.out.println("change() 후");
        System.out.println("main() class의 x = " + d.x); // 3. main() class의 x = 1000
    }
    
    static void change(Data2 d){
        d.x = 1000;
        System.out.println("change() 내부 x = " + d.x); // 2. change() 내부 x = 1000
    }
}

 

  1. change 메서드가 호출되면서 참조 변수 d의 주소가 매개변수 d에 복사되며 x에 접근이 가능
  2. change 메서드에서 매개변수 d로 x의 값을 1000으로 변경
  3. change 메서드가 종료되면서 매개변수 d는 스택에서 제거됨

매개변수를 참조형으로 선언했기 때문에 x의 값이 아닌 변수 d의 주소가 매개변수 d에 복사되어 main 메서드의 참조 변수 d와 change 메서드의 참조 변수 d는 같은 객체를 가리키며 매개변수 d로 x의 값을 읽는 것과 변경하는 것이 가능하게 됨