배열과 리스트의 특징을 정확하게 이해하고 문제 조건에 따라 적절하게 선택해 사용하는 것이 중요
배열과 리스트의 핵심 이론
배열
- 메모리의 연속 공간에 값이 채워져 있는 형태의 자료구조
- 인덱스를 통해 값 참조
- 새로운 값을 삽입하거나 특정 인덱스에 있는 값을 삭제하기 어려움. 값을 삽입하거나 삭제하려면 해당 인덱스 주변에 있는 값을 이동시키는 과정이 필요하다.
ex) 삭제
{1,2,3}
에서 두번째에 있는 2를 삭제하고 싶을 때,
2를 삭제하고 뒤에 있는 3을 앞으로 당겨줘야 함.
그래야 {1,3}으로 됨
ex) 삽입
{1,2,3} 에서
두번째 자리에 4를 삽입하고 싶으면 (1,2사이에 낑겨넣음)
{1,**4**,2,3}으로 이후의 값을 뒤로 한칸씩 밀어주어야 함
따라서 값 삭제,삽입이 어려움.
- 배열의 크기는 선언할 때 지정할 수 있으며, 한 번 선언하면 크기를 늘리거나 줄일 수 없다.
- 구조가 간단하므로 코테에서 가장 많이 사용한다.
리스트
- 값과 포인터를 묶은 노드라는 것을 포인터로 연결한 자료구조
- 포인터는 다음 노드를 가리킴
- 인덱스가 없으므로 값에 접근하려면 Head 포인터부터 순서대로 접근해야 한다. 다시 말해 값에 접근하는 속도가 느리다.
- 포인터로 연결되어 있으므로 데이터를 삽입하거나 삭제하는 연산 속도가 빠르다.
- 삽입 시 포인터 연결만 변경해주면 삽입됨.
- 삭제 시 포인터 연결만 원하는 것으로 변경해주면 연결된 것이 없는 노드는 삭제됨.
- 선언할 때 크기를 별도로 지정하지 않아도 된다. 리스트의 크기는 정해져 있지 않고, 크기가 변하기 쉬운 데이터를 다룰 때 적절하다.
- 포인터를 저장할 공간이 필요하므로 배열보다 구조가 복잡하다.
자바에는 ArrayList, LinkedList가 기본으로 제공됨.
이 부분까지 생각하고 직접 구현하는 경우에 대해서는 기업 코테 정도에서는 잘 나오지 않음.
무엇을 사용하면 좋을까
- 배열 : 간단하고 데이터의 수가 정해져 있는 경우에 사용하면 좋음. 데이터에 접근하는 경우가 많을 때에도 사용하면 좋음.
- 리스트 : 크기가 변하는 데이터를 다룰 때 적합. 데이터 삽입,삭제가 많을 때 사용하면 좋음.