본문 바로가기

Java95

[Java] SAXParser Exception - "[Fatal Error] :1:1: Premature end of file" 예외 해결방법 자바 애플리케이션에서 SAX 파서를 이용해 XML 문서를 파싱하다가 다양한 예외를 만나게된다. 이번 포스트에서 설명할 예외는 "[Fatal Error] :1:1: Premature end of file." 혹은 "[Fatal Error] :1:1: 예기치 않은 파일의 끝입니다."라는 Exception이다. 말 그대로 SAX 파서의 입력 스트림이 예상하지 갑작스레 끝났을 경우에 발생한다. 가장 흔한 예외 케이스는 SAX 파서에 빈 문자열이 입력되면 발생한다. 다음 예제 코드르 보자. import java.io.StringReader; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import.. 2021. 7. 29.
[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] 자바 리플렉션(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] 자바 상속(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.
[Java] 자바 메모리 덤프 분석 - jps, jmap, jhat 사용법 및 예제 자바는 가비지 컬렉터(Garbage Collector)를 사용하는 언어다. 프로그래머가 명시적으로 사용하던 메모리를 해제해야하는 C언어와는 다르다. 덕분에 '메모리 릭(Memory Leak)' 걱정은 없지만 바람직하지 않은 객체 생성과 사용으로 메모리 사용량이 폭증할 수 있다. 자바 애플리케이션이 수행되면서 '힙 메모리(Heap Memroy)' 사용량이 이상하게 많거나 점점 증가해서 OutOfMemory 에러가 발생하기도 한다. 메모리 사용량 측면에서 이상 동작이 감지되었을 때, JVM이 사용하는 메모리 영역을 분석할 방법이 필요하다. JVM의 메모리 사용을 모니터링하고 분석할 수 있는 다양한 상용 제품들이 있지만 가장 기본적인 툴인 jps, jmap, jhat을 알고 있으면 큰 도움이 된다. 이 툴들은.. 2021. 7. 19.