메서드 호출 시 기본 데이터 타입 데이터를 전달
-> 실제 데이터를 복사해서 전달
호출된 메서드 내에서 복사한 데이터를 변경해도 원본 데이터에는 영향X
public static void main(Stirng[] args) {
Money m = new Money();
PassByValue pbv = new PassByValue();
System.out.println("PassbyValue() 메서드 호출 전 : " + m.money);
// 그대로 10000이 출력됨
pbv.primitive(m.money);
// money에 저장되어 있던 10000이 복사됨
System.out.println("PassbyValue() 메서드 호출 후 : " + m.money);
// 호출된 메서드에서 전달받은 데이터를 변경하더라도
// 원본 데이터에는 변화가 없으므로 그대로 10000이 출력됨
}
class PassByValue {
puplic void primitive(int money) {
// 기본 데이터 타입을 전달 받음
money += 3000;
// 전달 받은 기본 데이터 타입 데이터를 변경
}
}
class Money {
int money = 10000;
}
메서드 호출 시 참조 데이터 타입 데이터를 전달
-> 실제 값이 있는 공간의 주소를 복사해서 전달
호출된 메서드 내에서 복사한 주소값에 접근하여 해당 주소에 있는 데이터 변경
-> 원본 데이터도 동일한 주소값을 참조하므로 변경된 결과에 영향을 받음
=> 동일한 주소값을 참조하므로 어느 한쪽에서 객체 데이터를 변경하는 경우 주소를 참조하는 모두가 영향 받음
public static void main(Stirng[] args) {
Money m = new Money();
PassByReference pbr = new PassByReference();
System.out.println("PassbyReference() 메서드 호출 전 : " + m.money);
// 그대로 10000이 출력됨
pbr.Reference(m);
// Money 인스턴스 주소가 저장된 참조변수 값을 메서드에 전달
System.out.println("PassbyReference() 메서드 호출 후 : " + m.money);
// 호출된 메서드에서 주소값에 접근하여 인스턴스 내의 데이터를 변경하기 때문에
// 원본 데이터의 값에도 영향을 주어
// 3000이 더해진 13000이 출력된다
}
class PassByReference {
puplic void Reference(Money m) {
// 참조 데이터 타입으로 밑에 Money 클래스의 데이터를 전달받음
m.money += 3000;
// 전달받은 주소 값에 해당하는 인스턴스에 접근하여
// 인스턴스 내의 멤버변수의 실제 값을 변경 가능
}
}
class Money {
int money = 10000;
}