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