Java - Double Brace Initialization
1 분 소요
Java - Double Brace Initialization
- Java에는 Double Brace Initialization이라는 것이 있습니다. 가령 HashMap을 만들고 그 즉시 값도 집어넣고 싶을 때, Double Brace Initialization을 사용할 수 있죠.
- 아래 코드에서 보시면
new HashMap<>(){{ ... }}
사이에서 put()
메소드를 사용해서 (key, value)
를 모두 넘겨줬죠. 이를 통해 선언하면서 바로 내부 요소들까지 집어넣어줄 수 있습니다.
import java.util.*;
class Main {
public static void main(String[] args) throws Exception {
// Double Brace Initialization
HashMap<String, String> hashMap2 = new HashMap<>() {{
put("A", "1"); put("B", "2");
}};
System.out.println(hashMap1);
// {A=1, B=2}
}
}
- 아, 역시 그렇지, python처럼 java에서도 이렇게 깔끔하게 만들어주는게 필요해, 라고 생각하셨을 수 있지만, 사실 이렇게 만들 경우, class가 달라집니다. 아래에서 보시는 것처럼 결과는 같지만, class를 확인하면 class가 서로 다른 것을 알 수 있습니다.
import java.util.*;
class Main {
public static void main(String[] args) throws Exception {
// hashMap1은 보편적인 방법으로 HashMap을 만들어 주고
// .put method를 통해서 key, value를 넣어주죠.
HashMap<String, String> hashMap1 = new HashMap<>();
hashMap1.put("A", "1");
hashMap1.put("B", "2");
// hashMap2은 Double Brace Initialization을 통해 처리합니다.
HashMap<String, String> hashMap2 = new HashMap<>() {{
put("A", "1"); put("B", "2");
}};
// 들어온 값은 동일하지만,
System.out.println(hashMap1); // {A=1, B=2}
System.out.println(hashMap2); // {A=1, B=2}
// Class들이 서로 다른 것을 알 수 있죠.
// 사실, hashMap2은 anonymous class로 넘어오게 됩니다.
System.out.println(hashMap1.getClass());
// class java.util.HashMap
System.out.println(hashMap2.getClass());
// class com.company.Main$1
}
}
Summary
- 정리하자면, Double Brace를 사용하면, 생성과 초기화를 한번에 할 수 있어서 코드의 가독성이 높아지죠.
- 그러나, 새로운 Class가 만들어지게 되고, Serialization이나 garbage collection에서 예기지 못한 문제가 발생할 수 있게 되죠.
Reference
댓글남기기