어레이리스트의 addAll 메서드의 성능에 대한 글이 간혹 보입니다. 메서드 내부를 뜯어 보면서, 어디서 오버헤드가 걸리는지 알아보도록 하겠습니다. 먼저 Main 클래스의 main 함수 내에 있는 코드는 아래와 같습니다. 생각보다 복잡하지 않습니다. 그냥 단순히 90개의 Integer를 x에 넣어놓고 List x에 있는 것들을 모두 y에 add하는 작업을 하는 코드입니다. addAll 안으로 들어가 보겠습니다. 가장 먼저 보이는 것은 c를 toArray로 바꾸는 것입니다. 즉, ArrayList c를 Array로 바꾸는 작업을 먼저 하는데요. 여기서 무슨 일을 하는지 안으로 들어가 보겠습니다. 일단 581번째 줄의 c는 무엇을 의미할까요? 90개의 Integer가 들어있는 ArrayList를 의미합니다...
Java 검색 결과
Map 계열 메서드 중에서 get, containsKey가 있습니다. 이들은 어떤 메소드들일까요? 먼저, 다음과 같은 정보는 어디에선가 들어보셨으리라 생각이 듭니다. map 계열 구조에 Key값에 대응되는 값 Value를 불러오고 싶을 때 보통 이렇게 많이 쓴다. 그런데, 프로그램 1과 같이 작성하면, 불필요한 연산을 2번 하게 된다. 프로그램 2와 같이 쓰는 것이 좋다. 왜냐하면 불필요한 연산을 수행하지 않기 때문이다. 네. 이 부분은 맞습니다. containsKey나 get나 내부적으로 getNodes라는 것을 호출하는데요. 이것을 1번 수행하냐, 2번 수행하냐의 차이는 생각보다 크게 다가올 수 있습니다. 여기서 질문 하나 드리겠습니다. 프로그램 1의 hm에 들어있는 key 값들의 집합을 k1이라고 ..
이번 시간에는 참조형에서의 upcasting에 대해 알아보도록 하겠습니다. 그리고 다형성에 대해서 간략하게 논해보도록 하겠습니다. 먼저 예제 프로그램을 보겠습니다. Animal 클래스와 Animal을 상속받은 dog와 cat이 있습니다. dog와 cat은 오버라이딩이 된 speak 메서드를 가지고 있습니다. Main 메서드는 위와 같습니다. 프로그램의 실행 결과는 어떻게 나올까요? 분명히, 저는 Animal 참조 변수 dog1과 cat1의 speak 메서드를 수행하였습니다. 그런데, 실행 결과는 I'm dog, I'm cat이 나옵니다. I'm animal이 아니라요. 동일한 type이지만, 다양한 결과가 나왔습니다. 이를 다형성이라고 합니다. 그런데, 우리는 dog나 cat을 참조하는 참조 변수 값을,..
요새 이것 저것 코드를 보면서 궁금했던 점을 하나씩 채워나가고 있습니다. 그 중 하나는, LinkedHashMap입니다. 사용 방법은 많이 나와 있으니, 여기에서는 따로 언급하지 않겠습니다. 이 글에서는 HashMap과 다른 점이 무엇인지 보면서 어떤 자료구조가 어떤 연산에서 상대적으로 오버헤드가 많이 걸리는지 분석해 보도록 하겠습니다. 먼저 hashMap입니다. 간단하게 "AA", "AE", "BA", "BE", "DA"를 넣고, hashMap에 있는 모든 키를 순회하면서 출력하는 예제입니다. HashMap의 구조를 그려보면 아래와 같습니다. 삭제를 하기 위해서, 각 버킷에서 해당 Key를 찾아서 remove를 할 겁니다. 그리고 insert 연산을 수행하기 위해서 Key가 어느 번호의 버킷에 들어가는..
네이버 블로그에 올린 옛날 글에 질문이 하나 달렸습니다. 그 질문에 대한 답변을 해 보겠습니다. java에서 어떠한 구분자를 기준으로 나누기 위해서 StringTokenizer를 쓰는 방법이 있습니다. 그런데, split라는 메서드도 존재합니다. 이 둘은 언제 잘 쓰면 좋을까요? 그리고 토크나이저를 쓰는 게 항상 올바른 선택이고, 항상 빠를까요? StringTokenizer의 내부를 보겠습니다. 먼저 토크나이저의 생성자를 보면, 3개의 인자를 가지는 생성자를 호출한다는 것을 알 수 있습니다. 여기에서, delimiters, currentPosition, newPosition 등을 setting 하는 것을 알 수 있습니다. hasSurrogate 라는 boolean 변수도 있다는 것을 알 수 있습니다. 그..
최근댓글