Dev/Java

[Java] 배열

syuare 2025. 4. 18. 20:19

배열

비슷한 주제의 데이터를 하나의 그룹으로 묶어서 표현하는 방법

  • 같은 종류의 데이터를 여러 개 저장할 수 있는 상자.

배열 왜 쓸까?

변수를 관리해야할 때, 관리해야할 데이터의 수가 엄청 많을 경우 유지 보수가 복잡해진다.

(특정 몇 번째 데이터를 확인하기가 쉽지 않다.)

 

이러한 데이터를 편하게 관리하기 위해 배열을 사용한다.

  • 데이터를 편리하게 관리하기 위해 사용
  • 모든 자료형의 종류로 배열 생성 가능

배열의 특징

  • 한 배열에는 한가지 타입(int, String, 객체 등)만 사용된다.
  • 배열을 한 번 선언하면 배열 길이가 정해진다. (이후 변경 불가능하다)
  • 인덱스로 요소 접근: 배열의 요소를 확인하려면 인덱스를 사용해야한다. 인덱스는 0번 부터 시작한다.

배열 선언

자료형[] 변수이름 = new 자료형[배열의길이]; // 배열선언
더보기
public class Main {
    public static void main(String[] args) {
        // 1. 배열 선언
//        int[] arr;

        // 2. 배열 길이 할당
//        arr = new int[5];
        // arr = [] [] [] [] []

        // 3. 배열 선언과 길이 동시에 할당
//        int[] arr = new int[5];
        // arr = [] [] [] [] [] <- 빈공간

        // 4. 배열 선언과 동시에 배열의 요소 할당
        int[] arr = {10,20,30,40,50};
        // arr = [10] [20] [30] [40] [50]

        // 배열의 길이
        int arrLength = arr.length;
        System.out.println("arrLength = " + arrLength); // 5

    }
}

 

배열의 요소에 접근하려면 index(인덱스)를 활용해야한다.

  • index는 0부터 시작이다. 
    • 0 index = 1번째 요소
    • 1 index = 2번째 요소
// 배열의 요소에 접근: 인덱스 활용 방법
int[] arr = {10,20,30,40,50};
//   index > [0][1][2][3][4]

System.out.println("배열의 1번째 요소 접근: " + arr[0]);
System.out.println("배열의 2번째 요소 접근: " + arr[1]);
System.out.println("배열의 3번째 요소 접근: " + arr[2]);
System.out.println("배열의 4번째 요소 접근: " + arr[3]);
System.out.println("배열의 5번째 요소 접근: " + arr[4]);

index 사용 시 주의할 점

- 배열의 범위에 벗어난 요소에 접근할 경우 오류가 발생한다!

 


더보기

Index(인덱스)가 무엇일까?

 

배열 등 연속된 자료 구조에서 각 요소가 물리적/논리적으로 어디에 위치해 있는지 알려주는 번호

 

Java에서 배열은 연속된 메모리 공간을 할당받음

 

예시 아래와 같이 배열을 선언할 경우 

int[] a = new int[4];
  • a 배열의 메모리 주소를 1000 이라는 곳으로 할당 받았다고 하면 > 아래와 같은 방식의 메모리 주소에 저장된다고 함
  • a[0] > 1000
  • a[1] > 1000 + 4byte
  • a[2] > 1000 + 8byte 
실제 메모리 주소 = 배열의 시작 주소 + (Index × 요소의 크기)

// 요소의 크기: int = 4byte, double = 8byte ...

 

 Index는 왜 0부터 시작할까?

위의 실제 메모리 주소의 수식처럼 Index가 1부터 시작되었다면 (배열 시작 주소 + 요소의 크기) 가 되기 때문에

앞서 말한 배열 a의 메모리 주소는 1000부터 시작한다고 했는데 1부터 시작하면 1004부터 시작한다고 계산이 된다.

 

그렇기 때문에 0-based indexing을 채택한 것!

- 이건 Java 외에도 C나 JS 등 많은 언어에서 이 방식을 채택함!


구분 문법 예시 설명
선언 int[] a;
String b[];
배열 변수 이름만 만들기
생성 a = new int[5]; 길이 5짜리 배열 객체 생성
초기화 int[] c = {1,2,3}; 값을 지정하며 배열 생성
접근 c[0], c[1] = 10; 인덱스로 읽기/쓰기
길이 c.length 배열의 크기(원소 개수)

2차원 배열

말 그대로 2차원적인 정보 표현할 때 적합

  • 1번째 인덱스 = 행 = 가로 방향
  • 2번째 인덱스 = 열 = 세로 방향

예시: 좌표, 위치 정보(x,y) 등

boolean[][] board = new boolean[2][4];
// [] [] [] []
// [] [] [] []
더보기
boolean[][] board = {
	{true, false},
	{false, true}
};

System.out.println(board[0][0]);
System.out.println(board[0][1]);

배열을 사용해보자 

1. 배열을 활용한 for문

int[] arr = {100, 200, 300, 400, 500}

// 배열 탐색
for (int i = 0; i<arr.length; i++){
    // i=0; i<5; i++
    // i=1; i<5; i++
    // ...
    // i=5; i<5; > i가 5보다 작지 않기 때문에 반복문 멈춘다.
    System.out.println("인덱스: " + i + ", 값: " + arr[i]);
}

향상된 for 문 

index를 다루지 않는다

> IndexOutOfBoundsException 에러가 발생하지 않는다.

 

for(배열의요소 : 배열) {
		명령문;
}
더보기
int[] arr = {100, 200, 300, 400, 500}

for (int a : arr) {
	System.out.println("값: " + a);
}

 

 

 

Appendix. 실습

더보기

배열 내 짝수 요소만 출력할 것

public class EvenNumberFinder {
    public static void main(String[] args) {

        int[] arr = {3,4,7,10,15,20};

        System.out.print("짝수: ");
        for(int i = 0; i < arr.length; i++){
            if (arr[i]%2==0) {
                System.out.print(arr[i] + " ");
            }
        }

    }
}

1차원 정수 배열 요소들의 누적합

public class PrefixSum {
    public static void main(String[] args) {
        int[] arr = {2,5,8};
        int a = 0;

        for (int i=0; i<arr.length; i++){
            a += arr[i];
        }
        System.out.println("배열 요소들의 누적합: " + a);

    }
}

 

 

2차원 배열 > 2x2 바둑판에서 흑돌의 좌표를 구하시오

public class BlackStoneFinder {
    public static void main(String[] args) {
        //검은돌(true) 좌표(x,y) 찾기

        //배열 board 선언 + 요소 할당
        boolean[][] board = {
                {true, false},
                {false, true}
        };

        // 클래식 for문
        System.out.println("====클래식 for문====");
        for (int x = 0; x < board.length; x++) {
            for (int y = 0; y < board[x].length; y++) {
                if (board[x][y]) {
                    System.out.println("검은돌 위치: (" + x + "," + y + "), "+ "값: " + board[x][y]);
                }
            }
        }

        // 향상된 for문
        System.out.println("====향상된 for문====");

        int a = 0;

        for (boolean[] row : board){
            int b = 0;
            for (boolean cell : row){
                if(cell) {
                    System.out.println("검은돌 위치: (" + a + "," + b + "), "+ "값: " + cell);
                }
                b++;
            }
            a++;
        }
        
        
    }
}

 

'Dev > Java' 카테고리의 다른 글

[Java] Enum  (0) 2025.04.22
[Java] double 형 값의 소수점 처리  (0) 2025.04.21
[Java] next() vs nextLine()  (0) 2025.04.17
[Java] 제어문(조건문)  (0) 2025.04.16
[Java] 연산자  (0) 2025.04.15