[JAVA] 컬렉션

msung99·2022년 5월 30일
1
post-thumbnail

배열의 한계점

  • 초기에 설정한 크기가 고정된 상태. 꽉차면 새로운 배열 만들고 카피한후 원소 할당해야함

컬렉션

종류

  • List, Set, Map : 인터페이스
  • 각 인터페이스를 구현한 구현 클래스
    • List => ArrayList, Vector, LinkedList
    • Set => HashSet, TreeSet
    • Map => HashMap, HashTable, TreeMap, Properties
  • 각 인터페이스 변수에 구현 클래스 객체를 할당, 즉 업캐스팅한다.
    ex) List< String > list1 = new ArrayList< String >( );


1.List

특징

  • 인덱스로 관리
  • 중복해서 객체 저장 가능

구현클래스

  • ArrayList, Vector, LinkedList

메소드

  1. add(element) : 주어진 객체를 맨끝에 추가
    add(idx, element) : 주어진 인덱스에 객체를 추가

  2. set(idx, element) : 주어진 인덱스에 저장된 객체를 바꿈

  3. contains(obj) : 주어진 객체가 저장되있는지 여부

  4. get(idx) : 이 위치에 있는 객체를 리턴

  5. isEmpty()

  6. size()

  7. clear() : 저장된 모든 객체를 삭제

  8. remove(idx) : 주어진 인덱스의 객체 삭제
    remove(obj) : 주어진 객체를 삭제


ArrayList

  • 저장용량 초과시 자동으로 공간 늘어남

예시

  • for-each 문을 사용해서도 List 의 모든 원소를 순회가능

Vector

  • ArrayList 와 동일하게 저장용량 초과시 자동으로 공간 늘어남
    (차이점이 있긴한데 스레드 개념이라 그냥 무시해도 될듯!)

보듯이 ArrayList 랑 사용방식 동일. 기능도 거의 동일함!


LinkedList

  • ArrayList 랑 하는 기능은 동일한데, 내부에서 자료들을 연결한 방식만 다르다!
    ( ArrayList, Vector 는 연속된 공간에 배열로써 저장하지만,
    링크드리스트는 무작위 메모리공간에 저장된 자료들을 저장)


2.Set

  • 저장 순서 유지x
  • 객체를 중복해서 저장 불가능. 새롭게 원소로 추가한 객체가 기존에 Set 에 저장된 녀석중 하나랑 동일하면 저장안함.

메소드

  1. add(obj) : 객체를 저장. (성공적으로 저장되면 true 리턴)
  2. contains(obj) : 객체가 저장되있는지 여부 판단
  3. isEmpty()
  4. iterator() : 이터레이터 리턴
    • 이터레이터란? : Set 안에 있는 모든 원소객체에 대해 반복할 수 있도록 해주는 녀석
    • Set 은 인덱스를 이용해서 객체를 가져올 수있는 메소드가 없어서 이터레이터가 필요!
  5. size()
  6. clear() : 저장된 모든 객체 삭제
  7. remove(obj) : 주어진 객체 삭제

HashSet

형태 : Set< E > set = new HashSet< E > ();

  • 동일한 객체를 중복 저장하지 않음

cf) 동일한 객체를 판단하는 방법 (이전에 배운 내용임!!)

  • 1) hashCode() 리턴값이 같은지 확인
  • 2) equals() 리턴값이 같은지 확인

예제1

  • set의 iterator() 메소드를 호출하면 iterator 객체를 리턴해줌
Iterator<String> iterator = set.iterator(); 
// 이터페이터 객체의 타입은 Iterator<String> 이다. (안에 String 값이 들어 있으므로)
  • 이터레이터는 StringTokenizer 객체와 유사.
    StringTokenizer 처럼
  • next() 로 문자열 원소 하나 추출해내고
  • hashNext() 로 빈 객체인지 아닌지를 판단한다.
// set 의 모든 원소에 대해 반복
while iterator.hasNext()){     // 이터레이터 가리키는 객체가 빈 객체인지 판단
  String element = itetator.next();  // 이터레이터가 다음 객체를 가리키게 함
  Sysout("\t" + element);
}
  • 이터레이터 말고도 for-each 문으로도 set의 모든 원소에 대해 반복가능

예제2

  • 이 예제는 두 객체가 동일한지 판단여부를 보여주는 예시이다.
  • 두 객체 안에 들어있는 값 이름, 나이가 동일하면 같다고 판단!
  • 이 기능을 위해 hashCode() 와 equals() 를 오버라이딩 한다.

cf) hashCode() 는 문자열 구성이 다르면 해시코드 결과값이 다르게 나온다.

  • 결론적으로 두 객체는 같아서, 둘 중 하나의 객체만 set 안에 들어간다.


3. MAP

  • (key, value) 쌍을 가지는 Map.Entry 객체를 저장
  • 키는 중복될 수 없지만, 값은 중복 저장 가능
  • key, value 는 모두 객체

메소드

  1. put(key, value) : 엔트리 추가

  2. containsKey(key) : 주어진 key 객체 가 있는지 여부

  3. containsValue(value) : 주어진 value 객체가 있는지 여부

  4. entrySet() : 해당 Map 에 담긴 모든 Map.Entry 객체를 Set 에 담아서 리턴

    • Set 타입으로 리턴받게 되면, Set 자료구조 안에 있는 메소드들을 사용가능해짐
      • ex) iterator() 사용가능 => Map 구현 안되있음. Set에만 구현된것
  5. keySet() : 모든 키를 Set 객체에 담아서 리턴

  6. get(key) : 주어진 key 에 대한 value 객체를 리턴

  7. isEmpty()

  8. keySet() : 모든 키를 Set 객체에 담아서 리턴

  9. values() :

  10. clear() :

  11. remove(key) : 주어진 key 를 가지는 Map.Entry 를 삭제


HashMap

형태 : Map< K, V > map = new HashMap< K , V >


예제

  • Map 에 저장된 엔트리를 하나씩 순회하면서 출력하는 방법
// 방법1) key로만 구성된 Set 을 keySet() 으로 얻어내고 iterator 활용하기
Set<String> keySet = map.keySet();  // keySet() 을 호출해서 key 들로만 구성된 Set 를 생성
Iterator<String> keyIterator = keySet.iterator();  // Set 타입으로 변환했으므로 iterator 활용가능

// 이터레이터를 활용해 반복을 돌리면서 출력
while(keyIterator.hasNext()){
  String key = keyIterator.next();
  Integer value = map.get(key);  // 주어진 key 에 해당하는 value 를 얻어옴 
  System.out.println("\t" + key + ":" + value);
}



// 방법2) for-each 문 활용하기 
for(String key : map.keySet()) {
  System.out.println(key + ":" + map.get(key));
}



// 방법3) entrySet() 으로 Set 을 얻어오기
Set<Map.Entry<String, Integer>> entrySet = map.entrySet();  // 데이터 타입이 Set은 Set인데, 안에 들어가는 데이터 타입이 Map.Entry 타입이고, Map.Entry 라는 녀석은 String 과 Integer 세트로 구성됨

Iterator<Map.Entry<String, Integer>> entryIterator = entrySet.iterator();   

while(entryIterator.hasNext()){
  Map.Entry<String, Integer> entry = entryIterator.next();  // 이터레이터가 리턴시켜주는 next() 라는 녀석은 (key, value) Set 객체이다.
  String key = entry.getKey();
  Integer value = entry.getValue();
  Integer value = entry.getValue();
  System.out.println("\t" + key + ":" + value);
}

HashTable

형태 : Map< K, V > map = new HashTable < K, V > ();

  • HashMap 과 기능 완전 동일
    (몰론 미세한 차이있긴한데 몰라도됌!)

TreeSet, TreeMap

  • 내부적으로 이진트리 구조로 구현
  • 정렬 기능 Good!

메소드

  1. first() : 최솟값
  2. last() : 최댓값
  3. lower(obj) : 지정된 객체안의 값보다 바로 큰 값을 가지는 객체의 값 리턴
  4. higher(obj) : 지정된 객체안의 값보다 바로 작은 값을 가지는 객체의 값 리턴
  5. floor(obj) : 지정된 객체안의 값과 같거나 바로 작은 값을 가지는 개체의 값 리턴
  6. celling(obj) : 지정된 객체안의 값과 같거나 바로 큰 값을 가지는 개체의 값 리턴
  7. TreeSet.pollFirst() : 최솟값 가진 객체 하나 트리에서 제거


예제 - 정렬 기능

TreeSet 의 descendingSet() 을 호출하면 NavigableSet 이라는 데이터 타입이 리턴됨

=> NavigableSet 이란? : 내림차순 정렬된 Set 데이터타입

// TreeSet인 scores 가 내림차순 정렬된 결과가 변수에 저장
NavigableSet<Integer> descendingSet = scores.descendingSet();

for(Integer score : descendingSet){   // 내림차순 출력
  System.out.println(score + " ");
}

// 오름차순 결과가 저장 
NavigableSet<Integer> ascendingSet = descendingSet.descendingSet();

for(Integer score : ascendingSet){
  System.out.println(score + " ");
}


Comparable 과 Comparator

  • TreeSet 과 TreeMap 의 자동정렬
profile
블로그 이전 : https://haon.blog

0개의 댓글