본문 바로가기

Java95

[Java] 문자열 생성 클래스 - String, StringBuffer, StringBuilder 차이점 자바에서 문자열은 독특한 특성을 가지고 있다. 바로 불변(Immutable)이라는 특성이다. String 타입의 객체는 한번 생성되면 할당된 메모리 공간이 변하지 않는다. '+' 연산이나 concat 등의 메소드를 이용해서 문자열을 수정할 때, 기존에 존재하는 String 객체의 데이터가 수정되는 것이 아닌 연산의 결과로 만들어지는 문자열을 이용해 새로운 String 객체를 생성하는 형태로 동작한다. 문제는 '+' 연산이나 concat() 등의 메소드를 이용해 문자열을 수정할 때마다 새로운 String 객체가 생성된다는 점이다. 예를 들어 다음과 같은 코드가 있다고 생각해보자. String str = "String"; for (int i = 0; i < 100; i++) { str = str + i; }.. 2021. 6. 17.
[Java] LinkedHashMap 사용법 및 예제 - HashMap과 차이점 LinkedHashMap Map 인터페이스를 구현한 클래스 중에 TreeMap과 HashMap은 매우 단순해서 많이 사용된다. 그 외에 조금 특이한 Map 클래스들이 있는데 LinkedHashMap이 그 중 하나다. LinkedHashMap은 Map에 입력된 순서를 기억하는 자료구조다. LinkedHashMap에 저장되는 키와 값은 Map.Entry 클래스를 구현한 Node 클래스에 저장된다. Node 클래스에는 before, after 멤버가 있는데, LinkedHashMap에 입력된 순서에 따라 연결 리스트 구조를 형성한다. LinkedHashMap 사용법 LinkedHashMap은 기본적으로 HashMap이다. 사용법은 HashMap과 동일하다. HashMap에 대해서 정리해 놓은 포스트를 참고하자.. 2021. 6. 16.
[Java] TreeMap 사용법 및 예제 TreeMap TreeMap은 이진트리를 기반으로 Map 인터페이스를 구현한 컬렉션 클래스다. HashMap과 마찬가지로 키와 값(Key-Value) 쌍을 저장한다. HashMap은 키의 해시값을 기반으로 해시테이블을 구축하는 반면 TreeMap은 키 값을 이용해서 이진트리를 구축하고, 이진 트리의 노드에 값을 엔트리(Entry) 형태로 저장한다. 이진트리를 구축했기 때문에 키 값에 따라 정렬된 상태로 저장한다. TreeMap이 키와 값을 내부에 저장하는 이진트리는 '레드-블랙트리(Red-Black Tree)'로 구현되어있다. 일반적인 이진트리의 성질에 균형잡힌 트리(Balanced Tree)의 특성을 부여한 이진트리로 노드들이 트리의 전반에 걸쳐 고르게 분포된다. (이는 곧 Skew 되지 않음을 의미하.. 2021. 6. 14.
[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] 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.
[Java] InputStream 객체와 File 객체 상호 변환하기 자바 프로그래밍에서 InputStream 객체를 File 객체로 만들거나 File 객체를 InputStream 객체로 만들어야 할 경우가 종종있다. 사용하고자하는 API에서 어떤 객체를 입력으로 받는지에 따라 상호변환이 필요할 수 있다. File 객체에서 InputStream 객체 얻기 우선 File 객체를 InputStream 객체로 만들어보자. File file = new File("path to file"); InputStream inputStream = new FileInputStream(file); FileInputStream 객체를 생성할 때, File 객체를 넘겨주면 된다. 간단한 사용법이다. InputStream 객체에서 File 객체 만들기 InputStream 객체는 어디에선가 데이터를.. 2021. 5. 26.