본문 바로가기

Old Posts/Java108

[Java] XML 서브 트리를 루트로하는 새로운 XML Document 생성 (org.w3c.dom.Node 클래스를 Document로 변환) XML 문서는 트리 형태로 해석할 수 있다. 그러다보니 루트에서 따라내려가다가 XML 문서의 특정 서브트리 부분을 루트로하는 새로운 XML 문서를 만들고 싶은 경우가 있다. 예를 들어 다음과 같은 XML Document가 있다고 하자. value 1 value 2 value 3 XPath 등을 이용해서 에 해당하는 Node 객체를 얻어왔을 때 노드의 서브 트리를 Root로 하는 새로운 Document를 얻어오고 싶을 경우가 있다. value 3 org.w3c.dom.Document 인터페이스에는 importNode() 라는 메소드가 있으며, 이 메소드를 이용해서 새로운 Document를 만들 수 있다. org.w3c.dom.Node 클래스를 Root로 하는 새로운 org.w3c.dom.Document를 .. 2021. 7. 28.
[Java] GSON 라이브러리 사용법 및 예제 - 자바 객체와 JSON 다루기 자바를 이용해 데이터를 주고 받을 때 직렬화(Serialize) 포맷으로 JSON이나 XML 같은 텍스트 포맷을 사용하는 경우가 많다. 특히 REST API를 통해 데이터를 제공하는 경우 json이나 xml 포맷을 표준으로 삼는 경우가 많다. 텍스트를 사용하는 만큼 데이터를 처리하는데 상당히 높은 수준의 유연성을 제공하기 때문이다. 다만 텍스트로 표현되어있는 데이터에서 원하는 데이터를 뽑아오기 위해서는 문서를 파싱해야한다. 이번 포스트에서는 JSON 문서를 파싱하기 위해 GSON 이라는 라이브러리를 사용하도록 하겠다. GSON GSON은 구글에서 만든 자바 오브젝트의 직렬화/역직렬화 라이브러리다. GSON은 내부적으로 리플렉션(Reflection)을 사용하고 있어 사용자가 귀찮게 이런저런 옵션을 넣어주지.. 2021. 7. 27.
[Java] Unmodifiable Collection vs Immutable 차이점 카프카 코드리뷰를 하다가 'Unmodifiable Collection'이라는 것을 보게 되었다. 카프카 소스코드는 다음과 같았다. private List drainRecords(int n) { if (isDrained() || position >= records.size()) { drain(); return Collections.emptyList(); } // using a sublist avoids a potentially expensive list copy (depending on the size of the records // and the maximum we can return from poll). The cost is that we cannot mutate the returned sublist... 2021. 7. 26.
[Java] 'for each' 구문에서 사용할 클래스 구현 자바에서 컬렉션에 들어있는 데이터를 순회하면서 처리할 때 반복문을 많이 사용한다. 가장 기본적으로 배열에 들어있는 데이터들을 하나씩 꺼내 출력하는 코드는 다음과 같다. public static void main(String[] args) { int array[] = {1, 2, 3, 4, 5}; for (int i = 0; i < array.length; i++) { System.out.println(array[i]); } } // 출력 // 1 // 2 // 3 // 4 // 5 초기부터 자바를 사용해왔거나 C언어 같은 언어롤 사용하던 프로그래머라면 이런 형태의 반복문이 자연스럽다. 하지만 자바는 컬렉션 데이터나 배열의 접근을 좀더 편하게 제공하기 위해서 'for each' 구문을 JDK 5.0 버전부.. 2021. 7. 25.
[Java] 컬렉션들의 시간복잡도 (Collection Big-O) 자바를 이용해서 알고리즘 문제를 풀거나 큰 사이즈의 데이터를 다룰 때, 컬렉션들의 정확한 시간복잡도(Big-O)를 알고 사용하는 것이 중요하다. 자칫 불필요하게 느린 컬렉션이나 메소드를 사용할 경우 예상치 못한 성능저하를 만날 수 있기 때문이다. List add() remove() get() contains() ArrayList O(1) O(n) O(1) O(n) LinkedList O(1) O(1) O(n) O(n) CopyOnWriteArrayList O(n) O(n) O(1) O(n) 참고로 LinkedList의 삭제 연산인 remove() 메소드는 삭제할 노드에 대한 참조를 가지고 있다는 가정하에 O(1)임을 유의해야한다. 만약 처음부터 지울 데이터를 찾아야한다면 탐색 비용인 O(n)이 소요된다... 2021. 7. 24.
[Java] json-simple (JSONObject, JSONArray, JSONParser) 사용법 및 예제 자바를 이용해 JSON 포맷으로 표현된 데이터를 손쉽게 다루기 위해서 'json-simple'이라는 라이브러리를 사용할 수 있다. 문자열 형태로 데이터를 표현하는 JSON 문서를 파싱하고 각 엘리먼터들을 손쉽게 접근하고 변경할 수 있다. 요즘 REST API 들이 데이터를 JSON 형태로 제공하는 경우가 많은데, 이 경우 JSON 형태의 문자열 데이터를 파싱해야할 필요가 생긴다. json-simple 라이브러리 의존성 메이븐(Maven) 프로젝트를 사용하는 유저라면 간단하게 다음 의존성(Dependency)을 추가하면 json-simple 라이브러리를 사용할 수 있다. 일반 프로젝트라면 json-simple 라이브러리가 포함되어 있는 jar 파일을 프로젝트에 포함해야한다. com.googlecode.js.. 2021. 7. 23.
[Java] 자바 리플렉션(Reflection) 예외들 : IllegalAccessException,IllegalArgumentException, InvocationTargetException 자바 리플렉션을 이용해서 자바 클래스 정보에 접근해 이런저런 작업을 하는 경우가 있다. 예를 들어 클래스에 있는 모든 getter 메소드를 호출해서 멤버 값들을 가져오는 코드를 다음과 같이 작성해볼 수 있다. import java.lang.reflect.Method; public class Test { private String name; private String address; public Test(String name, String address) { this.name = name; this.address = address; } public String getName() { return name; } public String getAddress() { return address; } private .. 2021. 7. 22.
[Java] jmap 에러 - InvocationTargetException, Supported versions are 24.201-b00. Target VM is 25.131-b11 자바 애플리케이션의 메모리 덤프를 하기 위해 jmap 명령을 사용하다가 다음과 같은 에러를 만나게 되었다. $ jmap 1234 Attaching to process ID 1234, please wait... Exception in thread "main" java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMetho.. 2021. 7. 21.
[Java] 자바 상속(Inheritance)과 위임(Delegation) 차이점 자바를 이용해서 클래스를 구현할 때 '상속(Inheritance)'과 '위임(Delegation)'을 이용해서 두 클래스를 연관시킨다. 클래스의 상속과 위임 방식에 대해서 설명을 하고 어떤 상황에서 어떤 것을 선택해야하는지 알아보자. 클래스의 상속(Inheritance) 객체지향 프로그래밍 언어에서 다른 클래스를 상속해서 새로운 클래스를 정의할 수 있다. 예를 들어 Person 클래스를 생각해보자. class Person { protected int age; protected String name; public Persion(int age, String name) { this.age = age; this.name = name; } public int getAge() { return this.age; } .. 2021. 7. 20.