[Java] 배열

션션·2026년 1월 28일

Java

목록 보기
2/10
post-thumbnail

1. 배열(Array)의 정의와 특징

배열은 동일한 데이터 타입의 값들을 하나의 묶음으로 관리하는 자료구조입니다.

  • 연속적 저장: 메모리에 데이터가 빈틈없이 연속적으로 배치됩니다.
  • 고정 크기: 한 번 생성된 배열은 크기를 변경할 수 없습니다. (크기 변경 시 새 배열 생성 후 복사 필요)
  • 인덱스 접근: 0부터 시작하는 인덱스를 사용해 요소에 빠르게 접근합니다.

2. 배열의 선언과 초기화

자바에서는 두 가지 선언 방식이 있지만, 첫 번째 방식을 권장합니다.

// 1. 선언 (권장)
String[] names; 

// 2. 생성과 동시에 초기화
String[] st1 = new String[5]; // 기본값(null)으로 초기화된 크기 5의 배열
String[] st2 = {"Apple", "Banana", "Cherry"}; // 선언과 동시에 직접 할당

💡 꿀팁: 배열을 먼저 선언하고 나중에 값을 할당할 때는 st1 = new String[] {"A", "B"};처럼 new 키워드를 반드시 붙여줘야 합니다.


3. 배열의 메모리 구조 (Stack vs Heap)

배열을 제대로 이해하려면 메모리 영역을 알아야 합니다.

  • Stack(스택): 배열의 실제 주소값을 담고 있는 참조 변수가 저장됩니다.
  • Heap(힙): new 연산자로 생성된 실제 데이터 객체가 저장되는 공간입니다.

참조형 배열(String 등)의 특이점

int[] 같은 기본형 배열은 힙에 실제 숫자가 저장되지만, String[] 배열은 힙 영역에 문자열 객체들의 주소값을 담습니다. 즉, 2단계의 참조 구조를 가집니다.


4. 배열의 순회와 출력

배열의 모든 요소를 확인할 때 사용하는 방법들입니다.

① 일반 for문 (값 수정 가능)

for (int i = 0; i < arr.length; i++) {
    arr[i] = i * 10; // 인덱스를 이용해 값 수정 가능
}

② 향상된 for문 (for-each, Read-Only)

for (int x : arr) {
    System.out.println(x); // 가독성이 좋지만, 값을 직접 수정할 수는 없음
}

③ Arrays.toString()

반복문 없이 한 줄로 배열 내용을 출력하고 싶을 때 유용합니다.
System.out.println(Arrays.toString(arr)); // 출력: [1, 2, 3]


5. 얕은 복사 vs 깊은 복사

구분설명특징
얕은 복사 (Shallow)주소값만 복사복사본을 수정하면 원본도 함께 변함
깊은 복사 (Deep)새로운 메모리 공간에 값 복제원본과 복사본이 독립적
  • 깊은 복사 방법: Arrays.copyOf(원본, 길이) 또는 System.arraycopy() 사용

6. 다차원 배열 (2차원 이상)

2차원 배열은 '배열을 요소로 가지는 배열'입니다.

int[][] arr = new int[2][3]; // 2행 3열의 행렬 구조

🧐 여기서 퀴즈! (자주 틀리는 개념)

Q: 2차원 배열에서 for-each문으로 값을 수정하면 반영될까?

for(int[] a : arr4) {
    a[0] = 100; // 결과: 원본 배열의 값이 바뀐다!
}

A: 예, 바뀝니다. int[] a는 행 자체를 가리키는 참조 변수이기 때문에, a[0]을 수정하는 것은 실제 힙 영역에 있는 메모리 주소를 찾아가 값을 바꾸는 것과 같습니다. (1차원 배열의 int x가 값을 직접 복사해오는 것과는 다릅니다.)


7. 실습 팁: char 입력받기

Scanner에는 nextChar()가 없기 때문에 아래와 같이 사용합니다.

char c = sc.next().charAt(0);
  • 왜 char를 쓰나요? String은 객체라 메모리를 많이 먹지만, char는 2바이트 기본형이라 대용량 데이터를 다룰 때 훨씬 빠르고 효율적입니다.

0개의 댓글