package ex_pass_by;
public class Ex1 {
public static void main(String[] args) {
/*
* Pass by value(값에 의한 전달) & Pass by Reference(참조에 의한 전달)
*
* - 메서드 등의 파라미터에 데이터를 전달할 때 기본 데이터타입과 참조 데이터타입은
* 전달되는 값의 종류가 다름
* => 기본 데이터타입 : 실제 저장된 데이터가 복사되어 전달됨
* 참조 데이터타입 : 실제 저장된 데이터가 있는 주소값이 복사되어 전달됨
* - 어떤 데이터타입을 전달하느냐에 따라 데이터를 전달받은 곳에서 해당 데이터를
* 사용했을 때 다른 곳에서 영향을 받을 수도 있음
* => 기본 데이터타입 전달 시 값 복사가 일어나므로 복사된 값을 전달받은
* 서로 다른 객체끼리 값의 영향 X
* => 참조 데이터타입 전달 시 주소값 복사가 일어나므로 복사된 주소값을 전달받은
* 서로 다른 객체끼리 동일한 객체의 주소를 참조하므로 변경된 값의 영향이 발생!
*
*/
Money m = new Money();
m.money = 1000;
// 1. 메서드에 기본 데이터타입을 전달하는 경우
System.out.println("m.money 값 변경 전 : " + m.money);
changeValue(m.money);
// => 변경할 값 전달(m.money에 저장된 정수 1000을 복사하여 전달)
System.out.println("m.money 값 변경 후 : " + m.money);
// => 기본데이터타입을 메서드 파라미터로 전달 시 실제 값의 복사가 일어나므로
// 복사된 값을 전달받은 메서드에서 값을 변경하더라도 원본데이터에는
// 아무런 영향이 발생하지 않는다!
System.out.println("===================================");
// 2. 메서드에 참조 데이터타입(객체)를 전달하는 경우
System.out.println("m.money 값 변경 전 : " + m.money);
changeReference(m);
// => 변경할 값 전달(m에 저장된 주소값을 복사하여 전달)
System.out.println("m.money 값 변경 후 : " + m.money);
// => 참조데이터타입을 메서드 파라미터로 전달 시 실제 값이 아닌 주소값의 복사가 일어남
// 따라서, 복사된 주소를 통해 객체의 값을 변경하는 경우
// 원본데이터가 참조하는 객체와 동일한 객체의 값이 변경되므로 영향이 발생한다!
System.out.println("===================================");
System.out.println("m.money 값 변경 전 : " + m.money);
m.money = changeValue2(m.money);
System.out.println("m.money 값 변경 후 : " + m.money);
} // main() 끝
public static int changeValue2(int money) {
// 기본데이터타입의 데이터를 전달받을 경우 값의 복사가 일어나므로
// 원본데이터와는 다른 위치에 복사된 값이 저장됨
System.out.println("changeValue() 의 money 값 변경 전 : " + money);
// 전달받은 값 변경
money -= 500;
System.out.println("changeValue() 의 money 값 변경 후 : " + money);
return money;
}
// 참조 데이터타입을 전달 할 메서드
public static void changeReference(Money mm) {
// 참조데이터타입의 데이터를 전달받을 경우 주속밧의 복사가 일어나므로
// 원본데이터가 참조하는 위치의 객체와 동일한 객체를 참조하게 됨
System.out.println("changeReference() 의 money 값 변경 전 : " + mm.money);
// 전달받은 주소에 접근하여 값 변경
mm.money -= 500;
System.out.println("changeReference() 의 money 값 변경 후 : " + mm.money);
}
// 기본 데이터타입을 전달 할 메서드
public static void changeValue(int money) {
// 기본데이터타입의 데이터를 전달받을 경우 값의 복사가 일어나므로
// 원본데이터와는 다른 위치에 복사된 값이 저장됨
System.out.println("changeValue() 의 money 값 변경 전 : " + money);
// 전달받은 값 변경
money -= 500;
System.out.println("changeValue() 의 money 값 변경 후 : " + money);
}
}
class Money {
int money;
}