본문 바로가기

Old Posts/Java108

[Java] TreeMap 사용법 및 예제 TreeMap TreeMap은 이진트리를 기반으로 Map 인터페이스를 구현한 컬렉션 클래스다. HashMap과 마찬가지로 키와 값(Key-Value) 쌍을 저장한다. HashMap은 키의 해시값을 기반으로 해시테이블을 구축하는 반면 TreeMap은 키 값을 이용해서 이진트리를 구축하고, 이진 트리의 노드에 값을 엔트리(Entry) 형태로 저장한다. 이진트리를 구축했기 때문에 키 값에 따라 정렬된 상태로 저장한다. TreeMap이 키와 값을 내부에 저장하는 이진트리는 '레드-블랙트리(Red-Black Tree)'로 구현되어있다. 일반적인 이진트리의 성질에 균형잡힌 트리(Balanced Tree)의 특성을 부여한 이진트리로 노드들이 트리의 전반에 걸쳐 고르게 분포된다. (이는 곧 Skew 되지 않음을 의미하.. 2021. 6. 14.
[Java] HashMap 사용법 및 예제 HashMap 자바에서 제일 많이 사용되는 컬렉션 객체 중 하나가 바로 HashMap 일 것이다. HashMap은 Map 인터페이스를 구현한 대표적인 클래스로 Map의 특성을 그대로 이어받았다. HashMap은 키와 값으로 구성된 엔트리(Entry) 객체를 저장하는 자료구조로 키 객체의 해시코드를 이용해서 해시테이블을 탐색, 값을 가져오는 동작을 한다. HashMap에서 동일한 키에 대응되는 값은 하나만 저장할 수 있다. 따라서 동일한 키에 대응되는 값을 여러번 put() 메소드로 추가하면, 기존의 값은 덮어쓰여지고 마지막에 추가한 값이 살아남게 된다. HashMap은 이름에서도 알 수 있듯이 해시코드를 이용해서 값을 탐색한다. 따라서 특정 키에 해당하는 값을 빠르게 찾아올 수 있다는 장점이 있다. Ha.. 2021. 6. 10.
[Linux] mktemp 명령 사용법 및 예제 - 임시 파일 만들기 Bash 스크립트를 작성하다가 임시로 파일을 만들어서 사용하고 싶은 경우가 있다. 특정 파일 경로를 사용하면 스크립트를 동시에 실행할 경우 파일의 내용이 덮어쓰여지게 된다. 따라서 현재 실행 중인 프로세스에서만 접근할 수 있는 임시 파일을 생성할 필요가 생길 수 있다. 이럴 때 mktemp 명령을 사용하면 편하다. mktemp 사용법 mktemp 명령은 다음과 같이 사용할 수 있다. $ mktemp /tmp/tmp.Jgx8ybtklqk mktemp 명령을 실행하면 /tmp 디렉토리에 임의의 파일이 생성되고 생성된 파일의 이름이 리턴된다. 스크립트 내에서 임시로 사용할 파일을 생성할 때, 이 명령을 사용하고 출력되는 파일 이름을 사용하면 된다. -d 옵션을 이용해서 임시 디렉토리도 생성할 수 있다. $ m.. 2021. 6. 8.
[Java] TreeSet 사용법 및 예제 TreeSet TreeSet 클래스 역시 Set 인터페이스를 구현한 클래스다. Set 인터페이스를 구현했기 때문에 데이터에 대한 중복 저장을 하지 않으며, 저장된 순서를 유지하지 않는다. 해시코드를 이용해서 내부 해시 테이블에 데이터를 저장하는 HashSet과 다르게 TreeSet은 내부에 데이터 저장을 위한 RB-Tree(Red/Black Tree) 자료구조를 가지고 있다. RB 트리는 이진탐색트리(Binary Search Tree)의 일종으로 저장된 값들이 트리 전체에 고루 저장되도록하여 비정상적으로 트리의 높이가 높아지는 현상이 없게 만든 균형트리(Balanced Tree)다. 아무튼 내부에 RB 트리를 이용해서 값을 저장하기 때문에 현재까지 저장된 값들 중 최소 값 혹은 최대 값을 출력할 수 있으.. 2021. 6. 4.
[Java] HashSet 사용법 및 예제 HashSet HashSet 클래스는 Set 인터페이스를 구현한 클래스다. HashSet 클래스의 속성을 알아보기 전에 Set에 대해서 알 필요가 있다. Set은 우리말로 '집합'이라는 뜻을 가지고 있다. Set에는 데이터를 중복해서 저장할 수 없다. 동일한 데이터를 여러번 Set에 추가하더라도 결국 Set에는 하나의 데이터만 저장된다. HashSet은 데이터를 추가한 순서를 기억하지 않는다. 추가된 데이터를 정렬해주지도 않는다. 따라서 ArrayList처럼 인덱스를 통한 접근은 불가능하다. HashSet에 데이터를 추가하면, 객체의 hashCode() 메소드를 이용해서 HashSet에 추가하려는 데이터의 해시코드가 존재하는지 확인한다. 만약 동일한 해시코드를 갖는 객체가 존재한다면 equals() 메소.. 2021. 6. 3.
[Java] Deque (덱/데크) 사용법 및 예제 Deque(덱/데크) 덱은 Double-Ended Queue의 줄임말로 큐의 양쪽에 데이터를 넣고 뺄 수 있는 형태의 자료구조를 의미한다. 하나의 자료구조에 큐(Queue)와 스택(Stack)을 합쳐 놓은 형태라고 생각하면 된다. Deque의 앞쪽으로 데이터를 넣고 뒤쪽에서 빼면, 큐(Queue)처럼 사용할 수 있고, Deque의 앞쪽에 넣고 다시 앞쪽에서 빼면 스택(Stack)처럼 사용할 수 있다. 덱은 양쪽으로 입출력이 모두 가능하지만 이 중에 한쪽으로만 입력이 가능하도록 설정한 덱을 스크롤(Scroll)이라고 하며, 한쪽으로만 출력할 수 있도록 설정한 덱을 셸프(Shelf)라고 한다. Deque 사용법 Deque 생성 자바에서의 Deque은 인터페이스로 구현되어 있다. Deque deque1 = n.. 2021. 6. 1.
[Java] Vector 사용법 및 예제 Vector Vector 클래스는 ArraList 클래스처럼 List 인터페이스를 구현하고 있다. Vector 클래스는 ArrayList와 동일한 방법으로 데이터를 저장하고 있다. ArrayList처럼 저장 순서를 기억하고, 중복 데이터의 저장을 허용한다. 인덱스를 통해 특정 위치에 데이터를 추가하거나 특정 위치의 데이터를 제거할 수도 있다. Vector 객체 역시 데이터가 추가되면서 필요한 경우 자동으로 크기가 늘어나도록 구현되어 있다.(참고 : [Java] ArrayList 사용법 및 예제) ArrayList 클래스와 Vector 클래스는 큰 차이가 없다고 생각해도 된다. 다만 Vector 클래스는 멀티스레드 환경에서 동기화처리가 되어 있다. 반면 ArrayList 클래스는 멀티스레드 환경에 대한 고.. 2021. 5. 29.
[Java] PriorityQueue(우선순위 큐) 사용법 및 예제 Priority Queue(우선순위 큐) 일반적으로 '큐(Queue)'라는 자료구조는 먼저 들어온 순서대로 데이터가 소비된다. 즉 FIFO(First In First Out)의 동작을 갖는다. 큐와 비슷한 '우선순위 큐(Priority Queue)'라는 자료구조는 들어온 순서가 아닌 저장되어 있는 데이터 중 우선순위가 높은 순서대로 데이터가 소비된다. 'Priority Queue(우선순위 큐)'는 일반적으로 힙(Heap)이라는 자료구조를 이용해서 구현한다. 입력받은 데이터를 이용해서 최대힙 혹은 최소힙을 구성하고 데이터를 꺼낼때 루트노드에서 꺼낸다. 꺼내진 루트 노드에는 힙의 마지막 노드가 삽입되어 아래로 내려가면서 자기 자리를 찾아간다. Priority Queue는 내부적으로 힙을 이용해서 정렬된 상태.. 2021. 5. 28.
[Java] LinkedList 사용법 및 예제 list.remove(); // 첫 번째 값 제거 list.remove(3); // 3번째 값 제거 list.removeFirst(); // 첫번째 값 제거 list.lastFirst(); // 마지막 값 제거 list.clear(); // 모든 값 제거 LinkedList LinkedList(연결리스트)는 데이터가 저장되어 있는 노드(Node) 객체들을 참조 체인으로 엮어 놓은 자료구조다. LinkedList 객체 안쪽에는 노드들이 참조 체인으로 연결되어 있다. 각 노드들은 다음에 위치한 노드들의 참조를 들고 있다. 사용자는 LinkedList의 첫 번째 노드부터 따라가면서 원하는 데이터를 조회하게 된다. ArrayList와 다르게 중간에 데이터가 추가되거나 중간에 있는 데이터가 삭제되어도 앞으로 땡기.. 2021. 5. 27.