혼자서 새벽에 공부하다가
다른분의 블로그 포스팅 보면서 그 포스팅이 잘못 기재한 것 같아서 질문 드립니다.
포스팅에서는 두 경우 모두 call by value라고 적혀 있습니다.
하지만, 제 생각에는 첫번째 경우에는 p라는 reference는 전달되었지만, name이 갖고있는 value가 바뀌어서 (value가 바뀐 것이 맞다고 생각합니다.)
두번째는 p레퍼런스를 보냈지만, p의 기존 레퍼런스를 끊어서 새로운 레퍼런스와 연결했기 때문에
블럭단위의 CallByValue의 내부에 있는 p와 연결이 끊어진 것이 아닌가 합니다. 그래서 두번째 경우는 CallByVaule의 내부의 p는 'wonwoo'를
프린트할 수밖에 없다고 생각합니다.
블럭단위의 언어환경에서는 즉 Clss CallByValue의 내부의 p는 new Person("wonwoo")만 바라보고 있는 것
그래서 두번째 경우는 연결이 끊어져서 Clss CallByValue의 내부의 p는 어쩔 수 없이 wonwoo를 바라봐야하는 것이 아닌가요?
그럼 이제 새로 바뀐 kevein 의 p는 어디서 찾아볼 수 있을까요?
/* 첫번째 경우call by value */
public class CallByValue {
public static void main(String[] args) {
Person p = new Person("wonwoo");
System.out.println("p.name: " + p.name);
callByValue(p);
System.out.println("p.name: " + p.name);
}
public static void callByValue(Person p) {
p.name = "kevin";
}
}
class Person {
String name;
public Person(String name) { this.name = name; }
}
/*두번째 경우 call by value */
public class CallByValue {
public static void main(String[] args) {
Person p = new Person("wonwoo");
System.out.println("p.name: " + p.name);
callByValue(p);
System.out.println("p.name: " + p.name);
}
public static void callByValue(Person p) {
p = new Person("kevin");
}
}
class Person {
String name;
public Person(String name) { this.name = name; }
}