본문 바로가기

포스트464

[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.
[Java] 자바 메모리 덤프 분석 - jps, jmap, jhat 사용법 및 예제 자바는 가비지 컬렉터(Garbage Collector)를 사용하는 언어다. 프로그래머가 명시적으로 사용하던 메모리를 해제해야하는 C언어와는 다르다. 덕분에 '메모리 릭(Memory Leak)' 걱정은 없지만 바람직하지 않은 객체 생성과 사용으로 메모리 사용량이 폭증할 수 있다. 자바 애플리케이션이 수행되면서 '힙 메모리(Heap Memroy)' 사용량이 이상하게 많거나 점점 증가해서 OutOfMemory 에러가 발생하기도 한다. 메모리 사용량 측면에서 이상 동작이 감지되었을 때, JVM이 사용하는 메모리 영역을 분석할 방법이 필요하다. JVM의 메모리 사용을 모니터링하고 분석할 수 있는 다양한 상용 제품들이 있지만 가장 기본적인 툴인 jps, jmap, jhat을 알고 있으면 큰 도움이 된다. 이 툴들은.. 2021. 7. 19.
[Java] synchronized 블럭 사용시 주의 사항 - final 필드 멀티스레드 환경에서 여러 스레드(Thread)가 동시에 하나의 리소스에 접근하는 경우가 있다. 불변 객체의 경우 문제가 없지만 객체에 대한 수정이 가해질 경우 동시성 문제가 발생한다. 자바는 프로그래밍 언어 문법으로 동시성을 제어할 수 있는 synchronized 키워드를 제공하여 별도의 라이브러리를 사용하지 않고도 손쉽게 멀티 스레드 환경에서의 동시성 제어를 구현할 수 있다. 예를 들어 다음 코드를 살펴보자. class TestObject { private long value; TestObject(long value) { this.value = value; } public long getValue() { return this.value; } public void setValue(long value) {.. 2021. 7. 18.