[TIL] 221012 - 자바 : Collections 프레임워크

yujamint·2022년 10월 17일
0

컬렉션 프레임워크

배열은 크기가 정적이기 때문에 추가 연산시 자리가 부족한 상황이 발생하는 한계가 있다.

ex) 크기가 5인 배열이 꽉 차 있을 때, 원소를 하나 더 추가하고 싶다면 다음 과정을 직접 구현해야 한다.

  • 크기 늘린 배열 새로 생성
  • 기존 배열 복사
  • 새 원소 삽입

Collection을 이용하면 배열을 동적으로 변경해서 사용할 수 있다.

  • 왜 프레임워크? : 컬렉션을 이용하면 컬렉션 내부에 구현된 메소드만 사용할 수 있기 때문에 프레임워크라고 명명한다.

주요 인터페이스

  • List
    • 순서 유지
    • 인덱스 존재
    • 구현 클래스
      • ArrayList
        • 배열 이용해서 원소 유지
        • 사이즈 부족하면 50% 크기 늘림(자바에서)
        • 주소 연속적으로 증가한다.(순차적으로 주소 할당)
          • {1, 2, 3, 4} 의 주소 ⇒ {100, 200, 300, 400} 과 같이 순차적으로
      • Vector (Synchronized) Sycnhrnoized를 유지하는 List : 두 스레드간의 공유 객체가 있을 때, 동시에 DB에 접근하여 일관성을 해치지 않도록 하기 위해 순서를 만들어주는 Sycnhronized 키워드로 모든 메서드가 구현되어 있다. 동적 배열을 의미하는 “Re-sizable Array”와, 동시성을 의미하는 “Synchronization”
        • 모든 메서드가 동기화를 하며 동시성을 챙기다보니 Vector를 사용하면 시간이 저하되고, 애플리케이션의 성능이 떨어진다.
        • 그렇기 때문에 Vector보다는, (동적 배열)한 가지만 구현한 ArrayList를 사용하다가 동기화가 필요할 때마다 Collections.synchronizedList()을 사용하는 게 더 유연성 있고 좋은 방법이다.
      • LinkedList 원소 추가/삽입 성능이 향상된 List이다. 원소의 추가나 삭제하는 동안 인덱스가 물리적인 주소의 순서와 달라질 수 있기 때문에 다시 제일 앞의 노드부터 돌면서 인덱스를 부여하는 작업이 필요함
        • 0번째 인덱스는 100번지에 있고, 1번쨰 인덱스는 200번지에 있고~ 등 각 인덱스마다의 주소를 매핑해놓는다. → 매핑해놓았기 때문에 원소 추가/삽입이 훨씬 빠르다.

        • but, 추가/삽입 연산 일어날 때마다 JVM이 인덱싱(테이블) 업데이트하는 시간이 있고, 주소가 연속적이지 않기 때문에 원소를 검색하는 시간이 느리다.

          vs ArrayList

          ArrayList는 인덱스를 통해 바로 원소의 위치를 아는 것이 가능하다.

        • 처음 시작 주소 + i * (int형 바이트)

          즉, 인덱싱이 빠르다 == 검색이 빠르다.

  • Set
    • 집합 개념
    • 인덱스라는 개념이 없다 → 순서 유지 보장 X
    • 원소 중복 불가
    • 구현 클래스
      • HashSet 해싱된 값에 따라서 주소가 할당되기 때문에 순서가 유저되지 않는다.
      • LinkedHashSet 데이터가 삽입된 순서를 저장함으로써 순서가 유지된다.
  • Map
    • 인덱스라는 개념이 없다. → 순서 유지 보장 X
    • 인덱스의 개념 대신 Key를 통해 Value에 접근
    • 키 중복 불가, 원소 중복 가능
  • Stack
  • Queue
profile
개발 기록

0개의 댓글