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