참고하던 블로그에서는 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 |