[자바] Pass By Value vs Pass By Reference

Gammi·2022년 10월 11일
0

JAVA

목록 보기
10/35
post-thumbnail

✔ Pass By Value


  • 메서드 호출 시 기본 데이터 타입 데이터를 전달

    -> 실제 데이터를 복사해서 전달

  • 호출된 메서드 내에서 복사한 데이터를 변경해도 원본 데이터에는 영향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;
}





✔ Pass By Reference


  • 메서드 호출 시 참조 데이터 타입 데이터를 전달

    -> 실제 값이 있는 공간의 주소를 복사해서 전달

  • 호출된 메서드 내에서 복사한 주소값에 접근하여 해당 주소에 있는 데이터 변경

    -> 원본 데이터도 동일한 주소값을 참조하므로 변경된 결과에 영향을 받음

    => 동일한 주소값을 참조하므로 어느 한쪽에서 객체 데이터를 변경하는 경우 주소를 참조하는 모두가 영향 받음



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;
}
profile
개발자가 되었어요⭐️

0개의 댓글