2021년 10월 09일 TIL
이번 주말에는 프로젝트가 끝나고 조금 하고 싶던 공부를 해야겠다고 생각하여, 자료구조를 공부하기로 했다.
문득 그런 생각이 들었었다. java의 Collections를 정말 많이 사용하고 있는데,(Map은 java에서 Collection 으로 분류하고 있지는 않지만, 일단은 이것도 포함해서) java에서 그 내부 동작이 구체적으로 어떻게 구현되어 있는지가 궁금했다.
그래서 무작정 자바 내부 코드를 타고 들어가서 어떻게 구현되어있는지 보기로 했다.
(번외 - 이 과정에서 굉장히 뜬금없이 Scanner와 BufferedReader의 속도 차이가 왜 발생하는지도 궁금해서 찾아보기도 했다.
Scanner 내부에서 문자열을 입력받으면
nextInt를 예로 들면, intergerPattern()이라는 메소드를 중간에 한번 거치게되는데, 그 메소드 내부에서 buildIntegerPatternString으로 들어간다.
이후 그 안에서 정말 많은 정규 표현식을 검사하고 검사된 문자열을 반환하는데, 이 부분에서 성능 이슈가 발생하는 것으로 생각되었다.
System.in이 inputStream 객체라는 것을 알게된 것도 재미있었다. 이게 Byte단위로 데이터를 받으니, inputStreamReader로 이 단위 데이터를 문자 단위로 싸고, 이것을 또 다시 BufferedReader로 싸서 한번에 전송하는 것이다.)
결론부터 말하자면, 다른 것들보다 HashSet의 방식을 이해하는 것이 꽤 어려웠었다.
다른 것들은 어느정도 기존에 알고 있던 것들이었다. Object[] 을 사용하는가 Node를 사용하는가 정도의 개념차이만 있었고, 대략적으로 이렇게 동작하는 구나를 이해한채로 읽으니 이해가 빨랐다.
다만 조금 어려웠던 것은 HashMap 쪽이었다. 특히 어려웠던 부분이, resize()로 용적 크기를 재설정할 때 도대체 어떤 원리로 재배치를 하는 지 이해하기가 어려웠었는데, 한참 보고 인터넷도 찾아보니 그 원리를 알 수 있었다.
그에 대한 내용은 내일 더 공부해보고 정리해보고자 한다!
(10일 TIL에 이어서 계속)