배열이란?
배열이란, 동일한 타입의 여러 변수를 하나의 이름으로 묶어서 관리하는 데이터 구조를 말한다. 즉, 같은 타입의 데이터를 연속적으로 저장하고, 각 데이터에는 인덱스로 접근할 수 있다. 배열의 인덱스는 0부터 시작하며, 배열의 길이는 배열을 선언할 때 결정된다.
예를 들어, 학생들의 점수를 관리하는 프로그램을 만든다고 가정한다면, 각 학생의 점수를 별도의 변수로 선언하면 변수 관리가 힘들게 된다.
이럴 때 배열을 사용하게 되면, 하나의 변수로 여러 학생의 점수를 효율적으로 관리할 수 있다.
// 배열 선언
int[] scores = new int[5];
// 배열 요소에 값 할당
scores[0] = 90;
scores[1] = 80;
scores[2] = 70;
scores[3] = 60;
scores[4] = 50;
// 배열 요소 출력
for (int i = 0; i < scores.length; i++) {
System.out.println("학생 " + (i+1) + "의 점수: " + scores[i]);
}
요렇게 사용하게 되면 편하게 관리가 가능하다😊
int[] scores = new int[5];
[5]는 배열의 크기를 의미해서 총 5개의 배열이 들어갈 수 있다.
아래 scores[0] ~ scores[4]까지 각각의 요소에 점수를 할당한 뒤, for문을 통해서 배열의 모든 요소를 출력되었습니다😊
특징
- 같은 타입의 여러 변수를 하나의 묶음으로 다룰 수 있다.
- 배열은 생성될 때 그 크기가 결정되며, 이후로는 크기를 변경할 수 없다.
- 배열의 요소는 메모리의 연속적인 공간에 저장되어 있다.
- 배열의 인덱스는 0부터 시작하여 배열의 길이보다 1만큼 작은 정수까지다.
장점
- 연속적인 메모리 공간에 데이터를 저장하므로 데이터 접근 속도가 빠르다.
- 인덱스를 통해 각 요소에 쉽게 접근할 수 있다.
- 일괄적인 데이터 처리가 가능하여 코드의 간결성을 높일 수 있다.
단점
- 배열의 크기를 먼저 지정해야 하며, 이후에는 크기를 변경할 수 없다. 따라서 메모리의 낭비가 발생할 수 있다.
- 배열에 저장된 데이터의 중간 위치에 데이터를 삽입하거나 삭제하는 작업이 비효율적이다. 이 경우, 모든 요소를 이동시켜야 하므로 시간이 오래 걸릴 수 있다.
ArrayList를 이용한다면?
컬렉션 프레임워크는 데이터를 효율적으로 관리할 수 있는 다양한 자료구조를 클래스로 제공하고 있다.
ArrayList는 이 중 하나로, 배열과 유시하지만 크기가 가변적이라는 특징이 있다. 즉, ArrayList는 데이터가 추가되거나 제거될 때 자동으로 크기를 조절한다. 따라서 배열의 크기를 미리 지정해야 하는 한계를 극복할 수 있게 됨으로 배열의 크기를 미리 지정해야 하는 단점을 해결이 가능하다. 또한 ArrayList를 사용하게 되면 인덱스를 통해 데이터에 접근할 수 있으며, 데이터의 삽입 및 삭제도 메서드를 통해 쉽게 수행이 가능해진다.
예제
import java.util.ArrayList;
// ArrayList 선언
ArrayList<Integer> numbers = new ArrayList<>();
// 요소 추가
numbers.add(10);
numbers.add(20);
numbers.add(30);
// 요소 출력
for (int i = 0; i < numbers.size(); i++) {
System.out.println("요소 " + (i+1) + ": " + numbers.get(i));
}
// 요소 삭제
numbers.remove(1); // 인덱스 1의 요소 삭제
// 삭제 후 요소 출력
for (int i = 0; i < numbers.size(); i++) {
System.out.println("요소 " + (i+1) + ": " + numbers.get(i));
}
이와 같이 ArrayList에 있는 메서드를 적재적소에 잘 사용하게 되면, 배열의 단점을 모두 상쇄시키고 훨씬 유연하게 데이터를 관리할 수 있게 된다. 하지만 ArrayList라고 단점이 없는 것은 아니다.
- 메모리 오버헤드 : ArrayList는 내부적으로 배열을 사용하며, 요소가 추가되거나 삭제될 때마다 새로운 배열을 생성하고 기존 요소를 복사한다. 따라서 배열에 비해 메모리 사용량이 크고, 요소가 많이 추가되거나 삭제될 경우 성능 저하가 발생할 수 있다.
- 기본 타입 불가 : ArrayList는 객체만 저장할 수 있다. 따라서 기본 타입(int, double 등)은 저장할 수 없으며, 이를 위해 Wrapper 클래스(Integer, Double 등)를 사용해야 한다. 이는 추가적인 메모리 사용을 초래한다.
- 순차적 접근에 최적화 : ArrayList는 순차적인 데이터 접근에는 효율적이지만, 중간에 데이터를 삽입하거나 삭제하는 경우 비효율적이다. 중간의 데이터를 삽입하거나 삭제할 때, 나머지 데이터를 이동시켜야 하므로 시간이 오래 걸릴 수 있게 된다.
ArrayList를 사용할 때는 이러한 특성을 고려해야 하며, 상황에 따라 다른 컬렉션 타입(LinkedList, HashSet, HashMap 등)을 사용하는 것이 더 효율적일 수 있다.
정리
배열은 간단하고 효율적인 데이터 구조이지만, 특정 상황에서는 그 한계가 명확하다. 이러한 한계를 극복하기 위해 자바에서는 ArrayList와 같은 컬렉션 프레임워크를 제공하고 있다. 사용 상황에 따라 적절한 데이터 구조를 선택하는 것이 중요하다. 결국은 좋은 도구는 많고 그 도구를 어떻게 상황별로 잘 사용할 수 있는지가 가장 중요하다고 한다🤣
'Language > Java' 카테고리의 다른 글
자바 애플리케이션을 실행 했을 때 일어나는 일들 (0) | 2024.01.06 |
---|---|
계산기 만들기 (0) | 2023.12.30 |
가위, 바위 ,보 만들기 (1) | 2023.12.15 |
구구단 만들기 (0) | 2023.12.14 |
반복문 for (0) | 2023.12.13 |
쓰임 있는 사람이 되기 위해 노력 중입니다.