배경


운영중인 프로젝트 JDK 버전을 1.6에서 1.7로 버전업하는 작업을 진행하게 되었다. 버전 변경을 위해 pom.xml의 maven-compiler-plugin의 속성인 <source>와 <target>을 1.7로 수정하였고, TC를 수행하였는데 다음과 같은 에러가 발생하였다.



원인


문제는 PowerMock과 JDK 1.7간 버전 충돌이였으며, 그 이유는 JDK 1.7부터 바이트코드를 검증할 때 StackMapTable을 반드시 체크하도록 변경 되었기 때문이다. 이 방식은 기존 바이트코드 검증 방식과 호환성이 유지되지 않는다.


(개인적으로 PowerMock을 통해 static 영역을 mocking 하는 테스트 케이스가 더 문제라 생각한다.)


해결


자바 옵션에 -XX:-UseSplitVerifier 추가하여 해결하였다. 해당 옵션은 기존 방식으로 바이트코드를 검증한다는 의미로서, 사실 해결책이라기 보단 회피 방법이라고 보는 것이 좀 더 적합할 것 같다.

또한 JAVA 8에서는 해당 옵션이 deprecated 되었으니, 최종적으로 PowermockRunner를 사용하는 테스트 케이스를 수정하는 것이 좋을 것 같다.



참고자료



Posted by SungHoon, Park
,

자바 컬렉션 Map

기타 2016. 2. 13. 22:29

맵(Map)이란?

1) 맵(Map)은 key/value 형태를 가지는 자바 컬렉션이다. 컬렉션 프레임워크에 속하지만 List, Set과 다르게 Collection 인터페이스를 구현하지 않는다.


2) key는 고유하여야 한다. 만약 맵에서 같은 key를 사용하게 된다면 그 값은 덮어 씌워진다.

 

3) 대표적인 구현 클래스로는 HashMap, TreeMap 등이 있다.


HashMap

1) key 객체에 대한 hashCode() 메소드로 생성된 해시값을 사용하여 value를 저장하고 조회한다.


2) 순서를 보장하지 않는다. 입력순서를 보장받으려면 LinkedHashMap을 사용하면 된다.


3) HashMap은 멀티 쓰레드 환경에서 Thread Safe하지 않다. 이것이 HashTable과의 차이점이다.Thread Safe하지 않지만 모든면에서 HashTable보다 HashMap이 우위에 있다. HashTable은 1.1 이전의 레거시 코드를 위해서 유지가 될 뿐이지만 HashMap은 자바8에서도 계속 개선되고 있다. 만약 동기화가 필요하다면 synchronizedMap이나 ConcurrentHashMap 클래스를 이용하는 것이 좋다.


4) 저장방식

- HashMap에는 key/value 쌍을 나타내는 Entry<K, V>라는 내부 클래스가 있는데, HashMap 멤버변수로 Entry<K, V> 배열이 선언되어 있다. 이 배열에 key/value를 저장하게 된다.


- HashMap은 내부적으로 bucket을 사용하는데 bucket은 Map에 저장되는 element를 체계적으로 분산시켜 놓는 방법이라 할 수 있다. 해시값을 통해서 bucketIndex를 생성하고 Entry<K, V> 배열에 인덱스로 활용되어 값을 저장한다. bucket의 수는 load factor에 의해 결정된다.



- 다음은 HashMap put() 메소드의 일부이다.



※ 참고자료

https://en.wikipedia.org/wiki/Hash_table

- http://d2.naver.com/helloworld/831311

- http://iilii.egloos.com/4457500



'기타' 카테고리의 다른 글

자바 컬렉션 List  (0) 2016.02.13
버블정렬, 삽입정렬, 퀵정렬, 병합정렬  (0) 2016.02.04
Posted by SungHoon, Park
,

자바 컬렉션 List

기타 2016. 2. 13. 22:06

리스트(List)란?

1) 자바 콜렉션 프레임워크중에서 가장 많이 사용하는 자료구조는 리스트(List)일 것이다. 리스트는 특정 타입 값들이 순차적으로 정렬된 컬렉션이다. 대표적인 구현 클래스로는 ArrayList, LinkedList 등이 있다.


2) 배열 역시 데이터의 집합을 순차적으로 표현하는 용도이나 사이즈에 제한이 있다. 배열은 생성시 선언한 사이즈에 한해서 사용을 해야하는 단점이 있지만, 리스트의 경우는 사이즈에 대한 한계가 없다. 이 점이 배열보다 앞선 장점이 아닐까 한다.



ArrayList

1) 내부적으로 배열을 사용하는 List 인터페이스의 구현체이며, 배열의 특징을 모두 가지고 있다.


2) ArrayList 객체 생성시 배열과 같이 사이즈를 지정할 수 있다. 이 사이즈는 내부 배열의 초기 사이즈이다. 만약 크기를 지정하지 않는다면 기본 배열크기인 10이 설정된다.


3) 배열이 꽉 차게 된다면, ArrayList는 자동적으로 사이즈가 더 큰 배열을 생성하여 원소들을 재할당한다. 하지만 새로운 배열을 생성후 복사를 하는 과정이 있어야 하기 때문에 시간이 소요되고 메모리도 소모하게 된다는 단점이 있다. 따라서 데이터의 크기가 크거나 예측이 되는 사이즈라면 초기 사이즈 설정을 해주는 것이 더 효율적이다.


4) 배열의 시작 위치나 중간 위치에 새로운 원소를 추가하려고 하면 공간을 만들기 위해 새로운 배열 생성 및 복사를 하여 이동시켜 주는 작업이 진행되어야 하므로 효율적이지 못하다. (역시 배열의 특징)


5) 또한 원소를 삭제해도 배열의 크기는 줄어들지 않으므로 메모리 사용 측면에서 효율적이지 못하다.


LinkedList

1) 다음 노드를 가리키는 참조값이 있으며, 다음 노드만 참조하므로 단방향의 특징을 가지는 List 구현체이다.


2) 리스트의 첫번째 위치나 중간 지점에 데이터를 추가/삭제하게 된다면 다음 노드를 가리키는 참조값만 변경하여 주면 되므로 ArrayList보다 추가/삭제에 효율적이다.


3) 데이터 삭제시 앞뒤의 참조값만 변경해주면 되며, 제외된 값은 GC에 의해 소멸되므로 ArrayList와 달리 메모리 사용 측면에서 효율적이다.


4) ArrayList와 같이 인덱스로 바로 검색을 할 수 없으며 앞에서부터 순회하여 검색하여야 한다.



※ 참고자료

- 자바 프로그래밍 면접, 이렇게 준비한다


'기타' 카테고리의 다른 글

자바 컬렉션 Map  (1) 2016.02.13
버블정렬, 삽입정렬, 퀵정렬, 병합정렬  (0) 2016.02.04
Posted by SungHoon, Park
,