배열 Array


  • 배열은 동일한 데이터 타입을 가진 원소들이 연속된 메모리에 저장되는 자료구조입니다.

  • 인덱스를 이용해 원소에 접근할 수 있어 데이터를 효율적으로 관리할 수 있습니다.

  • 배열은 프로그래밍에서 가장 기본이 되는 자료구조 중 하나이며, 다양한 알고리즘 문제에서 사용됩니다.



배열 Array 의 구조


  • 크기가 고정되어 있습니다

  • 연속된 메모리 공간에 저장됩니다.

  • 각 원소는 인덱스를 이용해 접근할 수 있습니다. 인덱스는 0부터 시작합니다.

  • 배열의 크기는 선언할 때 지정하며, 이후에 크기를 변경할 수 없습니다.



배열 Array 의 기본 연산


  • 배열은 다음과 같은 기본 연산을 지원합니다.

    • 원소 추가: 배열의 끝에 새로운 원소를 추가할 수 있습니다.

    • 원소 삭제: 배열에서 특정 원소를 삭제할 수 있습니다.

    • 원소 검색: 배열에서 특정 원소를 검색할 수 있습니다.

    • 정렬: 배열을 정렬할 수 있습니다.



다차원 배열


  • 다차원 배열은 배열의 원소가 배열인 경우를 말합니다.

  • 예를 들어, 2차원 배열은 배열의 원소가 1차원 배열인 경우입니다.

  • 다차원 배열을 이용해 행렬, 이미지 등을 표현할 수 있습니다.



배열의 활용 예


  • 배열은 다양한 상황에서 사용됩니다. 예를 들어, 데이터를 관리할 때, 이미지나 행렬 등을 처리할 때, 그리고 다른 자료구조를 구현할 때 사용됩니다. 또한, 배열을 이용해 알고리즘 문제를 풀 수 있습니다.


배열의 장단점


  • 배열의 장점

    • 원소에 빠르게 접근할 수 있습니다.

    • 메모리 상에서 연속된 공간을 차지하므로 캐시 지역성을 가지고 있어 접근 속도가 빠릅니다.

    • 구현이 간단합니다.

  • 배열의 단점

    • 크기가 고정되어 있으므로 크기를 변경할 수 없습니다.

    • 원소를 삭제하면 다른 원소들의 인덱스가 변경되어야 합니다.

    • 배열의 중간에 원소를 추가하려면 추가할 위치 이후의 모든 원소를 이동해야 합니다.



배열과 연결리스트의 차이점


  • 배열과 연결리스트는 모두 데이터를 저장하는 자료구조입니다.

  • 하지만, 두 자료구조는 다음과 같은 차이점이 있습니다.

    • 크기: 배열은 크기가 고정되어 있으며, 연결리스트는 크기가 가변적입니다.

    • 메모리 구조: 배열은 연속된 메모리 공간을 사용하며, 연결리스트는 포인터를 이용해 연결된 노드들로 구성됩니다.

    • 원소 접근: 배열은 인덱스를 이용해 원소에 접근할 수 있으며, 연결리스트는 순서대로 노드를 탐색해야 합니다.

    • 원소 추가/삭제: 배열은 중간에 원소를 추가/삭제하면 다른 원소들의 인덱스가 변경되어야 하며, 연결리스트는 새로운 노드를 추가/삭제할 수 있습니다.

  • 결론

    • 배열과 연결리스트는 각각 장단점이 있으므로 상황에 맞게 선택해야 합니다.


배열 선언, 요소


배열의 선언

  • Java에서 배열을 생성하려면 먼저 배열의 유형을 선언한 다음 배열 이름, 그리고 대괄호 안에 크기를 지정합니다.
// 배열의 선언
// 크기가 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를 반환합니다.

  • 이 메소드는 ArrayList로 래핑하여 ArrayList처럼 다룰 수 있도록 합니다.

  • 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() 메소드는 두 개의 배열이 같은지 비교합니다.

  • 메소드는 두 개의 인자 a1a2를 받으며, 각 인자는 객체 배열입니다.

  • 메소드는 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() 메소드는 배열의 모든 요소를 지정된 값으로 설정합니다.

  • 메소드는 두 개의 인자 aval을 받습니다. 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

profile
real.great.code

0개의 댓글