on
09. 기술면접 - 자바 - 자바는 항상 CallByValue 이다
09. 기술면접 - 자바 - 자바는 항상 CallByValue 이다
공부목적으로 다른 블로그의 글을 그대로 따라치면서 작성되었습니다. 저작권 문제 시, 비공개 처리하겠습니다
public class CallByVal { public static void main(String[] args) { Person admin = new Person(1L, "admin"); changePerson(admin); System.out.println(admin); } private static void changePerson(Person admin) { admin = new Person(2L, "root"); } } class Person { private Long id; private String name; public Person(long id, String name) { this.id = id; this.name = name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Person{" + "id=" + id + ", name='" + name + '\'' + '}'; } }
파리미터로 admin 이 참조형이였다면, root 로 출력 될 것이다
public class CallByVal { public static void main(String[] args) { Person admin = new Person(1L, "admin"); changePerson(admin); System.out.println(admin); } private static void changePerson(Person admin) { admin.setName("root"); } } class Person { private Long id; private String name; public Person(long id, String name) { this.id = id; this.name = name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Person{" + "id=" + id + ", name='" + name + '\'' + '}'; } }
파라미터 admin 은 복사된 값인데 .setName("root"); 또는 .name = "root" 같이 행위는 해당 인스턴스 주소로 참조되어있다
여기서 값(value) 란?
-> 기본자료형의 값 또는 객체에 대한 레퍼런스
-> 즉, Person 도 값이라고 생각해야된다
-> 그래서 파리미터 admin = new Person() 을 해도 main 에서의 admin 변수는 변하지 않았다
-> 파라미터 admin 에는 복사한 값(refernce 타입)이 들어가 있지만, setName과 .name 은 원본 인스턴스의와 참조
(연결) 되어 있다. 때문에 .name 과 setName() 을 통해 원본 인스턴스가 바뀌게 되는 것 이다
참고
from http://theheydaze.tistory.com/607 by ccl(A) rewrite - 2021-10-21 12:01:42