Array
배열은 동일한 데이터 타입을 가진 원소들이 연속된 메모리에 저장되는 자료구조입니다.
인덱스를 이용해 원소에 접근할 수 있어 데이터를 효율적으로 관리할 수 있습니다.
배열은 프로그래밍에서 가장 기본이 되는 자료구조 중 하나이며, 다양한 알고리즘 문제에서 사용됩니다.
Array
의 구조크기가 고정되어 있습니다
연속된 메모리 공간에 저장됩니다.
각 원소는 인덱스를 이용해 접근할 수 있습니다. 인덱스는 0부터 시작합니다.
배열의 크기는 선언할 때 지정하며, 이후에 크기를 변경할 수 없습니다.
Array
의 기본 연산배열은 다음과 같은 기본 연산을 지원합니다.
원소 추가: 배열의 끝에 새로운 원소를 추가할 수 있습니다.
원소 삭제: 배열에서 특정 원소를 삭제할 수 있습니다.
원소 검색: 배열에서 특정 원소를 검색할 수 있습니다.
정렬: 배열을 정렬할 수 있습니다.
다차원 배열은 배열의 원소가 배열인 경우를 말합니다.
예를 들어, 2차원 배열은 배열의 원소가 1차원 배열인 경우입니다.
다차원 배열을 이용해 행렬, 이미지 등을 표현할 수 있습니다.
배열의 장점
원소에 빠르게 접근할 수 있습니다.
메모리 상에서 연속된 공간을 차지하므로 캐시 지역성을 가지고 있어 접근 속도가 빠릅니다.
구현이 간단합니다.
배열의 단점
크기가 고정되어 있으므로 크기를 변경할 수 없습니다.
원소를 삭제하면 다른 원소들의 인덱스가 변경되어야 합니다.
배열의 중간에 원소를 추가하려면 추가할 위치 이후의 모든 원소를 이동해야 합니다.
배열과 연결리스트는 모두 데이터를 저장하는 자료구조입니다.
하지만, 두 자료구조는 다음과 같은 차이점이 있습니다.
크기: 배열은 크기가 고정되어 있으며, 연결리스트는 크기가 가변적입니다.
메모리 구조: 배열은 연속된 메모리 공간을 사용하며, 연결리스트는 포인터를 이용해 연결된 노드들로 구성됩니다.
원소 접근: 배열은 인덱스를 이용해 원소에 접근할 수 있으며, 연결리스트는 순서대로 노드를 탐색해야 합니다.
원소 추가/삭제: 배열은 중간에 원소를 추가/삭제하면 다른 원소들의 인덱스가 변경되어야 하며, 연결리스트는 새로운 노드를 추가/삭제할 수 있습니다.
결론
// 배열의 선언
// 크기가 10인 myArray 라는 배열을 생성합니다.
int[] myArray = new int[10];
배열의 첫 번째 요소의 인덱스는 0 입니다.
Java에서 배열은 기본 데이터 유형(int, char, boolean ...) 또는 참조 데이터 유형(객체...)를 저장할 수 있습니다.
// 배열의 요소
// 배열의 첫 번째 요소에 접근합니다.
int firstElement = myArray[0];
//배열의 요소 추가
myArray[0] = 0;
myArray[1] = 1;
myArray[2] = 2;
myArray[3] = 3;
//배열을 선언하면서 요소를 추가할 수 있다.
int[] myArray = {0,1,2,3};
// 배열의 내용을 출력할 때 Arrays.toString() 을 사용하면 아래와 같이 출력할 수 있다.
import java.util.Arrays;
System.out.println( Arrays.toString(array1) ); // [1, 2, 3]
Arrays
클래스import java.util.Arrays;
Java
에서 Arrays 클래스
는 배열
을 조작
하기 위한 유용한 메서드
를 제공합니다.
Arrays 클래스
를 사용하면 배열
의 요소를 정렬
, 복사
, 검색
및 비교
할 수 있습니다.
Arrays 클래스
는 정적(static) 메서드
로 구현되어 객체를 만들지 않고 바로 사용할 수 있습니다.
Arrays
asList
toString
sort
equals
fill
copyOf
copyOfRange
binarySearch
compare
mismatch
stream
Arrays.asList()
Arrays.asList()
는 지정된 Array
를 지원하는 고정 크기의 List
를 반환합니다.
이 메소드는 Array
를 List
로 래핑하여 Array
를 List
처럼 다룰 수 있도록 합니다.
이 List
는 고정 크기이므로, 추가 요소를 넣을 수 없습니다.
List
에 대한 변경 사항은 Array
에 반영되므로, List
를 변경하면 원래 Array
도 변경됩니다.
String[] array = {"apple", "banana", "orange"};
List<String> list = Arrays.asList(array);
System.out.println(list); // [apple, banana, orange]
// 위 코드에서, asList() 메소드를 사용하여 String 배열을 List<>으로 변환합니다.
// 이 리스트를 출력하면, 원래 배열과 같은 내용을 가진 리스트가 출력됩니다.
list.set(0, "pear");
System.out.println(Arrays.toString(array)); // [pear, banana, orange]
// 위 코드에서, 리스트의 첫 번째 요소를 pear 로 변경하면, 원래 배열의 첫 번째 요소도 pear 로 변경됩니다.
// 따라서 Arrays.toString() 메소드를 사용하여 원래 배열을 출력하면, 변경된 요소가 출력됩니다.
Arrays.toString()
Arrays.toString()
메소드는 지정된 배열을 문자열로 변환하여 반환합니다.
이 메소드는 배열의 요소를 대괄호로 묶고 쉼표로 구분하여 문자열로 표현합니다.
int[] array = { 1, 2, 3, 4, 5 };
String str = Arrays.toString(array);
System.out.println(str); // [1, 2, 3, 4, 5]
// 위 코드에서, Arrays.toString() 메소드를 사용하여 int 배열을 문자열로 변환합니다.
// 변환된 문자열은 [1, 2, 3, 4, 5] 와 같이 대괄호로 묶인 배열의 요소들을 쉼표로 구분한 것입니다
toString()
메소드는 배열의 요소 타입에 따라 다르게 동작합니다.
boolean[]
, byte[]
, char[]
, double[]
, float[]
, int[]
, long[]
, short[]
배열의 경우, 요소를 해당 타입의 문자열로 변환한 후 대괄호와 쉼표로 구분하여 반환합니다. 그 외의 배열 타입인 경우, 각 요소의 toString() 메소드를 호출하여 문자열로 변환한 후, 대괄호와 쉼표로 구분하여 반환합니다.
Arrays.toString() 메소드는 디버깅이나 로깅 등에서 배열의 내용을 쉽게 출력할 수 있도록 도와줍니다.
Arrays.sort()
Arrays.sort()
메소드는 배열의 요소를 정렬하여 반환합니다.
이 메소드는 기본적으로 오름차순으로 정렬하며, 배열의 요소가 primitive type(byte, short, int, long, float, double, char, boolean)
인 경우에는 배열 요소의 값으로, 객체 타입(Object
)인 경우에는 객체의 Comparable 인터페이스
를 구현한 클래스의 compareTo()
메소드를 사용하여 정렬합니다.
// 기본적인 오름차순 정렬
int[] intArray = {5, 3, 1, 2, 4};
Arrays.sort(intArray);
System.out.println("intArray 정렬 후: " + Arrays.toString(intArray));
// intArray 정렬 후: [1, 2, 3, 4, 5]
// `int[]` 배열을 정렬하는 방법을 보여줍니다.
// Arrays.sort(intArray)는 배열의 요소를 오름차순으로 정렬합니다.
// 정렬 결과는 Arrays.toString(intArray)를 이용하여 출력할 수 있습니다.
// 역순으로 정렬하기
Integer[] integerArray = {5, 3, 1, 2, 4};
Arrays.sort(integerArray, Collections.reverseOrder());
System.out.println("integerArray 역순 정렬 후: " + Arrays.toString(integerArray));
// integerArray 역순 정렬 후: [5, 4, 3, 2, 1]
// Integer[] 배열을 역순으로 정렬하는 방법을 보여줍니다.
// Arrays.sort() 메소드에 Collections.reverseOrder()를 전달하여 역순으로 정렬합니다.
// 객체 타입의 경우, compareTo() 메소드가 구현되어 있어야 합니다.
// 객체 타입 정렬
String[] stringArray = {"Java", "Python", "C++", "Ruby"};
Arrays.sort(stringArray);
System.out.println("stringArray 정렬 후: " + Arrays.toString(stringArray));
// stringArray 정렬 후: [C++, Java, Python, Ruby]
// String[] 배열을 오름차순으로 정렬하는 방법을 보여줍니다.
// Arrays.sort(stringArray)는 문자열을 오름차순으로 정렬합니다.
Arrays.equals()
Arrays.equals()
메소드는 두 개의 배열이 같은지 비교합니다.
메소드는 두 개의 인자 a1
와 a2
를 받으며, 각 인자는 객체 배열
입니다.
메소드는 a1와 a2 배열의 길이와 각 인덱스의 요소가 동일
한 경우 true
를 반환하며, 그렇지 않으면 false
를 반환합니다.
String[] arr1 = {"apple", "banana", "orange"};
String[] arr2 = {"apple", "banana", "orange"};
boolean isEqual = Arrays.equals(arr1, arr2);
if(isEqual) {
System.out.println("The arrays are equal.");
} else {
System.out.println("The arrays are not equal.");
}
// 두 배열의 내용이 같으므로, 메소드는 true를 반환하고
// "The arrays are equal."이라는 메시지가 출력됩니다.
Arrays.equals()
메소드는 배열 비교에 매우 유용합니다. 예를 들어, 프로그램에서 두 개의 배열이 같은지 확인해야 하는 경우에 사용됩니다. 이 메소드를 사용하면 코드를 간결하게 유지할 수 있습니다.Arrays.fill()
Arrays.fill() 메소드는 배열의 모든 요소를 지정된 값으로 설정합니다.
메소드는 두 개의 인자 a
와 val
을 받습니다. a는 값이 할당될 배열
이고, val은 배열의 모든 요소에 할당될 값
입니다.
int[] arr = new int[5];
Arrays.fill(arr, 5);
// arr 배열의 모든 요소를 5로 설정합니다.
// 이제 arr 배열은 {5, 5, 5, 5, 5}가 됩니다.
String[] arr = new String[5];
Arrays.fill(arr, "Hello");
// arr 배열의 모든 요소를 "Hello" 문자열로 설정합니다.
// 이제 arr 배열은 {"Hello", "Hello", "Hello", "Hello", "Hello"}가 됩니다.
Arrays.fill()
메소드는 배열 초기화
와 같은 상황에서 유용하게 사용됩니다. 또한 배열을 테스트하는 동안 특정 값으로 배열을 채우는 데 사용됩니다.Arrays.copyOf()
지정된 배열의 길이만큼 새로운 배열을 생성하고, 이전 배열의 요소를 복사합니다.
배열의 길이를 늘리면 추가된 요소는 해당 타입의 기본값으로 설정됩니다.
기존 배열을 수정하지 않고 배열의 일부 또는 전체를 복사하여 새로운 배열을 생성
할 수 있습니다.
Arrays.copyOf(original, newLength)
// original은 복사될 배열이고, newLength는 새로운 배열의 길이입니다.
int[] arr = {1, 2, 3, 4, 5};
int[] newArr = Arrays.copyOf(arr, 3);
// arr 배열에서 처음 세 개의 요소를 포함하는 새로운 배열 newArr을 생성합니다.
// 이제 newArr 배열의 값은 {1, 2, 3}이 됩니다.
Arrays.copyOfRange()
지정된 범위 내의 배열 요소를 복사하여 새로운 배열을 생성합니다.
복사할 범위가 original
을 벗어나면 추가된 요소는 해당 타입의 기본값으로 설정됩니다.
기존 배열을 수정하지 않고 배열의 일부 또는 전체를 복사하여 새로운 배열을 생성
할 수 있습니다.
Arrays.copyOfRange(original, fromIndex, toIndex)
// original은 복사될 배열이고, from과 to는 범위를 지정하는 인덱스입니다.
// from은 복사를 시작하는 인덱스이고, to는 복사를 끝내는 인덱스입니다.
// to 인덱스의 요소는 복사되지 않습니다.
int[] arr = {1, 2, 3, 4, 5};
int[] newArr1 = Arrays.copyOfRange(arr, 1, 4);
// arr 배열의 인덱스 1부터 3까지 요소를 복사하여 새로운 배열 newArr1을 생성합니다.
// 이제 newArr 배열의 값은 {2, 3, 4}가 됩니다.
int[] arr = {1, 2, 3, 4, 5};
int[] newArr2 = Arrays.copyOfRange(arr, 4, 8);
// newArr2 = {5, 0, 0, 0}
String[] arr = {"apple", "banana", "orange"};
String[] newArr3 = Arrays.copyOfRange(arr, 2, 5);
// newArr2 = {"orange", null, null}
Arrays.binarySearch()
Arrays.binarySearch
는 Java에서 정렬된 배열
에서 특정 요소를 검색
하는 메서드입니다.
이진 탐색 알고리즘
을 사용하여 정렬된 데이터를 검색하는 효율적인 알고리즘입니다.
import java.util.Arrays;
public class BinarySearchExample {
public static void main(String[] args) {
int[] arr = {2, 5, 8, 12, 16, 23, 38, 56, 72, 91};
int key = 23;
int index = Arrays.binarySearch(arr, key);
if (index >= 0) {
System.out.println(key + "는 인덱스 " + index + "에서 찾았습니다.");
} else {
System.out.println(key + "는 배열에서 찾을 수 없습니다.");
}
}
}
매개변수 parameter
arr : 탐색하려는 정렬된 배열
key : 탐색하려는 값
반환 return
배열에서 key
값을 찾았을 경우, key
값의 인덱스를 반환
배열에서 key
값을 찾지 못했을 경우, 이 정렬된 배열에 key
값을 넣었을 때 위치할 인덱스의 음수에 -1 한 값을 반환. - (위치할 인덱스) -1