Java

[JAVA] 10. 자바 컬렉션(List편)

히비스 2021. 4. 30. 17:18

자바에서 컬렉션은 목록성 데이터를 처리하는 자료 구조를 통칭한다.

자바에서의 데이터를 담는 자료 구조는 다음과 같다.

 

  • 순서가 있는 목록(List)형
  • 순서가 중요하지 않은 셋(Set)형
  • 먼저 들어온 것이 먼저 나가는 큐(Queue)형
  • 키-값(Key-value)으로 저장되는 맵(Map)형

목록, 셋, 큐는 Collection이라는 인터페이스를 구현한다.

public interface Collection<E> extends Iterable<E>

Collection 인터페이스는 제네릭 타입(요소)로 선언되어 있고, Iterable인터페이스를 확장한다.

 

 

 

List 인터페이스는 배열처럼 "순서"가 있고, 이를 구현한 클래스들은 ArrayList, Vector, Stack, LinkedList가 있다.

ArrayList의 객체는 여러 명이 달려들어 값을 변경하려고 하면 문제가 발생하고, (Not Thread Safe)

Vector는 그렇지 않다. (Thread Safe)

만약, ArrayList를 여러 쓰레드에서 덤벼도 안전하게 만들라면,

List list = Collections.synchronizedList(new ArrayList(...));

처럼 객체를 생성해야 한다.

 

 

ArrayList는 확장 가능한 배열

ArrayList 클래스의 상속 관계

java.lang.object

  ㄴ java.util.AbstractCollection<E>

       ㄴ java.util.AbstractList<E>

             ㄴ java.util.ArrayList<E>

 

#abstract 클래스란?

- 일반 클래스와 비슷하지만, 몇몇 메소드는 자식에서 구현하라고 abstract로 선언한 메소드들이 있는 클래스.

 

따라서, AbstractCollection은 Collection 인터페이스 중 일부 공통적인 메소드를 구현해 놓은 것이고,

AbstractList는 List 인터페이스 중 일부 공통적인 메소드를 구현해 놓은 것이다.

 

선언 예)

ArrayList<String> list1 = new ArrayList<String>();

JDK 7부터는 new 뒷 부분엔 따로 타입을 적지 않아도 된다.

-> ArrayList<String> list1 = new ArrayList< >();

 

ArrayList 객체를 선언할 때 매개 변수를 넣지 않으면, 초기 크기는 10.

만약, 10개 이상의 데이터가 들어가면 ArrayList가 자동으로 내부에서 크기를 늘인다.

이렇게 되면 애플리케이션 성능에 영향을 주기 때문에, 어느 정도 예측 가능한 초기 크기를 지정해줘야 한다.

-> ArrayList<String> list2 = new ArrayList<String>(100);

 

 

Stack 클래스

Stack 클래스는 LIFO (Last In First Out - 후입선출)를 지원하기 위해 Vector 클래스를 확장하여 만들었다.

쌓이는 구조이기 때문에 늦게 들어온 순서부터 빠진다.

 

Stack 클래스의 상속 관계

java.lang.Object

  ㄴ java.util.AbstractCollection<E>

        ㄴ java.util.AbstractList<E>

              ㄴ java.util.Vector<E>

                    ㄴ java.util.Stack<E>

 

Stack의 원래 취지인 LIFO를 생각한다면 Vector에 속해서는 안된다.

이 클래스가 JDK 1.0부터 존재했기 때문에 상속을 잘못 받고 있다..

자바의 하위 호환성을 위해 이를 계속 유지하고 있다...

 

 

 

 

 

 

 

 

 

*** 자바의 신(이상민 저)을 공부한 내용 중에 기억해야 할 개념들을 정리해 놓은 글 입니다.***