자바는 항상 변수의 값을 복사해서 대입한다.
int num1 = 5;
int num2 = num1;
여기서 num2 = num1 이 부분이 값을 복사해서 대입하는 거임. num1이라는 변수 자체가 num2에 들어가는 게 아니라, num1의 값을 읽어서 num2에 복사해서 대입하는 거임. 그래서 num1과 num2는 관계가 없음.
자바는 항상 변수의 값을 복사해서 대입한다... 참조형도 마찬가지라면 이관할 때 특정 객체를 인자로 해서 메서드를 호출하고 나면 호출 시 인자로 넘긴 객체의 값이 메서드 호출 후에 변경되는 건 대체 뭐지???
지피티가 알려줌
메서드의 파라미터가 참조형 객체일 경우 파라미터에 인자로 넘긴 객체의 주소값이 들어옴.
해당 주소 값 자체를 복사하는 것.
void changeName(User user) {
user.setName("홍길동");
}
User u = new User("철수");
changeName(u);
System.out.println(u.getName()); // -> 홍길동 출력됨.
즉 changeName 메서드의 파라미터인 user에는 메서드 호출 시 인자로 넘긴 u 변수의 주소값이 들어와 있음. 그래서 u와 user 변수가 같은 주소값, 즉 같은 객체(u)를 참조하고 있는 거임. 그래서 changeName에서 user의 name을 변경하면 u의 name도 변경되는 것. 같은 주소를 참조하고 있으니까.
하지만 메서드 안에서 참조 자체를 다른 객체로 바꿔도 원본 참조는 절대 바뀌지 않는다.
void change(User user) {
user = new User("영희");
}
User u = new User("철수");
change(u);
System.out.println(u.getName()); // -> 철수 출력
원래 u의 주소값을 user에 복사한 거였는데 user 변수에다가 User 객체를 새로 초기화했으니까. 주소값이 달라짐. 그래서 u의 name은 변경되지 않은 것.
'웹 개발 > Java' 카테고리의 다른 글
| List와 객체지향 (0) | 2025.12.09 |
|---|---|
| 자바 다이아몬드 연산자(<>): 타입 명시와 타입 추론 (0) | 2025.12.09 |
| 접근제어자와 캡슐화 (0) | 2025.12.05 |
| 생성자 (0) | 2025.12.04 |