리스트(List)와 문자열 배열(String Array)의 차이점 (feat. 배열 원소제거하기)
Java에서 데이터를 저장하고 관리하는 데에는 여러 가지 방법이 있다. 그 중에서도 리스트(List)와 문자열 배열(String Array)는 많이 사용되는 방식이다. 리스트와 문자열 배열에 대해서 알아보고 두 가지의 차이점에 대해서 정리해 보겠다
리스트(List)
- 리스트는 크기가 가변적이다. 요소의 개수를 동적으로 조정할 수 있다.
- 리스트는 여러 종류의 객체를 저장할 수 있다. 예를 들어 정수, 문자열, 객체 등을 저장할 수 있다.
- 리스트는 요소의 추가, 삭제, 수정이 용이하다. 'add()', 'remove()', 'set()' 등의 메소드를 사용하여 요소를 조작할 수 있다.
- ArrayList, LinkedList 등의 클래스를 이용해서 리스트를 구현할 수 있다.
List<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
System.out.println(numbers); // 출력: [1, 2, 3]
문자열 배열(String Array)
- 문자열 배열은 크기가 고정된다. 초기에 배열의 크기를 지정하고 나중에 변경할 수 없다
- 문자열 배열은 문자열만 저장할 수 있다. 다른 타입의 객체는 저장할 수 없다.
- 배열의 크기가 고정되기 때문에 요소의 추가, 삭제, 수정이 어렵다. 배열의 크기를 변경하기 위해서는 새로운 배열을 생성하고 기존의 값을 복사해야 한다.
String[] names = new String[3];
names[0] = "apple";
names[1] = "banana";
names[2] = "lemon";
System.out.println(Arrays.toString(names)); // 출력: [apple, banana, lemon]
리스트(List)와 문자열 배열(String Array)의 차이점
1. 크기
- 문자열 배열 : 배열의 크기는 선언시에 고정된다. 선언 후에는 크기를 변경할 수 없다. 따라서, 배열을 사용할 때는 데이터의 개수를 미리 알아야 한다.
String[] stringArray = new String[5]; // 크기가 5인 문자열 배열을 선언
- 리스트 : 리스트는 동적 데이터 구조로, 원소를 추가하거나 제거함으로써 크기가 자동으로 조정된다. 이 특성 때문에 리스트는 크기 변경이 필요한 상황에서 유용하다.
List<String> stringList = new ArrayList<>(); // 빈 리스트를 생성
stringList.add("Hello"); // 원소 추가
stringList.add("World"); // 원소 추가
2. 유형
- 배열 : 배열은 원시 데이터 유형(primitive types)과 객체 모두를 포함할 수 있다.
int[] intArray = new int[5]; // 원시 데이터 유형 배열
- 리스트 : 리스트는 오직 객체만을 포함할 수 있다. 원시 데이터 유형을 사용하려면, 해당 원시 데이터 유형의 래퍼 클래스(Integer, Character 등)를 사용해야 된다.
List<Integer> intList = new ArrayList<>(); // 원시 데이터 유형 래퍼 클래스 리스트
3. 메소드
- 배열 : 배열은 원소의 추가나 제거 등의 작업을 위한 내장 메소드를 가지고 있지 않다. 그래서 배열에 원소를 추가하거나 제거하는 것은 복잡하다
- 리스트 : 리스트는 Collection 인터페이스를 구현하므로, 원소 추가(add), 제거(remove), 검색(contains)등의 메소드를 제공한다. 이러한 메소드는 데이터 조작을 쉽게 해준다
stringList.remove("Hello"); // 원소 제거
boolean containsWorld = stringList.contains("World"); // 원소 검색
4.성능
- 배열 : 배열은 메모리 효율이 좋고, 인덱스를 통한 원소 접근이 빠르다. 따라서, 크기가 고정되어 있고 간단한 데이터 처리만 필요한 경우에는 배열이 더 적합하다.
- 리스트 : 리스트는 다양한 메소드 덕분에 복잡한 데이터 조작을 쉽게 처리할 수 있다. 하지만 메모리 사용량 증가와 속도 저하를 가져올 수 있다.
5.요약
데이터 개수가 불확실하거나, 다양한 데이터 조작이 필요한 경우에는 리스트가 적합하다.
(feat.특정 인덱스에서 배열의 원소를 제거하는 방법)
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] myArray = {1, 2, 3, 4, 5}; // 초기 배열
int removeIndex = 2; // 제거하려는 원소의 인덱스
System.out.println("Original Array: " + Arrays.toString(myArray));
if (myArray != null && myArray.length > 0 && removeIndex >= 0 && removeIndex < myArray.length) {
int[] newArray = new int[myArray.length - 1]; // 원래 배열의 길이보다 하나 작은 새 배열을 만듭니다.
for (int i = 0, k = 0; i < myArray.length; i++) {
if (i == removeIndex) {
continue; // 인덱스가 제거할 원소의 인덱스라면, 이 반복을 건너뜁니다.
}
newArray[k++] = myArray[i]; // 인덱스가 제거할 원소의 인덱스가 아니라면, 원소를 새 배열에 복사합니다.
}
myArray = newArray; // 새 배열을 사용합니다.
System.out.println("Resultant Array: " + Arrays.toString(myArray));
} else {
System.out.println("Invalid index or array is empty.");
}
}
}
이 코드는 배열에서 인덱스 2의 원소(3) 를 제거하고 있다. 결과는 1, 2, 4, 5 가 출력되게 된다.
이렇게 큰 배열이나 여러번의 제거에 대해서 비효율적이다. 왜냐하면 각 제거마다 새 배열을 생성해야 하기 때문이다.
그렇기 때문에 ArrayList, LinkedList 또는 다른 Collection 클래스와 같은 동적 데이터 구조를 사용하는 것이 좋다