java 1.5부터는 Concurrent 패키지가 도입되었습니다. 안 쓸 이유가 없을 겁니다. 왜냐하면, wait와 notify를 이용해서 관리하는 게 쉽지 않기 때문입니다. 제가 생활 코딩에 올린 일련의 글들을 보면 알 수 있습니다. 이번 시간에는 그 중 첫번째인 ArrayBlockingQueue를 알아보겠습니다. 이것은 BlockingQueue를 implements한 클래스입니다. Blocking이라고 하면 블록을 하는 것을 의미합니다. 큐이긴 큐인데, 넣는 연산도, 빼는 연산도 조건에 맞지 않으면 맞을 때 까지 대기할 수 있게끔 한 클래스입니다. 그런데, 이것을 구현한 구현체가 Array 어쩌고입니다. 보통 배열은 크기가 정해졌을 때 많이 써 먹으니, 버퍼의 크기가 정해진 생산자 소비자 문제에서 쓰..
Java 검색 결과
카톡 방에서, Arrays.sort를 호출했을 때, compare 함수에서 키 순서가 바뀌는 거 같다고 누군가 질문을 해 주셨습니다. 이 질문에 대한 답을 상세 분석에서 정리하고자 합니다. 당연하게도, 이 글은 java나 python에서 쓰는 timsort에 대한 내용은 아닙니다. 그런데, 설명을 보다 보면, 팀소트가 상당히 많이 언급됩니다. 즉, 알아두면 좋으니 이해하기 쉽게 되어 있는 이 사이트나, 네이버 d2에 올라온 글을 먼저 읽고 오시는 것을 권해드립니다. 여기에 팀소트 전체를 쓰기에는 넘사급으로 길어지기 때문입니다. java 8u41에서 실행하였습니다. 해당 상황을 재현하기 위해서, 간단하게 MyObj 클래스를 만들어 보았습니다. 여기에는 간단하게 getx하고, toString만 재정의 되어 ..
java에서 hash나 tree 계열 (흔히 rb로 구현된) map은 key 값이 주어졌을 때, value를 빠르게 찾는 자료구조입니다. 예를 들어, hash 계열의 map은 key 값을 가지고 계산된 hash 값을 가지고, 특정한 버킷에서 값을 찾아버립니다. Treemap이나 set은 정렬이 되어 있습니다. key값의 대소에 따라 정렬이 되어 있다면, 적절한 연산을 통해 O(log(size))의 복잡도로 찾기 연산을 수행할 수 있습니다. 문제는, 이런 경우입니다. 값을 기준으로 키도 빠르게 찾아내려면 어떻게 해야 할까요? TreeMap이나 HashMap이 Key값을 토대로 Value를 빠르게 찾아낸다고 했습니다. 반대로 생각하면 어떨까요? Value 값을 토대로 대응되는 키 값을 빠르게 찾아내려면, 키..
자바에서 Array 둘을 비교할 때에는 어떻게 해야 할까요? 카톡방에 올라온 질문이였습니다. 이에 대한 제 대답은 Arrays.deepEquals를 써라였습니다. 이 글에서도 잠깐 언급을 한 적이 있긴 했습니다만, 질문을 받다 보니, Arrays.equals라던지 equals랑 혼동되는 경우가 있는 듯 하였습니다. 예제 프로그램 하나를 보면서 이해해 보도록 합시다. 2차원 배열이 있습니다. 이들은 각각 2x2짜리 배열입니다. 그리고, 같은 내용물을 담고 있습니다. 첫 번째는 Arrays의 deepEquals, 또 다른 하나는 그냥 Arrays의 equals, 다른 하나는 그냥 equals였습니다. 실행 결과는 어떻게 나왔을까요? 결과는 true, false, false가 나옵니다. 어떻게 된 일인지, 8..
이번 시간에는 빌더 패턴에 대해서 알아보겠습니다. 이전에 언급한 객체의 완전한 상태, 메서드 체이닝, setter 관련 글을 보고 오시면 더 좋습니다. 그리고 HashMap이나 CharsetDecorder에서는 왜 빌더 패턴이 안 보이나도 같이 고민해 보면 좋을 듯 싶습니다. 생성자에 인자가 많은 것이 있음에도. 먼저, Model에서 x와 y가 필수 필드라고 해 보겠습니다. 그러면, 우리는 아래와 같은 생성자를 생각해 볼 수 있습니다. 아예 생성자에서 x와 y를 받게끔 해 버리면 그만입니다. 간단합니다. 그러면, p가 x만 있거나 y만 값이 있거나, 혹은 둘 다 값이 없는 불완전한 상태에서는 벗어날 수 있습니다. 사실, x와 y만 있는 경우에는 그냥 이렇게 생성자만 둬도 무난할 겁니다. 굳이 아래와 같이..
최근댓글