쉽게이해하도록 그림으로 그려봤다.
이론상 틀린 그림형태이거나 구조일순있으나 컨셉자체를 잡고 가는데 도움이 될것이다.
이 모든건 자바가 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}}
'IT > java' 카테고리의 다른 글
Arrays.asList ... clear remove, UnsupportedOperationException ... (0) | 2017.09.14 |
---|---|
enum switch (0) | 2017.09.08 |
숫자 판단 isdigit 는 아니지만... 문자 판단 (0) | 2016.09.08 |
map 의 .merge ( java 8 lambda) 값 증가 를 간단히 (0) | 2016.09.06 |
json <-> map (0) | 2016.08.17 |