기록/JAVA10 [JAVA] Queue 인터페이스 구현하기 (3) ArrayDeque Queue라는 인터페이스를 구현하는 방식 중 ArrayDeque에 대해서 알아본다. add - offer이 완전히 동일한 것을 제외하면 나머지는 queue 추상메서드의 의도대로 구현되었다. ArrayDeque ArrayDeque은 내부적으로 다음의 변수를 사용한다. 이 변수들은 transient를 사용해서 직렬화되지 않는다. Object[] elements deque의 요소가 저장되는 배열. 항상 2의 거듭제곱이 배열의 길이가 된다. deque요소를 보유하지 않는 모든 배열 셀은 항상 null이다. int head deque의 head 요소의 "인덱스". deque가 비어있는 경우 tail과 같은 임의의 숫자가 저장된다. int tail deque의 다음요소가 추가될 "인덱스". private int M.. 기록/JAVA 2023. 7. 11. [JAVA] Queue 인터페이스 구현하기 (2) LinkedList Queue라는 인터페이스를 구현하는 방식 중 LinkedList에 대해서 알아본다. LinkedList LinkedList는 내부적으로 다음의 변수를 사용한다. 이 변수들은 transient를 사용해서 직렬화되지 않는다. int size 크기 Node first 첫번째 노드를 가리킨다. Node last 마지막 노드를 가리킨다. modCount는 LinkedList가 상속받은 AbstractSequentialList 내부적으로 쓰이는 변수다. 객체의 구조적 변경 횟수를 추적하기 위해 사용된다. Node LinkedList에서 사용하는 Node 클래스다. 한 노드에는 아이템과 이전 노드 주소, 다음 노드 주소를 저장한다. private static class Node { E item; Node next; .. 기록/JAVA 2023. 7. 11. [JAVA] Queue 인터페이스 구현하기 (1) Queue Queue라는 인터페이스를 구현하는 방식은 일반적으로 ArrayDeque, LinkedList 두 가지가 있다. 이 두 가지 클래스가 Queue의 추상메서드를 어떤 식으로 수행하는지 비교해보고자 한다. (java 1.8 기준) 그 이전에, 큐가 어떤 것인지부터 짚어본다. Queue란? 큐는 데이터를 일시적으로 저장하고 처리하는 자료구조다. 데이터를 먼저 입력한 순서대로 저장하고, 먼저 입력된 데이터가 먼저 처리되는 FIFO(First-In-First-Out)원칙을 따른다. 은행 창구, 버스정류장 등 일반적인 일상생활에서의 대기줄을 생각하면 쉽다. Queue 추상 메서드 목록 Queue 인터페이스에는 다음과 같은 추상 메서드가 있다. 이 메서드를 잘 기억해서, ArrayDeque이나 LinkedList에서.. 기록/JAVA 2023. 7. 10. [JAVA] System.arraycopy, Array.clone() 보호되어 있는 글 입니다. 2022. 5. 1. [JAVA] 예외처리의 비용 예외처리에도 비용이 있다. [이 문제]를 풀다가 처음 발견했다. 더 자세한 내용은 [Exceptions are slow in Java] 라는 포스팅을 읽고 알게되었다. 1. Filling in the stack trace is slow 한 예외마다 대략 1~5ms정도의 시간이 걸린다. 이 대부분의 시간은 exception thread stack을 채우는 데 걸리는 시간이다. stack trace가 깊을 수록, 더 오랜 시간이 걸린다. 대부분의 경우 예상할 수 없는 문제에 exception을 던지기 때문에 생성될 exception이 얼마나 많은 시간이 걸릴 지 알 수 없는 것도 문제다. 2. How to avoid the stack trac penalty? Using non-exceptional metho.. 기록/JAVA 2022. 4. 30. [JAVA] library, framework, pattern, architecture 차이 보호되어 있는 글 입니다. 2022. 4. 19. [JAVA] String.format 과정 신나는 함수 실행 문제를 풀던 중에 코드를 깔끔하게 하려다 메모리는 두 배, 시간은 세 배 걸리는 일이 있어서 원인을 찾아보았다. 두 코드의 다른 점은 한 줄이었다. 밑의 두 코드 출력결과는 동일하다. sb.append("w(").append(a).append(", ").append(b).append(", ").append(c).append(") = ").append(funcW(a,b,c)).append("\n"); sb.append(String.format("w(%d, %d, %d) = %d\n",a,b,c,funcW(a,b,c))); 그래서 도대체 String.format은 어떤 과정을 거치는지 확인해봤다. String.format()의 동작 과정 1. String.java 1) 새 Formatter.. 기록/JAVA 2022. 4. 8. [JAVA] 전위연산, 후위연산 메모리 및 속도 차이 보호되어 있는 글 입니다. 2022. 3. 14. [JAVA] StringBuilder의 append(), String의 + 연산자 속도차이 StringBuilder의 append()와 String의 +연산자의 속도차이 자바에서 String은 변경이 안되는 객체이기 때문에 +연산을 하면 내부적으로 새 메모리를 할당받아서 사용한다고 한다. 그래서 String의 변경이 많은 경우에는 StringBuilder를 사용한다. 그런데 이 둘의 속도차이는 대략 어느정도 나는지, 정확히 어떤 부분에서 차이가 발생하는지 궁금해서 테스트해봤다. 테스트코드 초반 tc가 결과값이 좀 튀어서 앞의 두번 정도 계산하지 않고 12번 돌렸다. 출력창의 (final O)표시는 무시해도 된다. 출력창 문자열 지우는걸 깜빡했다. final과 일반 string을 둘다 테스트해봤는데 내 컴퓨터에서는 유의미한 차이가 나지 않아서 코드를 지웠다. public static void m.. 기록/JAVA 2022. 3. 11. [JAVA] StringBuilder의 insert, append insert StringBuilder의 insert메서드는 다시 AbstractStringBuilder의 insert메서드를 실행한다. insert 메서드 내에서 직접 한 번, str.getChars() 메서드 안에서 한 번 호출되어 총 System.arraycopy() 메서드가 두 번 호출된다. //AbstractStringBuilder.java 클래스 public AbstractStringBuilder insert(int offset, String str) { if ((offset length())) throw new StringIndexOutOfBoundsException(offset); if (str == null) str = "null"; int len = str.. 기록/JAVA 2022. 3. 10. 이전 1 다음