반응형
해당 글에서는 자료구조 중 선형구조에 포함되는 순차 리스트 중 배열, 리스트 대해 알아봅니다.
💡 [참고] 자료구조의 전체 구조입니다.
- 해당 자료구조 중 선형구조 >> 선형 리스트에 대해서 알아봅니다.
1) 선형 구조(Linear Structure)
💡 선형 구조(Linear Structure)란?
- 데이터를 저장하기 위한 기본적인 형태로 데이터가 '일렬로 나열'되어 있을 뿐만 아니라 데이터 간에 순서가 있고 논리적으로 이어져 있는 구조를 의미합니다.
- 선형 구조에는 순차 리스트, 연결 리스트, 큐(Queue), 스택(Stack), 덱(deque)이 있습니다.
💡 [참고] 큐, 스택, 덱에 대해 궁금하시면 아래의 글을 참고하시면 크게 도움이 됩니다.
2) 순차 리스트(Sequential List)
💡 순차 리스트(Sequential List)
- 데이터 요소들이 순서대로 배치되어 있는 선형구조입니다.
- 각 요소는 다음 요소와 연결되어 있으며 각 요소는 인덱스를 통해 접근할 수 있습니다.
3) 순차 리스트 종류 : 배열(Array)
💡 배열(Array)
- 메모리의 연속 공간에 값이 채워져 있는 형태의 자료구조를 의미합니다.
- 배열은 '동일한 타입'의 데이터 요소를 저장하는 데 사용되며 '고정된 크기'를 가지고 있어서 동일한 배열의 유형과 크기를 지정하여 생성하여 사용합니다. 배열의 값을 접근하고자 할때는 '인덱스'를 통해 참조하여 접근 할 수 있습니다.
- 해당 인덱스는 첫 번째 요소는 0부터 시작을 합니다. 데이터의 집합을 효율적으로 저장하고 관리하기 위해 사용합니다.
- 배열을 이용하여 데이터 검색, 정렬, 필터링, 통계 등에 활용될 수 있습니다.
1. 배열의 특징
💡 배열의 특징
1. '인덱스'를 사용하여 요소에 빠르게 접근할 수 있습니다.
- 키 값을 이용하여 접근하는 방식보다 인덱스로 접근하는 방식이 빠릅니다.
2. 메모리에 연속적으로 저장되기 때문에 '연속 접근이 가능'합니다.
- 키 값을 이용하여 접근하는 방식은 연속적으로 저장된 데이터에 대해 순차적인 접근이 불가능 하지만 배열은 연속접근이 가능합니다.
3. 요소들이 '동일한 자료형'을 가지고 있기 때문에 일관된 데이터 처리가 가능합니다.
- 일관된 데이터 타입을 가지고 있기에 처리가 편리합니다.
4. '크기가 고정'되어 있어 추가적인 메모리 할당이 필요하지 않습니다.
- 초기화 시에 ‘고정된 크기’를 지정하기에 추가 메모리 할당을 하지 않습니다.
5. 배열의 요소들은 순서가 있기 때문에 정렬된 데이터를 다루기에 유용합니다.
순차적으로 저장된 데이터이고 각각의 인덱스 기반 순서를 가지고 있기에 데이터 처리가 용이합니다.
2. 배열 활용: 배열의 초기화
💡 배열의 초기화
- 배열의 크기와 값에 따라 다양한 초기화를 수행할 수 있습니다.
// 1. '사이즈'와 '값'이 둘다 없는 빈 배열
String[] strArr1 = {};
// 2. '사이즈'는 존재하지만 '값'이 없는 빈 배열
String[] strArr2 = new String[3];
// 3. '사이즈'가 자동 지정된 '값'이 있는 배열
String[] strArr3 = {"one", "two", "three"};
[ 더 알아보기 ]
💡 배열의 크기만 지정하고 값을 할당하지 않으면 무슨 값을 가질까?
데이터 유형 | 초기화 값 |
int | 0 |
boolean | false |
char | null |
String | null |
float, double | 0.0 |
객체 자료형 (예: Integer, Boolean, String) | null |
3. 배열 활용: 배열의 값 할당
💡 배열의 값 할당
- 값이 없는 빈 배열에 값을 할당하거나 인덱스를 기반으로 값을 할당할 수 있습니다
// 1. 빈 배열에 값 넣기
String[] strArr1 = new String[3];
strArr1[0] = "one";
strArr1[1] = "two";
strArr1[2] = "three";
// 2. 빈 배열 -> 사이즈 할당 -> 값 넣기
String[] strArr2 = {};
strArr2 = new String[3];
for (int i = 0; i < strArr2.length; i++) {
strArr2[i] = Integer.toString(i);
}
💡 [참고] 배열의 활용 방법에 대해 궁금하시면 아래의 링크를 참고하시면 도움이 됩니다.
3. 배열 활용: 2차원 배열
💡 2차원 배열
- 행과 열로 구성된 1차원 배열을 모아서 2차원 배열을 형성합니다.
- 일반 배열과 동일하게 행과 열의 배열의 인덱스를 사용하여 요소를 접근할 수 있습니다.
// 해당 배열은 3행과 4열의 형태를 갖는 배열입니다.
int[][] matrix2Array = new int[3][4];
// 2차원 배열의 요소 접근 방법
for (int i = 0; i < matrix2Array.length; i++) {
for (int j = 0; j < matrix2Array[i].length; j++) {
System.out.print(array[i][j] + " ");
}
}
반응형
4) 순차 리스트 종류 : 리스트(ArrayList)
💡 순차 리스트(ArrayList)
- 값과 포인터를 묶는 노드라는 것을 포인터로 연결한 자료구조입니다.
- 리스트는 '동일한 타입'의 데이터 요소를 저장하는데 사용되며 '가변적 크기'를 가지고 있어서 동일한 타입의 유형을 선택하지만 크기에 제한 없이 객체를 추가하고 삭제하는데 편리합니다.
- 컬렉션 프레임워크의 List의 인터페이스를 활용하여 구현한 구현체입니다. ArrayList 외에 LinkedList, Vector 등이 있습니다.
- 생성된 배열은 ‘인덱스’를 사용하여 개별 요소에 대해 액세스 할 수 있습니다. 해당 인덱스는 첫 번째 요소는 0부터 시작을 합니다.
- 제네릭 클래스로 제공되어, 다양한 타입의 객체를 저장할 수 있습니다. 제네릭 클래스는 클래스 내부에서 사용할 데이터 타입을 컴파일 시에 지정할 수 있는 기능을 제공합니다.
💡 ArrayList의 객체를 생성할 때, 데이터 타입은 ‘T’로 제너릭 타입의 매개변수로 사용이 됩니다.
- 아래와 같은 제너릭 타입은 객체 자료형으로 사용이 가능합니다.
객체 자료형 | 설명 |
Integer | 정수 값을 저장하는 타입 |
String | 문자열 값을 저장하는 타입 |
Double | 실수 값을 저장하는 타입 |
Boolean | 논리 값을 저장하는 타입 |
Object | 모든 객체 타입을 저장할 수 있는 타입 |
List<T> list = new ArrayList<>();
[ 더 알아보기 ]
💡 ArrayList는 크기 제한이 없을까?
- ArrayList의 크기 제한은 없습니다. ArrayList는 동적으로 크기가 조정되는 배열 기반의 자료구조이므로, 필요에 따라 요소를 추가하거나 제거할 수 있습니다.
- ArrayList는 내부적으로 배열을 사용하며, 요소를 추가할 때 배열의 크기가 부족하면 자동으로 더 큰 크기의 배열로 복사됩니다. 따라서 ArrayList는 필요한 만큼 요소를 저장할 수 있습니다.
1. ArrayList 특징
💡 ArrayList 특징
1. 동적 크기를 가지고 있습니다.
- 일반 배열과 달리 ArrayList은 필요에 따라 자동으로 크기를 조절할 수 있습니다.
2. 임의 접근이 가능합니다.
ArrayList은 인덱스를 사용하여 요소에 빠르게 접근할 수 있습니다. 이를 통해 검색, 수정, 삭제 등의 작업을 효율적으로 수행할 수 있습니다.
3. 요소의 순서 유지됩니다.
- ArrayList은 요소의 삽입 순서를 유지합니다. 명시적으로 수정하지 않는 이상 순서는 일관성을 유지합니다.
4. 다양한 타입의 요소 지원합니다.
- ArrayList은 자동 박싱을 통해 기본 타입을 포함한 다양한 타입의 요소를 저장할 수 있습니다.
5. 끝에서의 삽입과 삭제가 효율적입니다.
- ArrayList의 끝에 요소를 추가하거나 제거하는 것은 효율적입니다. 요소의 이동이 최소화되기 때문입니다.
6. 중간에서의 삽입과 삭제가 비효율적입니다.
- ArrayList의 중간에 요소를 삽입하거나 삭제하는 것은 후속 요소의 이동을 필요로 하기 때문에 큰 리스트에 대해 시간이 오래 걸릴 수 있습니다.
2. ArrayList 활용: ArrayList의 초기화
💡 ArrayList의 초기화
- 배열을 생성하거나 초기 값을 할당하는 방법을 의미합니다.
// ArrayList 초기화
List<String> strArrList1 = new ArrayList<>();
// ArrayList '값'을 포함하여 초기화
List<String> strArrList2 = Arrays.asList("apple", "banana", "mongo");
3. ArrayList 활용: ArrayList 값 할당
💡 ArrayList 값 할당
- 빈 ArrayList에 값을 하나씩 할당하거나 일괄로 값을 할당할 수 있습니다.
// 1. 빈 ArrayList에 값 넣기
List<String> strArrList1 = new ArrayList<>();
strArrList1.add("one");
strArrList1.add("two");
strArrList1.add("three");
// 2. 빈 ArrayList에 일괄 값 넣기
List<String> strArrList2 = new ArrayList<>();
strArrList2.addAll(Arrays.asList("one", "two", "three"));
💡 [참고] ArrayList의 API 문서를 정리한 내용입니다.
5) 배열과 ArrayList 비교
💡 배열과 ArrayList를 비교 봅니다.
분류 | Array | ArrayList |
크기 조정 | 고정 크기 | 동적 크기 |
메모리 할당 | 미리 할당 | 필요에 따라 동적 할당 |
요소 삽입/삭제 | 비효율적 | 효율적 |
요소 접근 | 효율적 | 효율적 |
데이터 유형 | 일반 데이터 | 참조 데이터 |
💡[참고] 좀 더 다양한 자료구조에 대해 알고 싶으시면 아래의 글을 참고하시면 도움이 됩니다.
분류 | 주제 | 링크 |
선형구조 | 순차 리스트(Array, ArrayList) | https://adjh54.tistory.com/317 |
선형구조 | 연결 리스트(단순, 이중, 순환 리스트) | https://adjh54.tistory.com/319 |
선형구조 | 큐, 스텍, 덱 | https://adjh54.tistory.com/135 |
선형구조 | 큐, 스텍, 덱 (문제로 이해하기) | https://adjh54.tistory.com/185 |
선형구조 | 큐(일반 큐, 우선순위 큐) | https://adjh54.tistory.com/226 |
비선형구조 | 트리(일반트리/이진트리) | https://adjh54.tistory.com/320 |
비선형구조 | 균형트리(AVL, 레드-블랙, B-트리) | https://adjh54.tistory.com/324 |
비선형구조 | 그래프(방향, 무방향 그래프) | https://adjh54.tistory.com/325 |
오늘도 감사합니다. 😀
반응형
'Java > 알고리즘 & 자료구조' 카테고리의 다른 글
[Java/자료구조] 비선형구조 이해하기 - 1 : 트리(일반트리, 이진트리) (1) | 2023.11.19 |
---|---|
[Java/자료구조] 선형구조 - 연결 리스트 이해하기 : 단순, 이중, 순환 연결리스트 (3) | 2023.11.19 |
[Java/알고리즘] 완전 탐색(Exhaustive Search) 이해하기 -3 : 문제로 이해하기 (0) | 2023.07.23 |
[Java/자료구조] 선형구조 - 큐(Queue) 이해하기: 일반 큐, 우선순위 큐(Priority Queue) 이해하기 (2) | 2023.07.22 |
[Java/알고리즘] 분할정복(Divide and Conquer Algorithm) 이해하기 (0) | 2023.07.08 |