본문 바로가기
알고리즘

자바의 자료구조 - List

by 고유빙글 2021. 11. 18.

참고하던 블로그에서는 C언어 기반으로 자료구조를 설명해서 자바의 자료구조는 따로 찾아보았다.

 

우선 자료구조란?

- 프로그램에서 사용할 많은 데이터를 메모리 상에서 관리하는 형태.

- 효율적인 자료구조가 성능 좋은 알고리즘의 기반이 됨

- 자료의 효율적인 관리는 프로그램의 수행 속도와 밀접한 관련이 있음.

- 여러 자료 구조 중에서 구현하려는 프로그램에 맞는 최적의 자료구조를 활용해야 하므로,

 자료구조에 대한 이해가 중요함.

( 출처 : https://soliloquiess.github.io/study/2021/03/20/java_%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0.html )

 

1) Type[] (변수명)

기본적인 타입을 가지고 만드는 배열이다. 선언시 null 혹은 크기를 지정한 배열을 선언해야 한다.

크기의 수정이 불가하다.

Type[][] (변수명) 의 형태로 다중 배열을 만들 수 있다.

 

( 출처 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=ppuagirls&logNo=221560996691 )

2) List

순서 ( 인덱스 ) 를 가진 원소들의 모임, 중복값을 가질 수 있는 자료구조.

크기가 가변적이다.
종류는 ArrayList, LinkedList, vector 등이 있다.

ArrayList 
: 원소들을 인덱스로 접근하여 배열과 사용법이 유사.
     배열은 초기에 크기를 정해줘야하나, ArrayList는 데이터의 갯수에 따라 크기가 자동으로 변경.
: 메소드 
     .add("value") 인덱스 추가
     .add(n,"value") n인덱스에 추가 // n이 마지막 인덱스보다 순차적으로 증가하지 않으면 오류 발생
     .set(n,"value") n인덱스의 원소 변경
     .remove(n) n인덱스의 원소 삭제, 자동으로 다음 인덱스를 한 칸씩 당기게 된다.
     .get(n) n인덱스의 원소를 가져온다.
     int index = list.indexOf("value"); 원소로 인덱스 찾기, 원소가 존재하지 안으면 -1 동일한 원소가 여러개라면, 

                     가장 앞의 인덱스를 가져온다.
     int index = list.lastIndexOf("value") 위의 메소드와 방향만 반대

 

LinkedList
 : ArrayList와 장단점이 비교됨. 둘의 차이점을 기억해두자.
     ArrayList에서 중간 인덱스에서의 데이터의 삽입이나 삭제가 발생할 경우,
     인덱스를 조정하기 위해 그 뒤의 원소들을 하나씩 옮겨줘야하는 작업이 추가로 발생한다.
     이 작업이 반복되면 연산이 낭비되기 때문에 LinkedList를 사용할 수 있다.

 : LinkedList ( 연결리스트 ) 는 각 원소를 링크로 연결하며, 자바에서 모든 연결리스트는
     이중 연결 리스트 ( 다음 원소와 이전 원소를 가리킴 ) 로 구현되어 있다.
     연결리스트에서는 원소가 삽입되고 삭제될 때, 바로 앞에 있는 원소의 링크값만을 변경하면 된다.

 : ArrayList와의 비교 
     인덱스를 가지고 원소를 접근하는 연산은 ArrayList의 성능이 더 좋고,
     중간에 원소의 삽입, 삭제가 잦은 경우에는 LinkedList의 성능이 더 좋다.

 

배열을 리스트로 변경
List<String> list = Arrays.asList(new String[n]);

 

 

.asList()를 사용해서 배열을 List로 변경했을때 진짜 List처럼 사용할 수 있는건 타입에

제약이 있는 듯 하다.

		String[] str = {"abc","def","ghi"};
		List<String> str2 = Arrays.asList(str);
		System.out.println(str2.get(0));
		
		ArrayList<String> str3 = new ArrayList<>();
		str3.addAll(str2);
		System.out.println("str3 : "+str3);

 

이런 방식으로 ArrayList로 바꿀 수도 있다.

 

이 경우는 새로 선언한 ArrayList에 List의 원소들을 추가한 것으로, 주소는 다르다.

 

LinkedList는 방식이 다른 것이지 사용하는 방법은 큰 차이가 없는 것 같다.

 

 

Vector

 : Vector는 동기화된 메소드로 구성되어 있기 때문에,

     멀티 스레드가 동시에 이 메소드들을 실행할 수 없고,

     하나의 스레드가 실행을 완료해야만 다른 스레드들이 실행할 수 있다.

     그래서 멀티 스레드 환경에서 안전하게 객체를 추가하고 삭제할 수 있습니다. 

 

 : 하지만 항상 동기화가 되어있기 때문에 스레드가 1개일때도 동기화를 하게되어,

     ArrayList보다 성능이 떨어지는 상황이 있다. 고로 ArrayList의 속도가 더 빠르다.

'알고리즘' 카테고리의 다른 글

자바의 자료구조 - Stack  (0) 2021.11.19
자바의 자료구조 - Map  (0) 2021.11.19
자바의 자료구조 - 이진 탐색 트리, 레드 블랙 트리  (0) 2021.11.19
공간복잡도  (0) 2021.11.17
시간복잡도  (0) 2021.11.17