쉽게이해하도록 그림으로 그려봤다.
이론상 틀린 그림형태이거나 구조일순있으나 컨셉자체를 잡고 가는데 도움이 될것이다.

이 모든건 자바가 call by value 이기 때문이다.

package com.javaTest.Ref;

import java.util.HashMap;
import java.util.Map;

/**
* Created by macbookpro on 2016. 12. 12..
*/
public class Ref001 {

public static void main(String[] args) {
Ref001 main = new Ref001();
main.ref001();
}

public void ref001() {
int a= 1;
Map map = new HashMap<>();

Map entireMap = new HashMap();

entireMap.put("map",map);
entireMap.put("a",a);

if(entireMap.get("map") == map) {
System.out.println("== same...");
}
if(entireMap.get("map").equals(map)) {
System.out.println("equals same...");
}

doTest(entireMap);
System.out.println("changed::"+entireMap.toString());

doTest2(entireMap);
System.out.println("no changed 2::"+entireMap.toString());

doTest3(entireMap);
System.out.println("no changed 3::"+entireMap.toString());
}

private void doTest(Map entireMap) {
System.out.println(entireMap.toString());
entireMap.put("a",2); // 이 값은 바뀜
Map m = (Map) entireMap.get("map");
m.put("change","Y");

}

private void doTest2(Map entireMap) {
// 이건 지워지지 않는다. 왜냐면 자바는 COV 이다 copy of value. 해서 지워지지 못한다
// 다만 primitive 타입이 아니면 참조복사가 되어 수정된다 해서 doTest 는 수정된것이다.
entireMap = new HashMap();

}

private void doTest3(Map entireMap) {
// cpv 이다 해당 레퍼런스에 직접 뭔가 하지 않는이상 모든 행위는(각종 재선언. 즉 new 나 다른 레퍼런스 대입) 복제된곳에 하는거다.
Map newMap = new HashMap();

entireMap = newMap;

}

}


결과

== same...
equals same...
{a=1, map={}}
changed::{a=2, map={change=Y}}
no changed 2::{a=2, map={change=Y}}
no changed 3::{a=2, map={change=Y}} 



+ Recent posts