자바에서는 배열의 인덱스 수를 미리 정해야 합니다.

배열의 수를 10개로 지정했는데 저장할 값은 하나라고 생각해보십시요.

그럼 나머지 9개의 인덱스는 놀고있죠.

나는 일하고있는데 옆에 사람들은 놀고있습니다.

음 뭔가 기분이 안좋습니다.

 

자바에서는 이런 놀고있는 사람(메모리)이 없도록 하기위해서

배열의 인덱스 수가 계속해서 변하도록 할 수 있도록 만든게 Collection Framework입니다.

 

Collection 직역하면 모임이라는 뜻입니다.

즉 데이터의 모임이라고 생각하시면 됩니다.

 

자바 모임은 여러 종류가 있는데 그 중 5가지 정도로 나타내 봤습니다.

  • List : 순서, 중복있는 데이터 모임
  • Set : 순서, 중복없는 데이터 모임
  • Map :  Key(순서, 중복없음), Value(순서없음, 중복있음) 조합의 데이터 모임
  • Queue : List 특징을 가지는데,  먼저 들어간 데이터가 나가는 모임 (First in First out)
  • Stack : List 특징을 가지는데, 먼저 들어간 데이터가 마지막에 나가는 모임 (Last in First out)

차이점을 알아 두면서 정리해야 나중에 쓰기 좋을 것 같습니다.

저는 Queue와 Stack의 차이점이 좀 햇갈렸는데,

비유해서 정리하자면,

출처: https://kadosholy.tistory.com/117

 

다이어그램을 하나 가져 와 봤습니다.

뭐가 되게 많습니다. 하나씩 알아 보도록 하죠.

 

더보기

ArrayList

- List 인터페이스 상속

- 순차적으로 데이터 저장

- 데이터 조회 속도가 빠름

- 중간중간 빈번한 데이터 추가 삭제 시 느림

- 멀티 스레드에서 사용시 위험

 

정리

위에서 중간에 위치한 데이터를 추가하거나 삭제할 때 느리다고 했는데

이게 무슨 말이냐면

1,2,3,4,5의 5개의 데이터가 있다고 생각합시다.

그중에서 2를 삭제합니다.

null 값이 2의 자리에 남는게 아니라

3,4,5가 앞으로 땡겨지면서

데이터가 저장됩니다.

그래서 추가를 하거나 삭제를 데이터 사이에 하면 속도가 느립니다.

 이런 추가 삭제를 빠르게 하고 싶다면 LinkedList를 사용하면 됩니다.

 

 

더보기

LinkedList

- List와 Deque 인터페이스 상속

- 양방향에서 데이터 검색 가능

- 중간 데이터 추가 삭제 시 주소값만 바꾸면 되기 때문에 속도가 ArrayList에 비해 빠름

- 각 요소를 노드라고 부름

- 조회 속도는 느림

 

정리

추가/삭제 속도를 빠르게 하려면 LinkedList

조회 속도를 빠르게 하려면 ArrayList

출처 : http://changpd.blogspot.com/2014/08/arraylist-linkedlist-java.html

위는 한 사이트에서 가져온 속도 테스트입니다.

그래프가 오른쪽으로 치솟을 수록 속도가 느립니다.

LinkedList의 추가/삭제 속도를 이해하기 위해 예를 들어보자면

1,2,3,4,5 에서 2를 삭제하면

1번 노드에서 다음 노드로 3번 노드를 가리키기만 하면 됩니다.

Deque에 대해서도 궁금할 수 있을 것 같은데

이해한대로 라면 LinkedList를 양방향으로 돌아다닐수 있게 하는것 같습니다.

궁금하시다면 제가 본 참고 사이트에 들어가서 한번 보십시요.

 

더보기

Vector

이건 요즘 안쓰니까 넘어갑시다.

라고 하면 안되겠죠

그런데 ArrayList랑 거의 똑같은데 동기화에서 차이가 있습니다.

ArrayList는 동기화가 안되고, Vector는 동기화가 됩니다.

동기화가 뭐냐면

쉽게 말해 한번에 하나의 스레드만 코드에 접근이 가능하다는 것입니다.

음 예로 들어보자면

스레드라는 화가가 그림을 그리고 있습니다.

근데 스레드2라는 다른 화가가 중간에 그림을 가로채서 그립니다.

이러면 당연히 그림이 제대로 완성이 되지 않겠죠

이걸 동기화가 안됐다고 합니다.

동기화가 안되면 여러 개발자들이 실행을 시켰을 때 문제가 생길 수 밖에없죠

 

그래서 처음에 Vector는 이런 문제를 미연에 방지할 수 있습니다.

그럼 ArrayList 말고 Vector 쓰면 되는거 아니냐구요?

Vector는 ArrayList에 비해 더 느립니다.

그리고 ArrayList도 이런걸 미연에 방지할 수 있습니다.

바로 Syncronize(동기화)를 명시해주면 됩니다.

이렇게 하면 더 빠르게 동적 배열을 사용할 뿐 아니라,

동기화도 할 수 있어 굳이 Vector를 사용하라는 상사의 명령이 아니라면

ArrayList 씁시다.

 

 

참고

동기화가 잘 구현되어 있어 멀티 스레드에서 문제 없이 사용이 가능하다면

코드가 Thread-safe하다 라고 합니다.

 


 

정리

Collection Framework는 자바 SE 6 중간 부터 사용가능

ArrayList를 대부분 활용하지만 LinkedList도 추가/삭제에 관한 부분에선 사용할 가능성이 있음

 

본 저자는 프로그래밍을 깊게 공부하지 않아 틀린점이 있을 수 있습니다.

그래서 반박 시 여러분 말이 맞습니다.

 

 

참고

https://gangnam-americano.tistory.com/41

https://kadosholy.tistory.com/117

https://choicode.tistory.com/25 
https://pridiot.tistory.com/68 (Deque 마지막 줄쯤에 있습니다)

https://yeolco.tistory.com/94 (ArrayList와 Vector)

https://m.blog.naver.com/goottjob/223134926879 (Thread)

'Java' 카테고리의 다른 글

[Java] Generic 정리  (2) 2024.01.05
[Java]클래스 정리 및 OOP 4가지 특징  (2) 2024.01.04
[Java] 자바 배열 선언  (0) 2024.01.01

+ Recent posts