안녕하세요. chogahui05입니다. Java에는 HashTable이 있습니다. hash 기반의 자료구조를 동기화 했다고 생각하시면 편합니다. HashMap과 다른 부분 중 하나입니다. 먼저, 주요 필드들을 보도록 하겠습니다. table입니다. 이는, 무엇을 의미할까요? putVal 함수의 일부분입니다. tab에 table을 넣고 있습니다. 그리고 hash는 key 객체의 hashCode를 의미합니다. 이것과 무엇인가를 연산해서, index라는 값을 만들었습니다. 466번째 줄까지 보았을 때, index는 버킷 번호와 관련이 깊어 보입니다. 그리고 entry 값을 하나 받는데요. hashtable이나, hashmap은 키의 중복을 허용하지 않는 구조입니다. 그렇다면, 해당 버킷에 key가 있는지를 확인..
Java 검색 결과
hashMap은 동기화가 된 클래스가 아닙니다. 그렇기 때문에, 두 Thread에서 같은 hashMap에 동시에 접근했을 때, 문제가 발생할 수 있습니다. 둘 다 write 연산을 수행할 때에도 문제가 발생할 겁니다. 그런데, 왜 문제가 될까요? 문제가 되는 시나리오가 없을까요? 그 시나리오는, 당황하면 쉽게 생각할 수 없습니다. 두 Thread가 있습니다. 이 Thread들은, 서로 다른 값의 Integer인, 6개의 Key 값을 넣습니다. 그러면 put 메서드를 실행을 하게 될 건데요. 어떠한 일이 벌어질까요? 저는, 12보다 작아질 수 있다고 답변했습니다. 그 말이 맞을까요? 먼저 hashmap을 간단하게 보도록 하겠습니다. 3개의 static 변수만 봅시다. DEFAULT_INITIAL_CAPAC..
오버로딩과 오버라이딩의 차이는 JAVA 면접에서, 흔히 나올 수 있는 질문입니다. 이 중에 오늘은 오버로딩 (overloading)에 대해서 간단하게 알아보도록 하겠습니다. 여기에서 언급되지 않은 내용들은, 심화 편에서 이야기를 해 보도록 하겠습니다. 먼저, overload는, 클래스 내에서, 같은 메소드를 여러 개 선언하는 것을 의미합니다. 예를 들어, ArrayList 클래스를 봅시다. List에 넣을 item 하나를 받는 add 메서드가 있습니다. 그리고 특정한 위치와, List를 넣을 item을 받는 add 메서드가 있어요. 분명한 것은 이 두 메서드의 이름은 add로 같았다는 것입니다. 오버로딩을 언제 쓰면 좋을까요? 부터 생각해 봅시다. ArrayList의 맨 뒤에 item을 추가하는 기능. ..
재미있는 프로그램을 몇 개 만들어 보겠습니다. 제가 정의한 MObj는 아래와 같습니다. 평범한 getter 메소드가 있습니다. 그리고 더 평범한 equals 메소드가 있습니다. 그리고 hashCode가 있는데요. 리턴값이 0부터 1999까지의 정수 중에서 Random하게 뽑은 값입니다. 딱 봐도 뭔가 이상하다는 것을 알 수 있습니다. 이 이상해 보이는 프로그램을 왜 예시로 들었는지는 천천히 설명해 보도록 하겠습니다. 저번에 가비지는, 도달 불가능한 객체라고 하였습니다. 이것은 gc가 알아서 회수를 할 겁니다. 문제는, 필요 없는 객체인데, 참조 (흔히, Strong reference)가 되는 경우가 있을 수 있습니다. 이 경우에, 그 객체는 gc의 수거 대상이 되지 않습니다. 예를 하나 들어보겠습니다. ..
stop 메서드로 쓰레드를 강제 종료하면 위험하다고 했습니다. 그러면 어떻게 종료하면 좋을까요? 몇 가지 방법이 있는데요. 그 중 하나는 Interrupt 메소드를 쓰는 것입니다. worker Thread가 vector에 수를 넣는 연산을 한다고 해 봅시다. 그런데, 중간에 sleep을 넣어놓았습니다. 이 때 worker Thread에 Interrupt를 걸면 어떻게 동작하는지 봅시다. Main이 단위시간 1동안 sleep를 하고, Int를 출력합니다. 그리고 w1에 Interrupt를 보내는데요. 공식 문서에 나온 이 함수의 설명을 빌리면, 아래와 같습니다. 여기서 중요한 키워드를 뽑아보면, blocked, 인터럽트 status, receive, 인터럽트 예외 정도가 있습니다. wait나 join, s..
최근댓글