JAVA의 정석 | Chapter 11 컬렉션 framework

Yunny.Log ·2022년 7월 1일
0

JAVA

목록 보기
20/29
post-thumbnail
post-custom-banner

Chapter 11 컬렉션 framework

핵심 인터페이스

  • List , Set , Map

Collection의 핵심 공통 메소드

List (순서 O , 중복 O)

- Vector은 Deprecated, ArrayList랑 LinkedList 만 알면 된다.

Set (순서 X , 중복 X)

  • 컬렉션 메소드와 동일 (당연, 상속받은 것이니)
  • 집합 관련 메소드 - 차집합 합집합 부분집합 등

Map(순서X,중복(키X,값O))

)

LIST(1)- Arraylist

  • 벡터는 동기화 처리, ArrayList는 동기화 처리 X (동기화 여부의 차이)
  • 데이터의 저장공간으로 배열을 사용
  • 리스트 인터페이스를 구현한 것이다.

(+) 다형성 : 조상타입의 참조변수로 자식을 다룰 수 있는 것

List<컬렉션> listName = new ArrayList();
  • 저장 순서 유지, 중복 허용

  • remove 주의


list1.remove(1) // 인덱스가 1인 객체를 삭제
list1.remove(new Integer(1)); //1을 삭제 
  • Arraylist에 저장된 객체 삭제할 때는 배열의 복사 일어나면서 앞에 있는 것 삭제 시, 뒤에 있던 게 앞으로 땡겨지고 (복사되고) 남은 자리는 null로 채워지게 됨
  • 반면 마지막 객체부터 지우다보면 따로 배열의 복사가 발생하지 않겠지~

LIST(2)- Linkedlist

  • 배열의 장점

    • 구조가 간단, 읽는데 걸리는 시간 short
  • 연속적인 성격

  • 배열의 단점

    • 크기 변경 불가능, 변경해야 하면 새 배열 생성 후 데이터 복사해야해
      (크기 변경 피하기 위해 충분히 큰 배열 생성 시 메모리 낭비)
  • 비 순차적 데이터 추가, 삭제에 투머치 타임

  • 링크드 리스트는 불연속적 데이터 연결
    (1) 데이터 삭제
    - 서로 관계 맺고 있음
    (2) 데이터 추가

DOUBLY 링크드 리스트

BUT 접근성이 나쁘다, 불연속적 배열처럼 한번에 이동 불가능, 한번에 갈 수 없음
=> 이를 보완해서 나온 것이 더블리 링크드 리스트

  • 앞뒤로 가기 가능, 그러나 접근성은 여전히 BAD 긴 함

CIRCULAR LINKED LIST-맨 뒤로 가면 맨 앞으로 돌아오게 됨

ArrayList vs Linkedlist

1) 순차적 데이터 추가, 삭제 => ArrayList 빠름
2) 비순차적 데이터 추가, 삭제 => LinekdList가 빠름
3) 접근 시간 - ArrayList 빠름
4) 변경은 Linkedlist가 빠름

STACK & QUEUE

STACK : LIFO - 마지막 저장을 젤 먼저 꺼냄

  • (넣는 것)push, (뽑는 것) pop
  • 순차적 진행이라서 ArrayList로 구현하는 것이 good

QUEUE : FIFO

  • (넣는 것) offer, (뽑는 것) poll , (삭제 없이 요소 읽어오는 것) peek
  • Linkedlist 가 적합
  • Queue는 인터페이스라서 (추상클래스는 인스턴스 생성 불가! 구현체로 구현 마무리한 후에야 인스턴스 생성 가능 ), new 로 인스턴스 생성이 불가!!
    => 따라서 인터페이스 구현한 클래스 찾아야 함

deque

Enumeration, Iterator, ListIterator

  • 컬렉션에 저장된 데이터 접근에 사용되는 인터페이스
  • Enumeration은 Iterator의 구버젼
  • hasNext : 있는지 확인
  • next : 다음 요소 읽어오기, hasNext로 확인하고 읽어와야 함
  • 컬렉션에 Iterator iter = 컬렉션.iterator() 을 통해 iterator 구현한 객체 얻어서 사용해야 함

Collection의 자손인 List, Set에만 iterator 존재

Map에는 iterator 없음

  • Map에서 iterator 사용하려면 keySet(), entrySet(), values() 호출하기

Comparator와 Comparable

  • 정렬에 필요한 메서드, 정렬 기준을 제공

둘다 정렬에 사용되는 것

  • Comparable : 기본 정렬 기준
  • Comparator : 기본 정렬 기준 외에 다른 기준으로 정렬하고자 할 때 사용

Comparable(compareTo) : 주어진 객체(o)를 자신(this)와 비교

public interface Comaprable{
	int compareTo(Object o)
}

Comparator(compare)

public interface Comparator{
	int compare(Object o1, Object o2); // o1, o2 두개를 비교
    boolean equals(Object obj); // equals 오버라이딩 해라
 }

sort를 사용할 때의 Comparable과 Comparator


static void sort(Object[ ] a)
// 객체 배열에 저장된 a가 구현한 Comparable(정렬기준)에 의한 정렬

static void sort(Object[ ] a, Comparator c) // c 가 정렬 기준을 주는 것
// 지정한 Comparator에 의한 정렬

example

1)

  • int 배열을 그냥 sort 하면 오름차순으로 정렬된다
Arrays.sort(배열)

=> 이유는 int가 상속받고 있는 Number그 자체에서 Comparable을 상속받고 CompareTo를 오버라이딩 할 때 오름차순으로 정렬되게 정의해놔서이기 때문

(+)

compareTo의 정렬 기준

compareTo의 리턴 결과가 양수

-> compareTo 메서드를 부르는 객체가 더 크고, 파라미터로 들어온 o 객체가 더 작다고 판별된다.
-> 주체객체와 대상객체가 교체하여 정렬된다.

compareTo의 리턴 결과가 0

-> 두 객체의 값이 동일하다고 판별된다.
-> 정렬을 유지한다.

compareTo의 리턴 결과가 음수

-> compareTo 메서드를 부르는 객체가 더 작고, 파라미터로 들어온 o 객체가 더 크다고 판별된다.
-> 정렬을 유지한다.
(출처: https://yuja-kong.tistory.com/entry/Java-객체-정렬-Comparable-Comparator)

2)

Arrays.sort(배열, 정렬기준(Comparator구현체))

=> 반면 아래 애는 Comparator을 구현한 새로운 정렬기준 넣어줬는데, 이 구현체에서는 비교를 내림차순으로 하게 해놔서 내림차순으로 정렬이 되게 함

HASHSET : 중복 X, 순서 X

  • boolean add(Object o)는 저장할 객체의 equals()와 hashCode()를 호출
  • equals()와 hashCode()가 오버라이딩 되어 있어야 함

교집합

setA.retainAll(setB)

차집합

setA.removeAll(setB)

합집합

setA.addAll(setB)
post-custom-banner

0개의 댓글