자바의 Pass By Value

최민수·2023년 7월 13일
0

프로그래밍 언어

목록 보기
5/14

자바 언어는 객체 자체를 직접 가리키는 것이 아님.

객체를 찾아갈 수 있는 참조값을 들고 있는 것이기 때문에, 객체가 복사가 되는 것이 아니다.

따라서 아래와 같은 경우에 s1에 수정을 가해도 s1의 참조값이 바뀌는 것이고,
s2는 그대로 전의 참조값을 들고 있기 때문에 s1을 따라서 바뀌지 않는다.

참고로, 자바는 문자열을 상수로 관리하기 때문에 원본 문자열의 수정을 허용하지 않고 새로운 객체 문자열로 만들어 버린다. 따라서 아래의 경우 s1은 새로운 문자열 객체의 참조값을 가리키게 되는 것이다.

String s1 = new String("자바 쵝오!!");
String s2 = s1; // 객체 복사X, 참조값 복사
s1 = "Java The Best!!";
System.out.println(s1);
System.out.println(s2);

Output)
Java The Best!!
자바 쵝오!!

자바는 기본적으로 모든 동작 방식이 Pass By Value 이다.
조금 더 복잡한 상황으로 완벽하게 이해해보자.

public class Person {

	String name;
	int age;

}

위와 같은 Person 클래스를 만들었다.
멤버 변수로 name, age가 존재한다.

public static void main(String[] args) {
		Person p1 = new Person();
		p1.name = "p1";
		p1.age = 20;
		
		Person p2 = p1;
		p2.name = "p2";
		p2.age = 21;
		
		System.out.println(p1.name);
		System.out.println(p1.age);
		System.out.println(p2.name);
		System.out.println(p2.age);

	}

위와 같은 코드를 작성하면 output은 어떻게 될까?
답은 다음과 같다.

p2
21
p2
21

과정을 좀 더 자세히 들여다 보자.

위와 같이 모든 객체들은 참조값을 들고 있고 내용에 수정이 가해지면 참조값이 변경되는 것이다.

Primitive 자료형(int age와 같은) 은 직관적으로 이해가 가는데, Non-Primitive 자료형(String name과 같은) 은 참조값이 변경된다는 점을 간과하면 헷갈리기 시작하니 조심하자.

profile
CS, 개발 공부기록 🌱

0개의 댓글