반응형
1. Arrays
- Arrays 클래스에는 배열을 다루는데 유용한 클래스가 정의되어 있다.
- 클래스 내부의 모든 메소드는 static 메소드이다.
- 배열의 복사 - copyOf(), copyOfRange()
- copyOf()는 배열 전체를, copyOfRange()는 배열의 일부를 복사해서 배열을 만들어낸다.
- copyOfRange()에 지정된 범위의 끝은 포함되지 않는다.
- 문자열의 비교와 출력 - equals(), toString()
- toString()은 일차원 배열에서만 사용할 수 있으며, 다차원배열에서는 deepToString()을 사용해야 한다.
- equals()도 마찬가지로 일차원배열에서만 사용 가능하므로, 다차원 배열의 비교에는 deepEquals()를 사용해야 한다.
- 배열 채우기 - fill(), setAll()
- fill()은 배열의 모든 요소를 지정된 값으로 채운다.
- setAll()은 배열을 채우는 데 사용할 함수형 인터페이스 매개변수로 받는다.
- 배열의 정렬과 탐색 - sort(), binarySearch()
- sort()는 배열을 정렬할 때, 그리고 배열에 저장된 요소를 검색할 때는 binarySearch()를 사용한다.
- binarySearch()는 배열이 정렬된 상태이어야 올바른 결과를 찾는다.
- 배열을 List로 변환 - asList(Object... a)
- asList()는 배열을 List에 담아서 반환한다.-
- asList()가 반환한 List의 크기는 변경할 수 없으나 저장된 내용의 변경은 가능하다.
- 만약 크기를 변경할 수 있는 List가 필요하다면 new ArrayList(Collection c); 생성자를 이용해 새로 만들어야 한다.
2. Comparable, Comparator
- Arrays.sort()를 호출을 하면 컴퓨터가 알아서 배열을 정렬하는 것처럼 보이지만 그게 아닌 사실 Comparable 인터페이스에 구현에 의해 정렬이 된 것이다.
- Comparator와 Comparable은 모두 인터페이스로 컬렉션을 정렬하는데 필요한 메소드를 정의하고 있으며, Comparable을 구현하고 있는 클래스들은 주로 Integer와 같은 Wrapper 클래스, String과 같은 것들이며 기본적으로 오름차순으로 정렬하도록 하고 있다.
=> Comparable을 구현한 클래스는 정렬이 가능하다는 것을 의미한다. - compare()와 compareTo()는 선언 형태와 이름이 약간 다른 뿐 두 객체를 비교한다는 같은 기능을 목적으로 고안된 것이다.
- compareTo()의 반환 값은 int이지만 실제로는 비교하는 두 객체가 같으면 0, 비교하는 값보다 작으면 음수, 크면 양수를 반환하도록 구현해야 한다.
- 마찬가지로 compare()도 객체를 비교해서 음수, 0, 양수 중의 하나를 반환하도록 구현해야 한다.
- Comparable을 구현한 클래스들이 기본적으로 오름차순으로 정렬되어 있지만, 내림차순으로 정렬한다던가 아니면 다른 기준에 의해서 정렬되도록 하고 싶을 때 Comparator를 구현해서 정렬 기준을 제공할 수 있다.
Comparable 기본 정렬을 구현하는 데 사용 Comparator 기본 정렬 기준 외의 다른 기준으로 정렬하고자 할 때 사용
3. HashSet
- HashSet은 Set인터페이스를 구현한 가장 대표적인 컬렉션이며, Set인터페이스의 특징대로 HashSet은 중복된 요소를 저장하지 않는다.
- HashSet에 새로운 요소를 추가할 때는 add 메소드나 addAll 메소드를 사용하는데, 만일 HashSet에 이미 저장되어 있는 요소와 중복된 요소를 추가하고자 한다면 이 메소드들은 false를 반환함으로써 중복된 요소이기 때문에 추가에 실패했다는 것을 알린다.
- 이러한 HashSet의 특징을 이용하면, 컬렉션 내의 중복 요소들을 쉽게 제거할 수 있다.
- Set에서는 객체의 값이 equals만 같다고 같은 것이 아니라 hashcode도 같아야 같다고 인식한다.
4. TreeSet
- TreeSet은 이진검색트리( binary search tree )라는 자료구조의 형태로 데이터를 저장하는 컬렉션 클래스이다.
- 그리고 Set인터페이스를 구현했으므로 중복된 데이터의 저장을 허용하지 않으며 정렬된 위치에 저장하므로 저장 순서를 유지하지도 않는다.
- 이진트리는 LinkedList처럼 여러 개의 노드가 서로 연결된 구조로, 각 노드 최대 2개의 노드를 연결할 수 있으며, 루트( root )라고 불리는 하나의 노드에서부터 시작해서 계속 확장해 나갈 수 있다.
- 이진검색트리는 부모 노드의 왼쪽에는 부모노드의 값보다 작은 값의 자식 노드를, 오른쪽에선 큰 값의 자식노드를 저장하는 이진트리이다.
- TreeSet에 저장되는 객체가 Comparable을 구현하거나 Comparator를 제공해서 두 객체의 비교할 방법을 알려줘야 한다.
==> 기본적인 것은 상관없지만 우리가 정의한 클래스는 비교하기 위해 정의해줘야 한다.( 작고 큰 것을 알기 위해 - 이진검색트리 )
==> 그렇지 않으면 TreeSet에 객체를 저장할 때 예외가 발생한다. - 저장된 값의 개수가 비례해서 검색시간이 증가하긴 하지만 값의 개수가 10배 증가해도 특정 값을 찾는데 필요한 비교 횟수가 3~4번만 증가할 정도로 검색효율이 뛰어난 자료구조이다.
- 트리는 데이터를 순차적으로 저장하는 것이 아니라 저장 위치를 찾아서 저장해야 하고, 삭제해야 하는 경우 트리의 이부를 재구성해야 하므로 LinkedList보다 데이터의 추가/삭제 시간은 더 걸리지만 배열이나 LinkedList에 비해 검색과 정렬 기능이 뛰어나다.
- 이진검색트리( binary search tree )
- 모든 노드는 최대 2개의 자식 노드를 가질 수 있다.
- 왼쪽 자식 노드의 값은 부모 노드의 값보다 작고 오른쪽 자식노드의 값은 부모노드의 값보다 커야 한다.
- 노드의 추가/삭제에 시간이 걸린다.
- 검색( 범위 검색 )과 정렬에 유리하다.
- 중복된 값을 저장하지 못한다.
5. HashMap, HashTable
- HashTable과 HashMap의 관계는 Vector와 ArrayList의 관계와 같아서 보다 새로운 버전인 HashMap을 사용하는 것을 권한다.
- HashMap은 Map을 구현했으므로 키( key )와 값( value )을 묶어서 하나의 데이터( entry )로 저장한다는 특징을 가진다.
- HashMap은 키와 값은 Object타입으로 저장한다.
- 즉, ( Object, Object ) 형식으로 저장하기 때문에 어떠한 객체도 저장할 수 있지만 주로 키값은 String 대문자 또는 소문자로 통일해서 사용하곤 한다.
키( key ) 컬렉션 내의 키( key ) 중에서 유일해야 한다. 값( value ) 키( key )와 달리 데이터의 중복을 허용한다. - 키는 저장된 값을 찾는 데 사용되는 것이기 때문에 컬렉션 내에서 유일해야 한다.
- 즉, HashMap에 저장된 데이터를 하나의 키로 검색했을 때 결과가 단 하나여야 함을 뜻한다.
- 만일 하나의 키에 대해 여러 검색 결과 값을 얻는다면 원하는 값이 어떤 것인지 알 수 없기 때문이다.
- .keySet() : Key들만 모여있는 Set을 리턴
- .values() : Value들만 모여있는 Collection을 리턴
- .entrySet() : Key,Value가 하나로 모여있는 Entry들만 모여있는 Set을 리턴
- 빠른 for문(향상된 for문, forEach문)
for(자료형 변수명 : 반복자) {
}
- 단순하게 모든 요소들을 순회할 때 사용하는 것이 좋다.
- 순서가 중요한 경우(몇번째에 어떤 값이 있는지 알 필요가 있는 경우)에는 기존의 for문을 이용한다.
반응형
'웹개발 > JAVA' 카테고리의 다른 글
[JAVA] 쓰레드( Thread ) (0) | 2022.02.11 |
---|---|
[JAVA] 제네릭스( generics ) (0) | 2022.02.07 |
[JAVA] 컬렉션 프레임워크( Collection Framework ) - ArrayList, LinkedList, Stack & Queue, Iterator (0) | 2022.02.03 |
[JAVA] Object, String, Math, Wrapper 클래스 (0) | 2022.01.29 |
[JAVA] 예외처리( exception handing ) (0) | 2022.01.28 |