[Java] 배열

배창민·2025년 9월 9일
post-thumbnail

자바 배열


1) 배열 개요

정의

  • 같은 자료형 값들의 연속 메모리 묶음.
  • newheap에 생성, 길이는 고정, 0부터 인덱스로 접근.

왜 쓰나

  • 변수 난립 방지, 반복문과 찰떡. 합계/검색/집계에 유리.

2) 1차원 배열

선언/할당/초기화

// 선언
int[] a;        // 권장
int b[];        // 가능

// 할당
a = new int[5]; // 0으로 자동 초기화

// 선언 + 할당
int[] c = new int[10];

// 리터럴 초기화
int[] d = {1, 2, 3};
int[] e = new int[] {1, 2, 3};

// 길이
int n = c.length;

반복/합계/입출력

int[] arr = {10,20,30,40,50};

// for
int sum = 0;
for (int i = 0; i < arr.length; i++) sum += arr[i];

// 향상 for (값 **수정은 불가**)
for (int v : arr) System.out.println(v);

기본값(자동 초기화)

  • 정수: 0, 실수: 0.0, 논리: false, 문자: '\u0000', 참조: null

arr == null 상태에서 arr.length 접근 → NullPointerException


3) 2차원 배열 (다차원)

선언/할당

// 정변 배열 (모든 행 길이 동일)
int[][] m1 = new int[3][5];

// 가변 배열 (행별 길이 다름)
int[][] m2 = new int[3][];
m2[0] = new int[3];
m2[1] = new int[2];
m2[2] = new int[5];

// 리터럴 초기화
int[][] m3 = {
  {1,2,3,4,5},
  {6,7,8,9,10},
  {11,12,13,14,15}
};

순회(중첩 반복)

for (int i = 0; i < m1.length; i++) {
  for (int j = 0; j < m1[i].length; j++) {
    System.out.print(m1[i][j] + " ");
  }
  System.out.println();
}

4) 배열 복사

얕은 복사 (Shallow Copy)

  • 주소만 복사같은 배열을 가리킴.
int[] a = {1,2,3};
int[] b = a;      // 얕은 복사
b[0] = 99;
System.out.println(a[0]); // 99 (서로 영향)

깊은 복사 (Deep Copy)

  • 값을 복제별도 배열, 상호 영향 없음.
int[] src = {1,2,3,4,5};

// 1) for
int[] c1 = new int[10];
for (int i = 0; i < src.length; i++) c1[i] = src[i];

// 2) clone (같은 길이)
int[] c2 = src.clone();

// 3) System.arraycopy(원본, 원본시작, 대상, 대상시작, 길이)
int[] c3 = new int[10];
System.arraycopy(src, 0, c3, 3, src.length);

// 4) Arrays.copyOf(원본, 새길이)
int[] c4 = java.util.Arrays.copyOf(src, 7);

성능: arraycopy 고성능 / 편의성: copyOf 선호 / clone같은 길이만.


5) 실전 스니펫

카드 뽑기

String[] suits = {"SPADE","CLOVER","HEART","DIAMOND"};
String[] ranks = {"2","3","4","5","6","7","8","9","10","JACK","QUEEN","KING","ACE"};

int si = (int)(Math.random() * suits.length);
int ri = (int)(Math.random() * ranks.length);

System.out.println(suits[si] + " " + ranks[ri]);

점수 합/평균

int[] scores = new int[5];
java.util.Scanner sc = new java.util.Scanner(System.in);
for (int i = 0; i < scores.length; i++) {
  System.out.print((i+1) + "번 점수: ");
  scores[i] = sc.nextInt();
}
double sum = 0;
for (int s : scores) sum += s;
System.out.println("sum=" + sum + ", avg=" + sum / scores.length);

6) 자주 하는 실수 & 팁

  • ArrayIndexOutOfBoundsException : 인덱스 범위 확인(0 ~ length-1).

  • 가변 2차원은 각 행을 별도 할당해야 함.

  • 값 변경은 향상 for로 불가 → 인덱스 for 사용.

  • 유틸:

    • Arrays.toString(arr), Arrays.deepToString(mat)
    • Arrays.fill(arr, val)
    • Arrays.sort(arr)
profile
개발자 희망자

0개의 댓글