Don't give up!

[JAVA] 자바의 정석 정리(10장~11장 - ①) 본문

개발서적/JAVA의 정석

[JAVA] 자바의 정석 정리(10장~11장 - ①)

Heang Lee 2021. 5. 29. 23:24
자바의 정석을 읽고 정리한 내용입니다.

Java의 정석 - YES24

 

Java의 정석

최근 7년동안 자바 분야의 베스트 셀러 1위를 지켜온 `자바의 정석`의 최신판. 저자가 카페에서 12년간 직접 독자들에게 답변을 해오면서 초보자가 어려워하는 부분을 잘 파악하고 쓴 책. 뿐만 아

www.yes24.com


1. 형식화 클래스

(1) DecimalFormat 클래스는 숫자를 형식화하는데 사용된다. 생성자로 패턴을 설정하고, format함수로 숫자에 대한 패턴 문자열을 얻을 수 있다.

(2) ChoiceFormat은 특정 범위에 속하는 값을 문자열로 변환해준다. 두 배열의 크기와 순서를 맞추어 ChoiceFormat의 생성자로 사용함으로서 경계 값을 결정할 수 있다.

(3) MessageFormat은 데이터를 정해진 양식에 맞게 출력할 수 있도록 도와준다. 

(4) java.time 패키지의 클래스들은 String 클래스처럼 불변객체이다. 여러 쓰레드가 같은 객체에 접근할 수 있기 때문에 쓰레드에 안전하지 않다.

2. 컬렉션 프레임웍(Collections Framework)

(1) 컬렉션 프레임웍이란 데이터 군을 저장하는 클래스들을 표준화한 설계.

(2) 컬렉션 데이터 그룹을 크게 List, Set, Map 3가지로 분류할 수 있다.

인터페이스 특징
List 순서가 있는 데이터의 집합, 데이터의 중복을 허용
Set 순서를 유지하지 않는 데이터의 집합, 데이터의 중복을 허용하지 않음
Map key와 value의 쌍으로 이루어진 데이터 집합, 순서는 유지되지 않으며 키는 중복을 허용하지 않고 값은 중복을 허용한다.

(3) Vector, Hashtable과 같은 기존의 컬렉션 클래스들 대신 ArrayList와 HashMap을 사용하는 것이 좋다.

(4) Map.Entry 인터페이스는 Map 인터페이스의 내부 인터페이스이다. Map에 저장되는 key-value 쌍을 다루기 위해 내부적으로 정의되었으며, Map 인터페이스를 구현하는 클래스에서는 Map.Entry 인터페이스도 함께 구현해야 한다.

3. ArrayList, LinkedList

(1) ArrayList는 기존의 Vector를 개선한 것으로 Vector와 구현원리와 기능적인 측변에서 동일하다고 할 수 있다.

(2) ArrayList는 원소가 삭제될 때 마다 빈 공간을 채우기 위해 나머지 요소들이 자리이동을 한다. for문에서 요소의 삭제를 수행하고자 할 때 주의하여야 한다.

(3) 배열은 크기를 변경할 수 없고 중간에 데이터를 추가/삭제하는데 시간을 많이 소모한다. 이러한 LinkedList는 불연속적으로 존재하는 데이터를 서로 연결한 형태로 구성되어 있다.

(4) 실제 java의 LinkedList 클래스는 이전 요소에 대한 참조가 추가되어 있는 Doubly LinkedList로 구현되어 있다. 

(5) 순차적으로 추가/삭제하는 경우 ArrayList가 더 빠르고 중간 데이터를 추가/삭제하는 경우 LinkedList가 더 빠르다. (데이터의 개수가 그리 크지 않다면 어느 것을 사용해도 큰 차이가 나지는 않는다.) 

4. Stack, Queue

(1) 스택은 LIFO, 큐는 FIFO 구조로 되어 있다.

(2) 스택은 순차적으로 데이터를 추가하고 삭제하므로 ArrayList와 같은 배열 기반의 컬렉션 클래스가 적합하고, 큐는 첫 번째 저장된 데이터를 꺼내므로 데이터의 추가/삭제가 쉬운 LinkedList로 구현하는 것이 적합하다.

(3) PriorityQueue는 Queue 인터페이스의 구현체 중의 하나로, 저장 순서에 관계 없이 우선순위가 높은 것부터 꺼낸다. 저장공간을 배열로 사용하며, 각 요소를 Heap 자료구조의 형태로 저장한다.

(4) Deque는 Queue의 변형으로 양쪽 끝에 추가/삭제가 가능하다. ArrayDeque와 LinkedList는 Dequeu의 구현체이다.

5. Iterator, ListIterator, Enumeration

(1) 컬렉션에 저장된 요소를 접근하는데 사용되는 인터페이스이다.

(2) Iterator( )는 Collection 인터페이스에 정의된 메서드이다.  Collection 인터페이스로 구현된 클래스들은 Iterator를 사용할 수 있다.

(3) Enumeration은 Iterator의 구버전이다. 가능하면 Enumeration 대신 Iterator를 사용하는 것이 좋다.

(4) ListIterator는 List를 구현한 경우에만 사용하능하며 양방향으로 이동이 가능하다.

6. Arrays

함수 기능
toString( ) String으로 변환
copyOf( ), copyOfRange( ) 배열의 복사
fill( ), setAll( ) 배열을 값으로 채우기
sort( ) 배열을 정렬
binarySearch( ) 이진 검색으로 지정된 값이 저장된 위치를 반환
asList( ) 배열을 List에 담아서 반환
parallel<함수명>( ) 쓰레드를 나누어 작업을 처리
spliterator( ) 하나의 작업을 여러 작업으로 나누는 Spliterator를 반환
stream( ) Collection을 Stream으로 변환

(1) copyOfRange( )는 배열의 일부를 복사해서 새로운 배열을 만들어 반환한다. 지정된 범위의 끝은 포함되지 않는다.

(2) binarySearch( )는 배열이 정렬된 상태여야만 올바른 결과를 얻는다. 검색한 값과 일치하는 요소들이 여러 개 있다면 어떤 것의 위치가 반환될 지 알 수 없다.

(3) toString( )은 일차원 배열에만 사용할 수 있다. 다차원 배열에는 deepToString( )을 사용해야 한다.

(4) equals( )도 일차원 배열에만 사용 가능하다. 다차원 배열에는 deepEquals( )를 사용.

(5) asList( )가 반환한 List는 저장된 내용의 변경은 가능하지만 크기를 변경할 수 없다. 크기를 변경할 수 있는 List는 ArrayList 또는 LinkedList로 생성하여 사용해야 한다.

7. Comparator, Comparable

(1) Comparable은 기본 정렬기준을 구현하는데 사용되고, Comparator는 기본 정렬기준 외에 다른 기준으로 정렬하고자할 때 사용된다.

(2) Comparable을 구현한 클래스들은 기본적으로 오름차순으로 정렬이 이루어진다.

(3) Arrays.sort( )는 Comparator를 지정해주지 않으면 저장하는 객체에 구현된 내용에 따라 정렬된다.

(4) String의 Comparable구현은 문자열이 사전 순으로 정렬되도록 작성되어 있다.

8. HashSet

(1) HashSet은 Set 인터페이스를 구현한 가장 대표적인 컬렉션이다.

(2) HashSet은 저장순서를 유지하지 않는다. 저장순서를 유지하고자 한다면 LinkedHashSet을 사용해야한다.

(3) HashSet은 equals( )와 hashCode( )를 호출하여 중복을 제거하기 때문에 클래스 원소를 삽입하고자 한다면 두 함수를 오버라이딩 해야한다.(hashCode함수는 Objects클래스의 hash함수를 이용해서 오버라이딩하는 것도 좋다.)

(4) hashCode( )는 여러 번 호출해도 동일한 int값을 반환해야 하며 equals메서드로 true를 얻은 두 객체에 대해 hashCode( )를 호출해서 얻은 결과는 반드시 같아야 한다.