배열(array) : 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것 (0~n개)
배열의 선언 : 타입[] 변수이름;
타입[][] 변수이름;배열의 생성 : new 타입[길이];
new 타입[행][열];int[] arr; // 선언
arr = new int[5]; // 생성
for (int i = 0; i < arr.length; i++) // 배열 초기화
arr[i] = i * 10;
int[] arr2 = new int[]{1, 2, 3, 4, 5}; // 배열 선언 + 생성 + 초기화 (new int[] 부분은 생략 가능)
배열은 생성 이후 길이를 변경할 수 없다
→ 저장 공간이 연속적으로 배치되어 있기 때문에 크기를 늘리려고 하면 overrun 발생 가능성이 있다 (보안 문제 가능성 있음)
public static native void arraycopy(
Object src, // 원본 배열
int srcPos, // 원본 배열에서 복사 시작 위치
Object dest, // 대상 배열
int destPos, // 대상 배열에서 붙여넣기 시작 위치
int length // 복사할 요소 개수
);String 클래스는 char 배열에 기능(메서드)을 추가한 것이다
Java String 클래스 주요 메서드
| 메서드 | 설명 | 반환 타입 | 예제 |
|---|---|---|---|
charAt(int index) | 문자열에서 지정된 index의 문자 반환 | char | "hello".charAt(1) → 'e' |
length() | 문자열의 길이(문자 개수) 반환 | int | "hello".length() → 5 |
substring(int beginIndex, int endIndex) | beginIndex부터 endIndex 전까지의 부분 문자열 반환 | String | "hello".substring(1, 4) → "ell" |
equals(Object obj) | 두 문자열이 같은지 비교 (대소문자 구분) | boolean | "hello".equals("Hello") → false |
toCharArray() | 문자열을 문자 배열로 변환 | char[] | Arrays.toString("hi".toCharArray()) → "[h, i]" |
| 구분 | C 언어 | Java |
|---|---|---|
| 저장 방식 | 연속된 메모리 블록 (Row-Major Order) | "배열의 배열" (참조 기반) |
| 메모리 배치 | 모든 행이 연속 저장됨 | 행별로 개별 배열을 가리킴 |
| 메모리 접근 속도 | 빠름 (연속된 메모리) | 상대적으로 느림 (참조 접근) |
| 가변 배열 지원 | 불가능 (고정 크기) | 가능 (각 행의 길이 다름) |
| 주소 출력 | 행과 열이 같은 메모리 블록에 존재 | 각 행이 개별적인 주소를 가짐 |
C : 연속 저장
| 메모리 주소 | 배열 인덱스 |
|---|---|
| 0x1000 | arr[0][0] |
| 0x1004 | arr[0][1] |
| 0x1008 | arr[0][2] |
| 0x100C | arr[1][0] |
| 0x1010 | arr[1][1] |
| 0x1014 | arr[1][2] |
Java : 행별로 개별 배열 참조
arr
| 참조 주소 | 저장된 값 | 배열 인덱스 |
|---|---|---|
| 0x2000 | 0x3000 | arr[0] (참조) |
| 0x2004 | 0x4000 | arr[1] (참조) |
arr[0]
| 메모리 주소 | 저장된 값 | 배열 인덱스 |
|---|---|---|
| 0x3000 | 값 | arr[0][0] |
| 0x3004 | 값 | arr[0][1] |
| 0x3008 | 값 | arr[0][2] |
arr[1]
| 메모리 주소 | 저장된 값 | 배열 인덱스 |
|---|---|---|
| 0x4000 | 값 | arr[1][0] |
| 0x4004 | 값 | arr[1][1] |
| 0x4008 | 값 | arr[1][2] |