아래 코드는 복제와 참조에 관련된 간단한 코드이다.

runValue 메소드를 실행하면 결과는 1이 나오고, runReference 메소드를 실행하면 결과가 2가 나온다.
21행을 살펴보면 변수 b에 담긴 인스턴스의 id 값을 2로 변경했을 뿐인데 a.id의 값도 2가 된 것이다.
변수 b와 변수 a에 담긴 인스턴스가 서로 같다는 것을 의미한다.
* 자바에서는 int와 같이 기본 데이터 타입은 복제를 한다. 기본 데이터 타입이 아닌 것은 참조가 되어 참조 데이터 타입이라고 하며, new 사용해서 객체를 만다는 모든 데이터 타입은 참조 데이터 타입이라고 생각하자!
아래 코드는 메소드의 매개변수는 어떻게 동작하는지 살펴보는 코드이다.

먼저, 4행 ~ 12행의 코드를 살펴보자
메소드 _value의 매개변수는 기본 데이터형인 int이다. runValue에서 _value의 인자로 a를 전달하였고 인자 a는 매개변수 b가 되어서 _value 안으로 전달이 되고 _value 안에서 b의 값을 변경하였다. 그리고 runValue를 실행한 결과 1이 나온다. 이 코드에서는 기본 데이터 타입으로만 이루어지고 있기 때문에 복제만이 작동하고 1이 나오는 결과는 당연하다고 볼 수 있다.
그 다음 14행 ~ 22행의 코드를 살펴보자
_reference1의 매개변수로는 참조 데이터 타입(A b)을 전달하고 있다. 메소드 _reference1 안에서는 매개변수 b의 값을 다른 객체로 변경하고 있다. 이 코드는 지역변수인 b의 데이터를 바꾼 것이기 때문에 runReference1의 결과에는 영향을 미치지 못하고 결과가 1이 나오게 된다.
마지막으로 24행 ~ 32행의 코드를 살펴보자
14행 ~ 22행의 코드와 비슷한데 살짝 다른 점이 있다.
_reference2는 매개변수 b의 값을 다른 객체로 교체한 것이 아니라 매개변수 b의 인스턴스 변수 id 값을 2로 변경하고 있다. _reference2의 변수 b는 runReference2의 변수 a와 참조 관계로 연결되어 있기 때문에 a와 b는 모두 같은 객체를 참조하고 있는 변수이다. 따라서 결과가 2로 나오게 된다.
조금 더 풀어서 설명해 보자면 _reference2의 매개변수 A b는 즉, A b = a 이다.
runReference2에서 생성한 A a는 a = 1이다. (A라는 객체의 인스턴스 변수 a 값이 1, 이것은 참조)
runReferece2에서 _reference2 메소드를 호출하면서 a가 A b의 인자로 전달 되었고 b.id = 2로 변경(b를 생성)되면서 a와 b가 같은 객체를 참조하게 되는 것이다.
'TIL > Java' 카테고리의 다른 글
[SIST] Java_days02 (0) | 2022.02.16 |
---|---|
[SIST] Java_days01 (0) | 2022.02.15 |
[Java] replace (0) | 2022.02.07 |
[Java] enum(enumerated type) (0) | 2022.02.07 |
[Java] Clone (0) | 2022.02.01 |