▶ 배열
- 변수는 하나의 공간에 하나의 값을 담을 수 있지만 배열은 하나의 공간에 여러개의 값을 담을 수 있다. (같은 자료형의 값으로만 가능하다.)
정확히 이야기하자면 배열의 각 인덱스 자리에 실제 값이 담긴다. (인덱스는 항상 0부터 시작한다.)
int[] a = new int[3]; // int 형의 자료가 들어갈 수 있는 방을 3개 만든다.
- 한번 지정한 배열의 크기는 변경이 불가능하다.
=> 배열의 크기를 변경해서 더 많은 값을 넣고자한다면 어쩔 수 없이 새로운 배열을 만들어줘야한다.
- 항상 고유한 주소값 부여하며 기존에 생성된 주소와 절대로 겹치지 않으며 기존에 참고하고 있던 연결이 끊기고 새로운 곳을 참조한다.
- 연결이 끊어진 기존의 배열은 heap영역 안에 둥둥 떠다니고 일정시간이 지나면 가비지 컬렉터(GC)가 삭제시켜준다.
=> 자동 메모리 관리
※ 자바에서 자동메모리 관리 특징 => 개발자가 코드에만 신경쓸 수 있게 도와준다.
1. 배열 선언
[표현법] => 선언 방법이 여러가지
1) 자료형 [] 변수명;
2) 자료형 변수명 [];
ex)
int a; // 변수 선언
int [] arr; // 배열 선언
int arr []; // 배열 선언
※ 선언된 배열의 저장위치 : stack
1. 배열 할당
[표현법]
배열명 = new 자료형[배열크기];
- 이 배열에 몇 개의 값들을 보관할건지 배열의 크기를 지정해주는 과정이 필수이다.
- 지정한 개수만큼 값이 들어갈 수 있는 방(인덱스)가 만들어진다.
ex) arr = new int[5];
※ 할당된 배열의 저장위치 : heap
3. 배열의 각 인덱스(방번호) 자리에 값을 대입
[표현법]
배열명[인덱스] = 값;
ex)
arr[0] = 0;
arr[1] = 1;
arr[2] = 2;
...
arr[n] = x;
■ 배열은 왜 사용해야 할까?
장점 : 반복문을 활용할 수 있다.
- 변수를 이용하면 각각의 데이터를 보관하고자 할 때 각각의 변수를 만들어서 따로 관리해야한다.
- 이때 저장된 값들을 출력하고자 할 때 반복문 사용 불가능하다.
단점 : 크기를 바꿀 수 없다.
■ 배열의 주소값
arr이라는 배열을 생성해보자
int[] arr = new int[];
System.out.println(arr); // 16진수 주소값
System.out.println(arr.hashCode()); // 10진수 주소값
arr을 출력해보면 16진수의 주소값이 출력되고,
arr.hashCode()를 사용하면 10진수의 주소값이 출력된다.
※ 만약 16진수의 주소 값이 [I@587d1d39 일 때 여기서 [는 배열이라는 의미이며 I는 int 자료형이라는 의미이고 @는 주소값과 앞에 의미들을 구분해주는 역할을 한다.
■ 기본 자료형과 그 외 모든 자료형
기본자료형 (boolean, char, byte, short, int, long, float, double)
- 실제 값(리터럴)을 바로 담을 수 있는 변수 => 일반변수
그 외 모든 자료형(int[], double[], short[], .. String, Scanner, ...)
- 주소값을 담고 있는 변수 => 참조변수(레퍼런스 변수)
(각 자료형의 기본값)
- double = 0.0
- int = 0
- char = ' '
- boolean = false
- String = null
■ 배열 특징
1. 아래 코드와 같이 배열 선언 후 크기(3)만 지정한 상태일 때 각각의 인덱스 값을 초기화 하지 않아도 값들이 담겨져 있다.
이는 jvm이 담아준 것 인데 heap이라는 영역에 절대로 빈공간이 존재할 수 없기 때문에 jvm이 각 공간에 자료형의 기본값으로 초기화(대입)를 해준 것이다.
※ 이때 담긴 기본 값들은 0 이다.
int[] arr = new int[3];
for(int i = 0; i < 3; i++) { // 0, 1, 2
System.out.println(arr[i]); // 0 0 0
}
2. 기본값이 null인 변수를 가지고 메서드를 호출한다거나 특정 어딘가에 접근하고자 한다면 무조건 오류발생
=> NullPointerException
ex) arr.hashcode(), arr.length, arr[0]...
※ 주소값을 담을 수 있는 변수의 기본값은 null;
3. 현재 연결되어 있는 연결고리를 끊고자 할 때는 아래 코드와 같이 입력해주면 된다.
arr = null;
이때 null 아무것도 존재하지 않음을 의미한다.
■ ArrayIndexOutOfBoundsException
배열의 인덱스 범위를 벗어난 오류라는 뜻이다.
예를 들어 아래 코드에서 arr를 출력해보면 ArrayIndexOutOfBoundsException오류가 발생한다.
왜냐하면 길이 5짜리 배열에는 5라는 인덱스가 존재하지 않기 때문이다.
int[] arr = new int[5];
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
arr[3] = 4;
arr[4] = 5;
arr[5] = 6; // 오류
'JAVA' 카테고리의 다른 글
JAVA(12) 2차원 배열 (0) | 2023.03.31 |
---|---|
JAVA(11-2) 배열 복사 (0) | 2023.03.30 |
JAVA(10-2) 분기문(continue) (0) | 2023.03.29 |
JAVA(10-1) 분기문(break) (0) | 2023.03.29 |
JAVA(9-2) 반복문(while) (0) | 2023.03.29 |