본문 바로가기
JAVA

call by Value, call by reference. 근데 자바는 call by value만 쓴다고?

by 고유빙글 2022. 12. 27.

맞다. 이는 공부하면서 구현 및 설명을 달아놓은 코드이다 주석 및 코드를 보면 이해가 될 것이라 믿는다.

 

package test;



public class CbvCbr2 {



/**

 * @param args

 */

public static void main(String[] args) {

Person mh = new Person("강아지",33,"Galaxy",22);

Person cl = new Person("고양이",27,"IPhone",20);

System.out.println(mh);



changePerson(mh,cl);



System.out.println("changePerson() : "+mh);



changeAge(mh,cl.getAge());



System.out.println("changeAge() : "+mh);



changePhoneByPerson(mh,cl);



System.out.println("changePhoneByPerson() : "+mh);



changePhoneDirect(mh.phone,cl.phone);



System.out.println("changePhoneDirect() : "+mh);

}





public static class Person{

public String name;

public int age;

public Phone phone;



public Person(String name, int age, String PName, int PVer){

this.name = name;

this.age = age;

this.phone = new Phone(PName,PVer);

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public void setPhone(Phone phone){

this.phone = phone;

}

public Phone getPhone(){

return this.phone;

}

public String toString(){

return name+" : "+age+phone;

}

}



public static class Phone{

String PName;

int PVer;



public Phone(String PName, int PVer){

this.PName = PName;

this.PVer = PVer;

}

public String getPName() {

return PName;

}

public void setPName(String pName) {

this.PName = pName;

}

public int getPver() {

return PVer;

}

public void setPver(int PVer) {

this.PVer = PVer;

}

public String toString(){

return "   has phone : "+PName+", version : "+PVer;

}

}



public static void changePerson(Person p1, Person p2){

/*

 * p1은 mh와 같은 객체를 나타내는것 같지만

 * java는 call by value를 이용한다. 이 말은 매개변수로 넘어온 것이 reference가 아니라 value 라는 것이고

 * 이는 p1과 mh는 같은 값을 가진 Person객체이지만 같은 객체는 아니다.

 * 복사된 값이 전달된 것이다.

 * 

 *  그래서 p1을 변경하여도 mh는 바뀌지 않는다.

 */

p1 = p2;

}



public static void changeAge(Person p1, int age){

/*

 * p1은 동일하게 mh의 값이 복사된 객체로. mh와 다르다.

 * 하지만 Heap 메모리상의 같은 Person 객체를 참조하고 있다.

 * 그렇기때문에 Heap 메모리상의 값을 변화시키면

 * mh도 같은 Heap 메모리의 값을 참조하기때문에 같이 변경되게 된다.

 */

p1.setAge(age);

}



public static void changePhoneByPerson(Person p1, Person p2){

/*

 * 위의 chageAge() 와 동일하다. 같은 heap 메모리 값을 참조하는 phone를 변경했기때문에 적용된다.

 */

p1.setPhone(p2.phone);

}



public static void changePhoneDirect(Phone p1, Phone p2){

/*

 * changePerson() 와 동일하다. 복사된 값에 값을 초기화해주었기때문에 실제값에 영향을 주지 않는다.

 */

p1 = p2;

}



}