Pass by reference VS Pass by value

2022. 11. 27. 18:23카테고리 없음

Pass by Value => 값을 전달한다 (값만 전달한다) "원래값"은 놔두고 ,전달 되는 값이 진짜 인 것 처럼 보이게 한다

Pass by reference=> "메소드의  매개변수로 참조 자료형을 넘길 경우에는 메소드안에서 객체의 상태를 변경한 결과가 영향을 받는다"

 

-모든 기본 자료형은 Pass by vlaue 이다 

-참조자료형은 값이 아닌 참조가 전달되는 Pass by Reference

 

기본형 매개 변수: 변수의 값을 읽기만 할수있따 (read only)

참조형 매개 변수: 변수의 값을 읽기도 하고 변경도 할 수 있다(read & write)

 

 

기본형 매개변수 

package test16;

public class Date {

	int x;
}

class  PassbyValue{	
	 public static void main(String[] args) {
		Date d = new Date();//객체생성
		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);		
		
		
	}
	static void change(int x) {// 기본형 매개변수(읽기만 가능)
		x=1000;//지역 변수 
		System.out.println("change(): x= " + x);
		
	}
	
	
}

메인 메소드가 단순히 가진 값을 주었다면 객체가 어디있는지 모르니 다룰 수 없다.

 

결과:  기본형 매개 변수 읽기만 가능하고 값을 바꿀 수 없다.

main(): x = 10
change(): x= 1000
After change(d.x)
main() : x=10

 

참조형 매개변수

package tset12;

 class Data2 {
	int x;
}

class PassbyReference{
	 public static void main(String[] args) {
		 
		 Data2 d = new Data2();//객체 생성 
		 d.x=10; 
		 System.out.println("main() : x =" +d.x );
		 
		 change(d);//mian메소드의 지역변수  값을 복사(대입)해서 줬다 .
		 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);
		 	 
	 }  
	
	
}

참조형 매개변수 :여기에 객체를 똑같이 가리킬수 있게 한다 ( 객체가 어디에 저장되어있는지 주소값을 줬다  ex)리모콘 )

 

결과:변수의 값을 읽기도 하고 변경도 할 수 있다.

main() : x =10
change()  : x =1000
After change(d)
main() :x =1000

 

참조형 반환타입

package test15;

public  class Data3 {
	int x;
	
}
class ReferenceReturn{
	
	 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를 생성한다
		tmp.x = d.x;    //d.x의값을 tmp.x에 복사한다.
		return tmp;//복사한 객체의 주소를 반환한다.
		
	}

}

반환타입 참조형 -> 객체 주소 반환( 혹은 객체를 반환한다.)

*반환타입과 (참조형 ex. Data3) 그결과를 받는 변수도(참조형 ex.d2 ) 이여야 한다.

 

결과: 서로 다른 주소값을 가진 객체 이다 .

d.x=10
d2.x=10