배열에서 자주 사용하는 ArrayList와 LinkedList가 헷갈려서 정리하려한다. 자바에서는 배열 사용시 초기 길이를 지정해야 하며 동적으로 배열의 길이를 변경할 수 없다.
먼저, ArrayList는 내부적으로 데이터를 배열에서 관리하며 추가, 삭제를 위해 임시 배열을 생성해 데이터를 복사한다.
따라서 대량의 자료를 추가, 삭제 하기 위해서는 데이터 복사가 많이 일어나 성능저하 우려가 있다.
각 데이터는 인덱스를 가지고 있기 때문에 한번에 참조가 가능해 내가 해당 인덱스를 알고 있다면 검색에는 좋다.
LinkedList는 데이터를 저장하는 각 노드들이 링크로 앞뒤로 연결 되어있는 형태이다.
데이터 추가, 삭제시 노드의 연결을 끊고 원하는 부분에 추가, 삭제가 가능하기 때문에 유리하지만, 검색시에는 노드를 처음부터 순회해야 하기 때문에 검색에는 비효율적일 수 있다.
큐를 사용할때와 스택을 사용할 때의 약간 차이가 있다.
큐는 FIFO
offer(): Queue에 삽입
poll(): Queue에서 제거하며 읽기
peek(): Queue에서 제거하지 않고 읽기
스택은 LIFO
push(): Stack에 삽입
pop(): Stack에서 제거하며 읽기
peek(): Stack에서 제거하지 않고 읽기
ArrayList 사용법을 알아보면
LinkedList도 추가, 삭제하는 부분을 빼면 ArrayList와 사용방법은 동일하다.
* 추가로 궁금한 부분 : 왜 List객체 생성시 wrapper class를 사용하는가 ?
- 기본 자료형을 ArrayList에 사용하려면 wrapper 클래스를 적어줘야한다고 한다.
- JDK 1.4 이전에는 ArrayList list = new ArrayList(); 로 사용했는데
1.5부터는 ArrayList<Integer> list = new ArrayList<Integer>(); 이렇게 사용하고
1.7부터는 ArrayList<Integer> list = new ArrayList<>(); 이렇게 사용한다고 한다.
내가 포스팅에 사용한 방식은 1.5버전 방식이었다. 그래서 그냥 이렇게 써야하나보다 하고 쓰려한다.
<Integer>처럼 쓰는 방식을 제네릭이라고 한다.
제네릭은 다룰 객체를 미리 명시해 줌으로써 형변환을 사용하지 않아도 된다.
제네릭을 사용함으로써 타입의 안정성을 제공하고 형변환을 하지않아 코드의 간결성이 보장된다.
댓글