컬렉션 (Collection)

귀찮Lee·2022년 5월 18일
0

Java

목록 보기
6/15

※ 세세한 사항들은 자료구조 정리할 때 할 예정

◎ 컬렉션 프레임워크

  • 주요 인터페이스 : List, Set, Map
  • Collection의 메소드는 List, Set 에서 모두 사용할 수 있음
  • Map의 메소드는 하위 클래스에서 모두 사용할 수 있음

◎ List

  • List< E >

    • 객체를 일렬로 늘어놓은 구조
    • 객체 저장시 자동으로 인덱스가 부여되고, 인덱스로 객체를 검색, 삭제할 수 있는 기능 제공
  • ArrayList

    • ArrayList는 List 인터페이스를 구현한 클래스로, 컬렉션 프레임워크에서 가장 빈번하게 사용
    • 배열과 달리, ArrayList는 저장 용량을 초과한 객체들이 들어오면, 자동으로 저장용량이 늘어남
    • 리스트 계열 자료구조의 특성을 이어받아 데이터가 연속적으로 존재
    • 사용 가능한 메서드
    List<타입 파라미터> 객체명 = new ArrayList<타입 파라미터>(초기 저장용량);
    List<Integer> box1 = new ArrayList<Integer>(30);
    List<Integer> box2 = new ArrayList<Integer>(); // 초기 저장용량 미선언시, 10으로 설정
    List<Integer> box3 = new ArrayList(); // 다음과 같이 생략가능
    List<String> list = new ArrayList<String>();
    list.add("element1") // 리스트에 (맨 뒤에) 항목 추가
    list.add(0, "element0") // 특정 인덱스에 항목 추가
    
    int size = list.size(); // 저장된 총 객체 수 얻기
    String firstElement = list.get(0); // 0번 인덱스의 객체 얻기
    list.remove(0); // 0번 인덱스 객체 삭제
  • LinkedList

    • 데이터를 효율적으로 추가, 삭제, 변경하기 위해 사용
    • LinkedList에는 불연속적으로 존재하며, 이 데이터는 서로 연결되어 있음
    • LinkedList의 각 요소(node)들은 자신과 연결된 요소의 주소값(이전 값, 이후 값)과 데이터로 구성
    • 사용 가능한 메서드
  • List 비교

    ArrayListLinkedList
    객체 추가시자동으로 인덱스를 부여객체 자신, 자신과 연결된 요소의 주솟값 저장
    연속성데이터가 연속적으로 존재데이터가 불연속적으로 존재, 서로 연결되어 있음
    변경시,저장된 다른 데이터들을 복사해서 이동앞뒤 요소의 연결된 주솟값, 객체 추가-제거만 변경
    탐색시,인덱스를 이용해서 탐색함첫 요소부터 다음 주솟값으로 찾아다니면서 탐색함
    장점탐색에 용이 (일반적인 List에 사용)변경에 용이 (자주 변경되는 List에 사용)

◎ Set

  • Set< E >

    • 요소의 중복을 허용하지 않고, 저장 순서를 유지하지 않는다.
  • HashSet

    • 가장 일반적인 Set
    • 중복 체크 :
      객체를 저장하기 전에 먼저 객체의 hashCode() 메소드를 호출해서 해시 코드를 얻어낸 다음 저장되어 있는 객체들의 해시 코드와 비교한 뒤 같은 해시 코드가 있다면 다시 equals() 메소드로 두 객체를 비교해서 true가 나오면 동일한 객체로 판단하고 중복 저장을 하지 않는다.
    • 사용 가능한 메서드
    public class SetTest {
      public static void main(String[] args) {
          HashSet<String> languages = new HashSet<String>();
    
          languages.add("Java");
          languages.add("Python");
          languages.add("Javascript");
          languages.add("Java");
    		
          Iterator it = languages.iterator();
    
          while(it.hasNext()) {
              System.out.println(it.next()); // 3개만 출력됨 (중복 허용 X)
          }
       }
    }
  • TreeSet

    • 데이터의 중복 저장을 허용하지 않고 저장 순서를 유지하지 않음 (기본적인 Set 특징)
    • 이진 탐색 트리 형태로 데이터를 저장
    • 기본 정렬이 오름차순임
    • 사용 가능한 메서드

◎ Map

  • Map< K, V >
    • 어떤 두 데이터를 연결한다는(매핑) 의미
    • 키(key)와 값(value)으로 구성된 Entry 객체를 저장하는 구조
    • 키는 중복 저장될 수 없지만, 값은 중복 저장이 가능
      -> 동일한 키로 저장시, 기존 값은 없어지고 새로운 값으로 대치됨
    • HashMap, Hashtable, TreeMap, SortedMap 등이 있음
  • HashMap
    • 가장 일반적인 Map
    • 해시 함수를 통해 '키'와 '값'이 저장되는 위치를 결정
    • 사용자는 그 위치를 알 수 없고, 삽입되는 순서와 위치 또한 관계가 없음
    • HashMap은 해싱(Hashing)을 사용하기 때문에 많은 양의 데이터를 검색하는 데 있어서 뛰어난 성능을 보입니다.

◎ Iterator

  • Java에서 Iterator보다는 enhanced for문을 이용하는 것을 권장 (편의성)

  • Iterator

    • 컬렉션에 저장된 요소를 읽어오는 표준적인 방법
    • Iterator 인터페이스를 구현한 클래스의 인스턴스를 반환하는 iterator() 메서드를 정의하여 각 요소에 접근
    • Collection 인터페이스를 상속받는 List와 Set에서도 iterator() 메서드를 사용할 수 있다.
  • Iterator 사용목적

    • for - each 문을 이용해 자료를 불러오는 것이 가능, 하지만 반복문 중에 수정, 삭제시 ConcurrentModificationException 이 발생함
    • Iterator 사용시, 반복문이 작동하는 와중에도 수정, 삭제할 수 있다.
    • 참고 : https://onlyfor-me-blog.tistory.com/319
  • Iterator의 기능 및 특징

    1. 컬렉션에서 요소를 제어하는 기능
    2. next() 및 previous()를 써서 앞뒤로 이동하는 기능
    3. hasNext()를 써서 더 많은 요소가 있는지 확인하는 기능
    • 특징 : Arraylist 에서는 성능이 떨어지나, LinkedList에서는 더 좋음, Set 에서도 사용 가능함
  • Iterator Interface Method

    메서드설명
    hasNext()가져올 객체가 있으면 true를 리턴하고, 없으면 false를 리턴한다
    next()컬렉션에서 하나의 객체를 가져온다
    remove()컬렉션에서 객체를 제거한다
  • 예시

// List<String> list;
  
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){ 
	String str = iterator.next(); // 객체를 순서대로 가져옴
	if(str.equals("str")){
		iterator.remove(); //가져온 객체 제거
	}
}

◎ Comparator와 Comparable

  • 컬렉션을 정렬하기 위해 자바에서 제공하는 인터페이스
  • Comparable : 비교 대상과 자기 자신을 비교
    • 객체 추가시, 자동적으로 정렬하는 것에 용이
    • compareTo라는 method를 구현하여 정렬 규칙을 세움
      • 비교하는 두 객체가 같으면 0, 비교할 객체가 주어진 객체보다 작으면 음수, 크면 양수를 반환
  • Comparator : 매개 변수인 두 객체를 비교
    • 완성 되어있는 Collection을 정렬하는데 용이
    • 기본 정렬 기준이 아닌 다른 기준으로 정렬하고 싶을 때 사용
    • compare(T t1, T t2) 메소드를 재정의(오버라이딩)
      • return 값이 양수일 경우, t2이 앞쪽에 위치,
      • return 값이 음수일 경우, t1이 앞쪽에 위치,

  • Comparable 예시
class NumberString implements Comparable<NumberString> {
    int number;
    String stringNumber;

    NumberString(int number){
        this.number = number;
        this.stringNumber = Integer.toString(number);
    }

    @Override // compareTo를 구현하여 정렬을 하게 함
    public int compareTo(NumberString numberString){
        if(number > numberString.number) {
            return 1;
        } else if(number < numberString.number){
            return -1;
        } else {
            return 0;
        }
    }
}

public class ComparableExample {
    public static void main(String[] args) {

        Set<NumberString> numSet = new TreeSet<>();
        NumberString num1 = new NumberString(1);
        NumberString num2 = new NumberString(10);
        NumberString num3 = new NumberString(100);
        NumberString num4 = new NumberString(500);

        numSet.add(num4);
        numSet.add(num3);
        numSet.add(num2);
        numSet.add(num1);

        for(NumberString num : numSet){
            System.out.print(num.stringNumber + " "); // 1 10 100 500
        }
    }
}
  • Comparator 예시
public class ComparatorTest {
    public static void main(String[] args) {
        NumberAndString one = new NumberAndString(1);
        NumberAndString ten = new NumberAndString(10);
        NumberAndString six = new NumberAndString(6);

        ArrayList<NumberAndString> numbers = new ArrayList<>();
        numbers.add(six);
        numbers.add(ten);
        numbers.add(one);

        for (NumberAndString number : numbers){
            System.out.print(number.numString); // 6 10 1
        }

        Collections.sort(numbers, new SortById());

        for (NumberAndString number : numbers){
            System.out.print(number.numString); // 10 6 1
        }
    }
}

class NumberAndString {
    int id, numInt;
    String numString;
    NumberAndString(int num){
        this.id = num;
        this.numInt = num;
        this.numString = Integer.toString(num);
    }
}

class SortById implements Comparator<NumberAndString>{

    public int compare(NumberAndString number1, NumberAndString number2){
        return number2.id - number1.id; // 크기 역순 배치
    }
}
profile
배운 것은 기록하자! / 오류 지적은 언제나 환영!

0개의 댓글