✅ 배열(Array)의 기본 규칙
- 배열(Array)은 같은 타입의 데이터를 순차적으로 저장하는 자료구조입니다.
- 배열의 크기는 한 번 선언하면 고정되며, 크기 수정이 불가능합니다.
- 배열은 인덱스 0부터 시작하며, 각 요소에 접근할 때는 배열명[인덱스]로 접근합니다.
✅ 배열 생성 및 초기화
배열을 생성하면서 동시에 초기화하는 방법은 두 가지로 나눌 수 있습니다.
1️⃣ 크기를 아는 상태에서 크기를 미리 지정하고 기본값으로 초기화하는 방법
int[] arr = new int[5]; // 기본값은 0으로 초기화
- int[]는 0으로 초기화
- boolean[]은 false로 초기화
- String[] 같은 참조 타입 배열은 null로 초기화
❓ 만약 기본값이 아닌 다른 값으로 초기화하고 싶다면?
💡 Arrays.fill() 메서드 사용하기
자바의 Arrays.fill() 메서드를 사용하면 배열 전체를 특정 값으로 간단하게 초기화할 수 있습니다.
이는 배열의 모든 요소를 동일한 값으로 초기화하는 가장 효율적인 방법 중 하나입니다.
import java.util.Arrays;
int[] arr = new int[5]; // 배열 생성
Arrays.fill(arr, 7); // 배열을 7로 초기화
위 코드는 배열의 모든 요소를 7로 초기화합니다.
시간 복잡도는 O(n)으로 배열의 크기에 따라 선형적으로 작동합니다.
2️⃣ 들어갈 값을 아는 상태에서 배열에 들어갈 모든 값을 미리 지정하여 초기화하는 방법
int[] arr = {1, 2, 3, 4, 5};
✅ 배열의 데이터 삽입, 수정, 삭제
☑️ 데이터 삽입
arr[0] = 10; // 배열의 첫 번째 인덱스에 10 삽입
☑️ 데이터 수정
arr[1] = 20; // 두 번째 인덱스 값을 20으로 수정
☑️ 데이터 삭제
arr[2] = 0; // 세 번째 인덱스의 값을 삭제하는 대신 0으로 초기화
배열은 크기가 고정되어 있기 때문에 인덱스 자체는 삭제할 수 없습니다.
대신, 해당 인덱스를 기본값이나 특정 값으로 변경할 수 있습니다.
자바에서 배열에서 특정 값을 삭제하려면, 배열의 특성상 직접적으로 삭제하는 기능은 없습니다. 배열은 고정 크기를 가지기 때문에 특정 값을 삭제하고 나면 그 자리에 빈 공간이 생기지 않기 때문입니다. 하지만 특정 값을 삭제하는 효과를 내기 위해서는 몇 가지 방법을 사용할 수 있습니다. 아래에서 배열과 동적 배열(ArrayList)을 각각 다룰 때 사용하는 방법을 설명하겠습니다.
⭐ 배열에서 특정 값 삭제하는 방법
1️⃣새 배열을 생성하는 방법 (전통적인 방식의 코드)
public static int[] removeElement(int[] arr, int value) {
// 1. 배열에서 삭제할 값을 제외한 값의 개수를 세어 새 배열의 크기 결정
int count = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] != value) {
count++;
}
}
// 2. 새 배열 생성
int[] newArr = new int[count];
int index = 0;
// 3. 삭제할 값이 아닌 경우 새 배열에 복사
for (int i = 0; i < arr.length; i++) {
if (arr[i] != value) {
newArr[index++] = arr[i];
}
}
return newArr;
}
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 2, 5};
int[] newArr = removeElement(arr, 2);
// 출력: [1, 3, 4, 5]
System.out.println(Arrays.toString(newArr));
}
2️⃣ Stream API로 배열에서 특정 값 삭제
import java.util.Arrays;
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 2, 5};
int valueToRemove = 2;
// Stream을 이용해 값이 2가 아닌 요소만 필터링
int[] newArr = Arrays.stream(arr)
.filter(i -> i != valueToRemove)
.toArray();
// 출력: [1, 3, 4, 5]
System.out.println(Arrays.toString(newArr));
}
}
💡 Stream API와 기존 전통적인 방식 둘 중 어떤 방식으로 해야할까?
- Stream API가 더 나은 경우:
- 코드의 간결성과 가독성이 중요한 경우.
- 배열을 필터링하거나 맵핑하는 등 다양한 연산을 조합해야 하는 경우.
- 자바 8 이상에서 작업 중이며, 함수형 프로그래밍 스타일을 선호하는 경우.
- 전통적인 배열 처리 방식이 더 나은 경우:
- 성능이 중요한 경우. 특히, 매우 큰 배열을 다루는 경우에는 Stream API의 오버헤드가 부담이 될 수 있습니다.
- 자바 8 이하 버전에서 작업 중이거나, 함수형 프로그래밍 스타일에 익숙하지 않은 경우.
- 간단한 배열 조작에 있어 성능을 최적화하고 싶은 경우.
❗ 결론
- 코드의 간결성과 유연성을 원한다면 Stream API를 사용하는 것이 좋습니다. 특히, 필터링, 맵핑 등 다양한 처리가 필요할 때는 Stream API가 매우 유용합니다.
- 성능을 극대화하고 싶다면 전통적인 배열 처리 방식이 더 적합합니다. 특히, 매우 큰 배열을 다룰 때는 Stream API보다 성능상 이점이 있을 수 있습니다.
⭐ 동적 배열(ArrayList)에서 특정 값 삭제하는 방법 - remove(삭제할 값)
ArrayList를 사용하면, 배열과 달리 크기가 동적으로 변경되므로 특정 값을 쉽게 삭제할 수 있습니다. 이는 ArrayList의 remove() 메서드를 활용하면 됩니다.
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(1);
arrayList.add(2);
arrayList.add(3);
arrayList.add(2);
arrayList.add(5);
// 값 2를 삭제
arrayList.remove(Integer.valueOf(2)); // 첫 번째로 만난 2 삭제
// 출력: [1, 3, 2, 5]
System.out.println(arrayList);
}
}
ArrayList.remove(Integer.valueOf(value))를 사용하면 첫 번째로 만난 해당 값을 삭제합니다.
여러 개의 동일한 값을 삭제하려면 반복문을 통해 값을 계속 삭제하거나, removeIf() 메서드를 사용할 수 있습니다.
❓ 모든 해당 값을 삭제하는 방법 -removeIf(조건)
arrayList.removeIf(n -> n == 2); // 값이 2인 모든 요소 삭제
removeIf()를 사용하여 리스트에서 모든 2 값을 삭제합니다.
✅ 배열의 크기 확인 - .length
int[] array = new int[10];
System.out.println("배열의 크기: " + array.length); // 출력: 배열의 크기: 10
배열의 길이는 .length 속성을 통해 확인할 수 있습니다.
✅ 동적 배열 - ArrayList 사용법
자바에서 배열은 크기가 고정되어 있기에 동적인 크기의 배열을 사용하려면 ArrayList를 활용해야 합니다.
이름에 "Array"가 포함되어 있지만, 자바에서는 이를 리스트(List)로 분류합니다.
구체적으로 말하자면, 동적 배열(Dynamic Array)를 기반으로 한 자료구조이면서, 리스트 인터페이스(List interface)를 구현한 클래스입니다.
즉, ArrayList는 리스트이면서, 동적 배열의 특성을 갖는 자료구조입니다. 코딩 테스트나 실제 개발에서 동적 크기와 리스트 메서드의 유연성이 필요하다면 ArrayList를 사용하는 것이 좋습니다.
☑️ ArrayList 선언 및 초기화
// 정수형 ArrayList 생성
ArrayList<Integer> arrayList = new ArrayList<>();
☑️ ArrayList 값 추가 - add(추가할 값)
arrayList.add(10); // 10 추가
☑️ ArrayList 값 수정 - set(인덱스, 바꿀 값)
arrayList.set(0, 20); // 첫 번째 값을 20으로 수정
☑️ ArrayList 값 삭제 - remove(인덱스)
arrayList.remove(0); // 첫 번째 값을 삭제
☑️ ArrayList 크기 반환 - size(배열 이름)
System.out.println(list.size()); // 리스트의 크기 출력
☑️ ArrayList 정렬
리스트는 Collections.sort()를 사용하여 정렬할 수 있습니다.
List<Integer> numbers = new ArrayList<>(Arrays.asList(5, 3, 8, 1));
Collections.sort(numbers); // 오름차순 정렬
☑️ ArrayList 값 가져오기 - get(인덱스)
System.out.println(list.get(1)); // 1번 인덱스 값 출력
⭐ Array와 ArrayList의 차이 알아가기
크기 측면에서
- Array는 크기가 고정됩니다.
- ArrayList는 크기가 동적입니다.
성능 측면에서
- 배열은 고정 크기라서 메모리 성능이 더 좋습니다.
- ArrayList는 내부적으로 배열을 사용하되, 크기를 자동으로 확장하기 때문에 추가적인 메모리 관리가 필요합니다.
데이터 삽입 및 삭제 측면에서
- 배열은 직접적으로 인덱스를 통해 접근해서 수정하지만, 삽입과 삭제는 불편합니다.
- ArrayList는 삽입, 삭제가 편리합니다. 하지만 빈번한 삽입과 삭제는 성능에 영향을 줄 수 있습니다.
⭐ 코딩 테스트에서 배열/리스트를 사용할 때 알아두면 좋은 팁
초기화와 동시에 선언하는 습관을 들이면 런타임 오류를 예방할 수 있습니다.
배열을 조작할 때 범위를 벗어나는 경우(ArrayIndexOutOfBoundsException)를 항상 주의하세요!
배열을 탐색할 때는 일반적인 for 문을 사용할 수 있지만, 아래와 같이 향상된 for 문을 활용하면 코드 가독성이 좋아집니다.
for (int value : arr) {
System.out.println(value);
}
동적 배열이 필요할 때는 ArrayList를 고려하고, 성능을 최적화해야 하는 상황이라면 일반 배열을 사용하는 것이 좋습니다.
✅ 2차원 배열
☑️ 2차원 배열 선언 및 초기화
1️⃣ 크기를 아는 상태
int[][] matrix = new int[3][3]; // 3x3 배열 생성
2️⃣ 들어갈 값을 아는 상태
int[][] matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
System.out.println(matrix[1][2]); // 출력: 6 (1행 2열 값)
☑️ 2차원 배열 값 삽입
matrix[0][1] = 5; // 첫 번째 행, 두 번째 열에 값 5 삽입
☑️ 2차원 배열 값 수정
matrix[1][1] = 10; // 두 번째 행, 두 번째 열 값을 10으로 수정
☑️ 2차원 배열 값 삭제
matrix[2][2] = 0; // 세 번째 행, 세 번째 열 값을 0으로 초기화
2차원 배열에서 값을 삭제할 때도 해당 인덱스를 특정 값으로 초기화하는 방식으로 처리합니다.
✅ Arrays 클래스
☑️ Arrays 클래스란?
Arrays 클래스는 자바의 유틸리티 클래스로, 배열을 쉽게 다룰 수 있도록 다양한 메서드를 제공합니다. 기본적으로 배열은 크기가 고정되어 있고, 인덱스를 통해서만 값을 접근, 수정할 수 있지만, Arrays 클래스는 배열을 더 쉽게 처리할 수 있도록 아래와 같은 기능들을 제공합니다.
- 배열의 정렬
- 특정 값 검색
- 배열 복사
- 배열의 모든 요소를 특정 값으로 채우기
- 배열을 문자열로 변환하여 출력
- 여러 배열의 비교
Arrays 클래스는 정적 메서드(static methods)로 구성되어 있으며, 배열에 대한 고급 연산을 빠르고 쉽게 수행할 수 있도록 돕습니다.
☑️ 코딩 테스트에서 Arrays 클래스를 사용하는 경우
- 정렬이 필요할 때: 배열의 요소들을 오름차순 또는 내림차순으로 정렬하는 문제.
- 탐색이 필요할 때: 배열에서 특정 값을 이진 탐색(binary search)으로 빠르게 찾고 싶을 때.
- 배열을 복사해야 할 때: 배열의 크기를 늘리거나, 특정 범위의 값을 복사해야 할 때.
- 배열 비교: 두 배열이 같은지 비교하거나, 두 배열을 정렬된 순서로 비교할 때.
- 배열을 출력할 때: 배열의 내용을 보기 좋게 출력하고 싶을 때.
✅ Arrays 클래스의 유용한 메서드들
☑️ 정렬 - Arrays.sort()
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] arr = {3, 5, 1, 2, 4};
Arrays.sort(arr); // 배열을 오름차순으로 정렬
System.out.println(Arrays.toString(arr)); // 출력: [1, 2, 3, 4, 5]
}
}
배열을 오름차순으로 정렬하는 메서드입니다.
sort()는 퀵소트 알고리즘을 사용해 평균적으로 O(n log n)의 시간 복잡도를 가집니다. 가장 큰 값이나 작은 값을 찾는 문제에 적합합니다.
☑️ 특정 값 찾기 : 이진탐색 - Arrays.binarySearch()
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
int index = Arrays.binarySearch(arr, 3); // 3의 위치를 이진 탐색
System.out.println(index); // 출력: 2 (3이 배열의 세 번째 위치에 있음)
}
}
이진 탐색을 통해 배열에서 특정 값을 찾습니다. 배열이 정렬되어 있어야만 정확하게 동작합니다. 값이 존재하면 해당 인덱스를 반환하고, 없으면 음수를 반환합니다.
배열에서 특정 값을 빠르게 찾아야 할 때 매우 유용합니다. 일반적으로 O(log n)의 성능을 가집니다.
☑️ 배열 복사 - Arrays.copyOf()
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
int[] newArr = Arrays.copyOf(arr, 3); // 첫 3개의 요소 복사
System.out.println(Arrays.toString(newArr)); // 출력: [1, 2, 3]
}
}
배열의 일부 또는 전체를 복사합니다. 복사하려는 배열의 길이를 지정할 수 있으며, 복사된 배열은 항상 새로운 배열이 됩니다.
☑️ 배열 특정 값으로 초기화 - Arrays.fill()
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] arr = new int[5];
Arrays.fill(arr, 7); // 배열의 모든 값을 7로 초기화
System.out.println(Arrays.toString(arr)); // 출력: [7, 7, 7, 7, 7]
}
}
배열의 모든 요소를 특정 값으로 초기화합니다. 배열 전체 또는 배열의 특정 범위를 지정하여 값을 채울 수 있습니다.
☑️ 두 배열이 동일한 지 확인 - Arrays.equals()
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] arr1 = {1, 2, 3};
int[] arr2 = {1, 2, 3};
boolean isEqual = Arrays.equals(arr1, arr2); // 두 배열이 같은지 비교
System.out.println(isEqual); // 출력: true
}
}
두 배열이 동일한지 확인합니다. 배열의 크기와 각 요소의 값이 모두 같을 때 true를 반환합니다.
☑️ 2차원 이상의 중첩된 두 배열이 동일한 지 확인 - Arrays.deepEquals()
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[][] arr1 = {{1, 2}, {3, 4}};
int[][] arr2 = {{1, 2}, {3, 4}};
boolean isEqual = Arrays.deepEquals(arr1, arr2); // 다차원 배열 비교
System.out.println(isEqual); // 출력: true
}
}
☑️ 배열 내용을 문자열로 변환할 때 - Arrays.toString()
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
System.out.println(Arrays.toString(arr)); // 출력: [1, 2, 3, 4, 5]
}
}
배열의 내용을 문자열 형태로 변환하여 출력합니다. 배열을 보기 쉽게 출력할 때 매우 유용합니다.
⭐ Arrays 클래스 요약
Arrays 클래스는 배열을 다루기 위한 유틸리티 메서드를 제공하는 자바의 필수 클래스입니다.
코딩 테스트에서 배열을 정렬, 탐색, 복사, 비교할 때 Arrays 클래스의 다양한 메서드를 활용하면 코드를 간결하게 작성할 수 있습니다.
성능에 큰 영향을 주지 않으면서도 편리한 메서드를 제공하기 때문에, 효율적이고 가독성 있는 코드를 작성할 수 있습니다.
⭐ Arrays 클래스 코딩 테스트 팁
- 배열을 정렬해야 한다면, Arrays.sort()를 적극 활용하세요!
- 배열에서 특정 값을 빠르게 찾으려면 정렬 후 Arrays.binarySearch()를 사용하면 효율적입니다.
- 배열의 크기를 동적으로 늘리거나 줄여야 할 때는 Arrays.copyOf()를 사용할 수 있습니다.
더 필요한 내용이 있다면 알려주세요~ 이 글에 지속적으로 추가하도록 하겠습니다~
'코딩 테스트 일지 📒' 카테고리의 다른 글
[백준] 2576 홀수 | 구현, 수학 | 브론즈 Ⅲ | JAVA 💡내가 백준 자바 부문 1등?!?! (2) | 2024.09.23 |
---|---|
[코테/JAVA] 문자, 문자열 다루기 완벽 가이드: 이 글 하나로 한번에 끝내자! 🔥 (9) | 2024.09.22 |
[백준] 2439 별 찍기 - 2 | 구현 | 브론즈 Ⅳ | JAVA 💡조건문 대체 (1) | 2024.09.16 |
[백준] 2438 별 찍기 - 1 | 구현 | 브론즈 Ⅴ | JAVA 💡StringBuilder 사용 (0) | 2024.09.16 |
[코드업/JAVA] 기초 100제 완료 후기! 🎉 (0) | 2024.08.26 |