본문 바로가기

자바

[자바] 기본형 매개변수와 참조형 매개변수 (객체지향)

기본형 매개변수

class Data {int x;}

class Ex6_6{
	public static void main(String[] args){
    	Data d = new Data();
        d.x = 10;
        System.out.println("main() : x = " + d.x);
        
        change(d.x);
         System.out.println("After change(d.x)");
         System.out.println("main() : x " + d.x); //main() : x 10
     }
     static void change(int x){
     	x = 1000;
         System.out.println("change() : x = " + x); //change() : x = 1000
     }
 }

기본형 매개변수는 변수값을 읽기만 가능하다(read only)

자바에서는 메서드를 호출할 때 매개변수로 지정한 값을 메서드의 매개변수에 복사해서 넘겨준다.

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

d.x의 값이 변경된것이 아니라 change 메서드의 매개변수 x의 값이 변경된 것이다. 그래서 main의 d.x값이 변경되지 않은 것이다.

 

참조형 매개변수

class Data2 { int x;}

class Ex6_7{
	public static void main(String[] args){
    	Data2 d = new Data2();
        d.x = 10;
        System.out.println("main() : x = " + d.x);
        
        change(D);
        System.out.println("After change(d)");
        System.out.println("main() : x = " + d.x);
    }
    
    static void change(Data2 d ){
    	d.x = 1000;
        System.out.println("change() : x = " + d.x):
    }
}

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

참조형으로 선언하면 값이 저장된 곳의 주소를 알 수 있기 때문에 값을 읽어 오는 것은 물론 값을 변경하는것도 가능하다.

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

참조형 반환타입

Class Data3 { int x; }

class Ex6_8 {
	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;
    }
}
  1. copy(d) 를 통해 인스턴스 d의 주소값을 참조한다.
  2. tmp.x = d.x 를 통해 d.x의 값을 tmp.x의 값으로 복사한다.
  3. tmp값을 main에 return한다.  - > d2 = tmp
  4. d2.x = 10이다. ( d.x와 값은 같지만 참조하는 주소는 다르다.)