java에서 hash나 tree 계열 (흔히 rb로 구현된) map은 key 값이 주어졌을 때, value를 빠르게 찾는 자료구조입니다. 예를 들어, hash 계열의 map은 key 값을 가지고 계산된 hash 값을 가지고, 특정한 버킷에서 값을 찾아버립니다. Treemap이나 set은 정렬이 되어 있습니다. key값의 대소에 따라 정렬이 되어 있다면, 적절한 연산을 통해 O(log(size))의 복잡도로 찾기 연산을 수행할 수 있습니다. 문제는, 이런 경우입니다. 값을 기준으로 키도 빠르게 찾아내려면 어떻게 해야 할까요? TreeMap이나 HashMap이 Key값을 토대로 Value를 빠르게 찾아낸다고 했습니다. 반대로 생각하면 어떨까요? Value 값을 토대로 대응되는 키 값을 빠르게 찾아내려면, 키..
Java 검색 결과
자바에서 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만 있는 경우에는 그냥 이렇게 생성자만 둬도 무난할 겁니다. 굳이 아래와 같이..
setter나 getter는 엄청나게 쓰는 메서드들이기도 합니다. 그런데, 문득 setter는 왜 사용을 지양해야 한다고 할까? 에 대해서 곰곰히 생각해 보게 되었습니다. 사실, 이 질문에 대해서, 명확하게 떨어질 만한 답을 찾지 못하였습니다. 대신에, 외부에서 세터 를 호출해서, 변경이 되면 위험한 속성들에 대해서 다시 생각해 보게 되었습니다. 그에 대한 답 부터 해 보도록 하겠습니다. setter는 객체의 속성을 변경하는 메서드입니다. 예를 들자면 Dog라는 모델이 age와 이름을 가지고 있을 때, setName은 이름을 바꿔줄 때 쓰고, setAge는 나이를 바꿔줄 때 쓰입니다. 굳이 이들의 존재에 대해서 잘 모르더라도, Collections를 보시면 쉽게 찾을 수 있습니다. 예를 하나 들어보겠습니..
면접 질문들을 모아놓은 레포를 보다 보면, 싱글톤 패턴은 많이 언급한다는 것을 알 수 있습니다. 거기서 DCL 패턴이 나오고, volatile도 나오는데요. 여기서 volatile이 무엇을 의미할까요? 먼저, 간단하게 프로그램을 작성해 보겠습니다. Main 스레드와 Worker1 스레드 하나가 있습니다. 이 프로그램은, Main Thread에서 w1의 stop flag를 중간에 true로 셋팅합니다. Worker1의 run 메소드는 그냥 stop flag가 false이면 계속 돕니다. 결과가 어떻게 나올까요? 공교롭게도, 0 : stop flag만 출력하고 더 이상 진행되지 않습니다. 이는 왜 그럴까요? 공식 문서를 보면 자세히 알 수 있습니다. Note 바로 윗 단락의 내용을 천천히 봅시다. 일단, w..
최근댓글