<자료구조>배열(Array)

ming·2023년 3월 15일

자료구조

목록 보기
1/12

배열

  • 많은 수의 데이터를 다룰 때 사용하는 자료구조
  • 각 데이터를 인덱스와 1:1 대응하는 구조
  • 메모리에 연속적으로 저장된다.

장점

  • 인덱스를 이용해 데이터에 빠르게 접근 가능하다.

단점

  • 데이터의 추가/삭제가 번거롭다
    -길이를 정해서 생성해야 한다, 길이 변경할 때마다 새로운 배열을 생성해야함.
    -데이터 삭제 시, 인덱스를 유지하기 위해 삭제된 빈 공간이 유지된다.

선언 & 초기화

int[] num; //선언
int[] num = new int[5]; //int타입의 크기 5인 배열 생성
num[0] = 1; //배열 값 초기화
num[1] = 2;
num[2] = 3;
num[3] = 4;
num[4] = 5;

int[] num = {1, 2, 3, 4, 5}; // 선언과 동시에 초기화

//순차적인 값을 넣을 땐 for문을 이용하면 간편하다
for(int i = 0; i < num.length; i++){  //num.length 는 배열의 길이, 값 개수
	num[i] = i + 1;
}    

출력

int[] num = {1, 2, 3, 4, 5};

System.out.println(num); // [I@7ad041f3
// [I : 배열 integer
// @7ad041f3 : 주소값

변수 출력하듯이 배열변수명만 출력하면 배열의 주소값이 출력된다.
배열의 원소들을 출력하려면 for문을 이용하거나 자바에서 제공되는 Arrays.toString() 메서드를 이용해야 한다.

Arrays 클래스의 모든 메소드는 static 메소드이므로 따로 객체를 생성하지 않고도 바로 사용할 수 있는 특징이 있다.
다만 Arrays 클래스의 메소드를 사용하고 싶다면 상단에 반드시 import 문으로 java.util 패키지를 불러와야 한다.

import java.util.Arrays; // Arrays.toString()을 사용하기 위한 import

class Test{
	public static void main(String[] args) {
        int[] arr = {10, 9, 8, 7, 6};
        
        // for문으로 직접 배열 원소 출력
        for(int i = 0 ; i < arr.length; i++){
            System.out.print(arr[i]+ " "); //10 9 8 7 6
        }
        //forEach로 간단하게 
        for(int i : arr){
        	System.out.print(arr[i]+ " "); 
        }    

        // Arrays.toString() 메서드 사용하여 심플하게 바로 출력
        System.out.println(Arrays.toString(arr)); // [10, 9, 8, 7, 6]
	}
}

다차원 배열

다차원 배열이란 2차원 이상의 배열을 의미하며, 배열 요소로 또 다른 배열을 가지는 배열을 의미한다고 보면 된다.

2차원 배열

선언

1차원 배열은 [] 1번만 썼다, 2차원은 대괄호 [][] 를 쓰면 된다.

int[][] num = new int[2][3]; // 행이 2, 열이 3 인 배열
num[0][1] = 10;
num[0][1] = 20;
num[0][2] = 30;

num[1][0] = 40;
num[1][1] = 50;
num[1][2] = 60;

// 2차원 배열 선언 + 초기화 
int[][] num2 = {
                  {10,20,30},
                  {40,50,60}
                }

출력

성능상 중첩 for문 보단 Arrays.deepToString() 메서드를 사용하는게 좋다.

int[][] num2 = {
                  {10,20,30},
                  {40,50,60}
                }
                
for(int i = 0 ; i < num2.length ; i++) {	// 먼저 행 부분을 순회하고
    for(int j = 0 ; j < num2[i].length ; j++) { // i 행의 열 부분을 순회하며 각 원소를 출력
        System.out.print(num2[i][j]+" ");
    }
    System.out.println(); // 한 행 출력 후 줄바꿈
}
// 10 20 30
// 40 50 60  이렇게 출력된다.
for (int[] itemA : num2){   //배열값 모두 출력할때 foreach문이 용이 
    for(int itemB : itemA){
       System.out.print(itemB + " ");
    }
    System.out.println();
}
//Arrays 를 이용할 때 deepToString()을 사용
System.out.println(Arrays.deepToString(num2)); // [[10, 20, 30], [40, 50, 60]

Arrays 메서드

출력, 복사, 비교, 정렬 등이 있다.
사용하기 위해 import java.util.Arrays; 해야한다.

배열 출력

1차원 배열 -> Arrays.toString()
다차원 배열 -> Arrays.deepToString()

배열 복사

for문 보다 메서드를 이용하는게 거의 두배 정도 빠르게 복사한다고 한다

import java.util.Arrays;

class Test{
	public static void main(String[] args) {
        int[] arr1 = {1, 2, 3, 4, 5};

        int[] arr2 = new int[arr1.length * 2]; // 원래 배열보다 길이가 두배인 새로운 배열을 선언

		// Array.copyOf() 메서드 사용
        //Array.copyOf(복사할 배열명,인덱스값) 복사할 배열의 인덱스 0부터 인덱스값 전까지 복사
        arr2 = Arrays.copyOf(arr1, arr1.length); //arr1 전체 복사
        System.out.println(Arrays.toString(arr2)); // [1, 2, 3, 4, 5]
        //Array.copyOfRange(복사할 배열명,인덱스값1,인덱스값2) 복사할 배열의 인덱스1<= <인덱스2 복사
        arr2 = Arrays.copyOfRange(arr1, 1, 3); // arr1의 인덱스 1,2 복사
        System.out.println(Arrays.toString(arr2)); // [2, 3]
	}
}

배열 비교

두 배열이 같은지 비교할 때, for문으로 순회하며 비교할 수 있지만 Arrays.equals() 메서드를 사용하면 간단하다.
다차원 배열 비교는 Arrays.deepEquals() 를 사용하면 된다.

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        String[] arr1 = { "딸기", "바나나", "키위", "자몽", "망고" };
        String[] arr2 = { "딸기", "바나나", "키위", "자몽", "망고" };
        String[] arr3 = { "배", "포도", "키위", "자몽", "사과" };

        System.out.println(Arrays.equals(arr1, arr2)); // true
        
        System.out.println(Arrays.equals(arr1, arr3)); // false
    }
}

배열 정렬

Arrays.sort() 오름차순으로 정렬된다.

import java.util.Arrays;

class Test{
	public static void main(String[] args) {
        int[] arr = {3, 2, 5, 1, 4};

        // 오름차순 정렬
        Arrays.sort(arr); // 자기 자신 배열을 정렬 시킴 (정렬된 배열을 반환하는 것이 아니다)
        System.out.println(Arrays.toString(arr)); // [1, 2, 3, 4, 5]

        // 내림차순 정렬
        Arrays.sort(arr);
        int[] reversedArr = new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            reversedArr[i] = arr[arr.length - 1 - i];
        }
        System.out.println(Arrays.toString(reversedArr)); // [4,3,2,1,0]

        // 배열 일부부만 정렬
        int[] arr = {3, 2, 5, 1, 4};
        Arrays.sort(arr, 0, 3); // 배열 0<= 인덱스 <3 만 정렬
        System.out.println(Arrays.toString(arr)); // [2, 3, 5, 1, 4]
	}
}
profile
개발 성장 기록

0개의 댓글