배열이란?
같은 타입의 여러 변수를 연속된 유한한 하나의 묶음으로 다루는 자료 구조.
배열의 사용
int[] score1; // 배열 선언 1 (추천)
int score2[]; // 배열 선언 2
score1 = new int[5];//배열 생성
int[] score3 = new int[] {1,2,3,4,5}; //선언과 동시에 초기화
int[] score4 = {1,2,3,4,5}; // 선언과 동시에 초기화시 생성 명령어 생략 가능
score2 = {1,2,3,4,5}; // 선언 이후에 생성 명령어 생략 -> 불가능
배열을 선언하는 방법은
- 타입[] 변수이름
- 타입 변수이름[]
두가지 방법이 있으며 1번의 방식이 일반적으로 사용된다.
배열은 선언시에 메모리에 공간이 할당되는것이 아니다.
선언시에는 배열의 맨 처음 요소의 주소가 참조될 공간이 변수로 할당된다.
배열의 생성시에는 new 메소드를 사용한다.
생성시에는 길이를 반드시 지정해줘야하며 길이가 0인 배열도 생성할 수 있다.
배열을 선언과 동시에 초기화 할때는 {}를 사용해 편하게 할 수 있다.
이 경우 길이를 지정하지 않아도 되며
new 생성 메소드를 생략도 가능하다.
당연하게도 선언 이후에 생성 메소드를 생략하고 초기화 하려 할 경우 오류가 발생한다.
함수의 매개변수로 배열을 사용할때 주의하자.
배열의 인덱스와 길이
int[] score = {1,2,3,4,5};
System.out.println(score[0]); // 1
System.out.println(score[5]); // ArrayIndexOutOfBoundsException! (index는 0부터 4까지)
System.out.println(score.length); // 5
배열이름 뒤의 대괄호[] 안에 정수를 넣어 배열내 요소에 접근 가능하다.
들어가는 정수를 index라고 하며, 범위는 0부터 시작해 배열 길이 -1까지이다.
유효하지 않은 범위의 숫자를 넣을경우 런타임에러 ArrayIndexOutOfBoundsException가 발생한다.
JVM은 모든 배열의 길이를 별도로 관리해 배열이름.length로 길이 값을 받을 수 있다. (함수가 아님에 주의하자)
배열의 길이는 변경하는 것이 불가능한 상수이다.
배열의 복사
int[] score = {1,2,3,4,5};
int tmp = new int[10];
for (int i; i < score.length; i++){
tmp[i] = score[i];
}
score = tmp;
//score의 기존 배열 주소값 위에 tmp의 주소 복사
만약 기존 배열의 길이가 부족해서 길이를 두 배로 늘려야한다면?
한 번 선언한 배열의 길이는 바꿀 수 없다.
길이가 두배인 배열을 새로 생성 한 후 기존 내용을 복사한다.
이후 기존 배열의 변수에 새로운 배열을 복사하면 주소값만 바뀌게 된다.
이때 더 이상 참조하지 않는 쓸모없어진 기존 배열은 가비지 컬렉터가 자동으로 제거한다.
String 배열
String[] name = new String[3];
//참조형 변수의 기본값 = null → null이 3개 들어있는 배열 생성
String[] name = {”kim”, “park”, “lee”};
// 이 경우 실제로는 String 객체의 주소값 3개가 담긴 배열이 생성됨
String을 포함한 객체 배열도 선언해 사용할 수 있다.
참조형 변수로 객체를 만들면 객체 안에는 참조할 곳의 주소가 들어간다.
char 배열과 String 클래스?
String 클래스가 char 배열에 기능 추가해 확장한 것이다.
String 객체는 내용을 변경할 수 없다.
(변경시 새로운 문자열 생성후 반환한것이다.)
char 배열은 내용 변경이 가능하다.
String.toCharArray(), new String(char[]) 이용해서 서로 변환이 가능하다.
다차원 배열
- 타입[][] 변수이름
- 타입 변수이름[][]
- 타입[] 변수이름[]
3가지 방법으로 모두 선언이 가능하다.
2차원 배열의 경우 1차원 배열의 주소를 담고있는 배열을 생성한다.
2차원 이상의 배열은 주소만 저장하는 배열로 구성된다.
따라서 가변적인 배열 생성이 가능하다.
'JAVA' 카테고리의 다른 글
JAVA의 정석 정독하기 #7 - 상속과 다형성 (1) | 2023.11.12 |
---|---|
JAVA의 정석 정독하기 #6 - Class (1) | 2023.11.11 |
JAVA의 정석 정독하기 #4 - 조건문과 반복문 (0) | 2023.10.22 |
JAVA의 정석 정독하기 #3 - 연산자 (0) | 2023.10.07 |
JAVA의 정석 정독하기 #2 - 변수 (0) | 2023.10.03 |