Chapter 11 1.6~1.14

Seunghee Ryu·2023년 10월 23일
0

자바의 정석

목록 보기
2/11

Arrays

  • 복사 : copyOf(), copyOfRange()
  • 채우기 : fill(), setAll()
  • 정렬과 검색 : sort(), binarySearch()
    - binarySearch()는 반드시 배열이 정렬된 상태여야 올바른 결과를 얻음
    - 순차 검색(linear search)은 배열이 정렬되어 있을 필요는 없지만 하나씩 비교하기 때문에 시간이 많이 걸림
    - 이진 검색(binary search)은 범위를 반복적으로 절반씩 줄여나가면서 검색하기 때문에 시간이 적게 걸림
    - 이진 검색은 큰 배열의 검색에 유리하다
  • 비교와 출력 : equals(), toString()
    - equals()는 일차원 배열에만 사용 가능
    - 다차원 배열에는 deepEquals()를 사용
    - 다차원 배열은 배열의 배열의 형태로 구성되어 있어서 배열에 저장된 배열의 주소값을 비교하게 되기 때문에 equals()를 쓰면 결과값이 false가 된다
  • 배열을 리스트로 : asList(Object... a)
    - asList()가 반환한 List의 크기를 변경할 수 없다
    - 크기를 변경할 수 있는 List가 필요하다면 ArrayList를 생성
  • 그 외 : parallelXXX(), spliterator(), stream()

Comparator와 Comparable

  • Arrays.sort()는 Character 클래스의 Comparable의 구현에 의해 정렬
    - 같은 타입의 인스턴스끼리 서로 비교할 수 있는 클래스를 오름차순으로 정렬되도록 구현되어 있음
  • comparable : 기본 정렬기준을 구현하는데 사용
  • comparator : 기본 정렬기준 외에 다른 기준으로 정렬하고자 할 때 사용
  • compare()의 매개변수가 Object이기 때문에 compareTo()를 바로 호출할 수 없으므로 먼저 Comparable로 형변환을 해야한다

HashSet

  • set 인터페이스를 구현한 가장 대표적인 컬렉션
  • 중복된 데이터를 저장하지 않는다
  • 저장순서 유지하지 않는다
    - 저장순서를 유지하고 싶다면 LinkedHashSet을 사용해야 한다
  • HashSet의 add메서드는 새로운 요소를 추가하기 전에 기존에 저장된 요소와 같은 것인지 판별하기 위해 추가하려는 요소의 equals()와 hashCode()를 호출하기 때문에 equals()와 hashCode()를 목적에 맞게 오버라이딩 해야한다

TreeSet

  • 이진 검색 트리라는 자료구조의 형태로 데이터를 저장하는 컬렉션 클래스
  • 정렬, 검색, 범위 검색에 높은 성능을 보임
  • 이진 검색 트리의 성능을 향상시킨 레드-블랙 트리로 구현되어 있음
  • 중복된 데이터의 저장을 허용하지 않으며 정렬된 위치에 저장하므로 저장 순서를 유지하지도 않는다
  • 링크드리스트처럼 여러 개의 노드가 서로 연결된 구조
    - 루트라고 불리는 하나의 노드에서부터 시작해서 계속 확장해 나갈 수 있다
  • 모든 노드는 최대 두 개의 자식 노드를 가질 수 있다
  • 왼쪽 자식 노드의 값은 부모 노드의 값보다 작고 오른쪽 자식 노드의 값은 부모 노드의 값보다 커야한다
  • 노드의 추가 삭제에 시간이 걸린다(순차적으로 저장하지 않아서)

HashMap과 Hashtable

  • Hashtable보다 HashMap을 사용하는 것을 권장
  • key와 value가 하나의 쌍이기 때문에 각각의 배열로 다루기보다 하나의 클래스로 정의하여 다루는게 데이터의 무결성적인 측면에서 더 바람직하다
    - key : 컬렉션 내의 key 중에서 유일해야 한다
    - value : 데이터 중복 허용

해싱과 해시함수

  • 해싱 : 해시 함수를 이용해서 데이터를 해시테이블에 저장하고 검색하는 기법
  • 해싱을 구현한 컬렉션 클래스 : HashSet, HashMap, Hashtable 등
  • 배열과 링크드리스트의 조합
    - 배열에 링크드리스트가 담겨있음
  • 배열의 크기가 크고 각 인덱스에 하나씩만 데이터가 담겨있는 경우가 빠름

TreeMap

  • 이진검색트리의 형태로 키와 값의 쌍으로 이루어진 데이터 저장
  • 검색에 관한한 대부분의 경우에서 HashMap이 TreeMap보다 더 뛰어나다
  • 다만 범위 검색이나 정렬이 필요한 경우에는 TreeMap을 사용

properties

  • Hashtable을 상속받아 구현한 것
  • 애플리케이션의 환경설정과 관련된 속성을 저장하는데 사용
  • 데이터를 파일로부터 읽고 쓰는 기능 제공

Collections

컬렉션의 동기화

  • 멀티 스레드 프로그래밍에서는 하나의 객체를 여러 스레드가 동시에 접근할 수 있기 때문에 데이터의 일관성을 유지하기 위해서는 공유되는 객체에 동기화가 필요하다
  • ArrayList와 HashMap과 같은 컬렉션은 동기화를 자체적으로 처리하지 않고 필요한 경우에만 java.util.Collections클래스의 동기화 메서드를 이용해서 동기화처리가 가능하도록 변경

변경불가 컬렉션 만들기

  • 컬렉션을 변경할 수 없게, 즉 읽기 전용으로 만들어야 할 때가 있다
  • 멀티 스레드 프로그래밍에서 여러 스레드가 하나의 컬렉션을 공유하다보면 데이터가 손상될 수 있는데 이를 방지하기 위해 사용된다

싱글톤 컬렉션 만들기

  • 단 하나의 객체만을 저장하는 컬렉션을 만들고 싶을 때 사용한다

한 종류의 객체만 저장하는 컬렉션 만들기

  • 대부분의 경우 한 종류의 객체를 저장하며 컬렉션에 지정된 종류의 객체만 저장할 수 있도록 제한하고 싶을때 사용한다
  • 저장할 요소의 타입을 제한하는 것은 지네릭스로 처리 가능하다

0개의 댓글