도도한 개발자
[Java] #07. 배열의 모든 것 본문
배열은 한 가지 타입에 대해서, 하나의 변수에 여러 개의 데이터를 저장할 수 있다. 자바에서 기본 자료형의 배열은 다음과 같이 선언할 수 있다.
int [] array ;
int array [];
이렇게 대괄호를 열고 닫음으로써 해당 변수가 배열이라는 것을 정의할 수 있다. 주의할 점은, 배열 변수를 정의할 때 대괄호 안에는 아무것도 써주면 안 된다. 이렇게 선언한 배열엔 아직 몇 개의 데이터가 들어가는 지 알 수 없기 때문에 다음과 같이 초기화를 해줘야 한다.
int [] array = new int[7];
배열도 참조 자료형이기 때문에 신규로 생성시 new를 붙여햐야 한다. 선언을 먼저 한 후 초기화를 하고 싶은 경우
int [] array;
array = new int[7];
이렇게 선언해도 좋다.
이제 배열에 값을 지정해야한다. 배열에 값은 다음과 같이 저장할 수 있다.
array[1] = 15;
이렇게 하면 array 배열의 두 번째 자리에 15라는 값을 지정해준다. 대괄호 안은 index라고 하고 index는 0부터 시작하기 때문에 1은 두번째 자리이기 때문이다.
array 배열에 임의의 값을 저장하는 코드를 작성해보자.
public class Array1 {
public void init() {
int [] array = new int[7];
array[0] = 4;
array[1] = 13;
array[2] = 21;
...
array[6] = 43;
array[7] = 7;
}
}
이렇게 작성하고 main()메소드에서 init()메소드를 실행하도록 컴파일 하면 어떻게 될까? 컴파일은 잘 될 것이다. 그러나 ArrayIndexOutOfBoundsException이라는 예외가 발생할 것이다. array 배열은 0부터 6까지 7개의 공간이 있는데 array[7]과 같이 존재하지도 않는 자리에 값을 할당하려고 했기 때문이다. ArrayIndexOutOfBoundsException예외문은 배열에 값을 할당할 때도 발생하지만 값을 참조할 때에도 발생한다.
모든 참조 자료형은 초기화를 하지 않으면 'null'이다. String이나 클래스 객체들은 초기화 하지 않으면 다음과 같이 null을 출력한다.
string[0] = null
array[0] = null
이와 같이 null을 출력하지 않고록 하려면 배열의 각각의 값을 초기화해야만 한다. null이 출력된다고 해서 'null'이라는 문자열 값이 저장되어 있는 것이 아니다. 자바에서 null이라는 것은 무소유의 개념이라고 보면 된다. 이무 값도 설정되지 않고 초기화도 안되어 있는 상태인 것인다. 따라서 배열과 같은 참조 자료형을 선언할 때 명시적으로 무소유의 상태임을 나타내기 위해서 다음과 같이 선언할 수 있다.
String[] strings = null;
이와 같이 각 배열은 크기를 지정하여 배열 객체를 초기화만 하면 기본값이 지정되며, 참조 자료형 배열의 각각의 값은 반드시 각각의 값을 초기화해 줘야만 null이 되지 않는다.
* 배열을 선언하는 다른 방법
지금까지는 new라는 예약어를 사용하여 타입과 크기를 지정해서 배열을 선언했다. 그런데 중괄호를 사용하면 한번에 배열을 선언할 수 있다.
public class ArrayInitialize {
public static void main(String args[]) {
ArrayInitialize array = new ArrayInitialize();
array.otherInit();
}
public void otherInit() {
int[] array1 = {4, 13, 21, 37, 43};
}
}
배열을 선언과 함께 초기화하려면 이처럼 '중괄호 안에 각 위치에 해당하는 값들을 콤마로 구분하여 나열'하면 된다. 하지만 모든 배열에 들어가는 값들이 이렇게 처음부터 정할 수 잇는 상황이 되지 않는다. 배열에 들억나느 값이 계속 바뀔 수도 있고 언제들지 변경이 가능하기 때문에 보통 '절대 변경되지 않는 값'을 지정할 때 이렇게 중괄호로 선언하여 사용한다.
String[] month = {"January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December"};
* 2차원 배열
public void array2() {
int[][] twoDim;
twoDim = new int[2][3];
}
2차원 배열은 배열의 배열을 의미한다. 1차원 배열같이 선언했다면 twoDim[0]는 int 값이지만 2차원 배열에선 twoDim[0]은 배열이다. 즉, twoDim[0][0]의 값이 int 값이다.
배열의 개수는 (1차원 개수) x (2차원 개수)로 계산한다. 그리고 2차원 배열은 다음과 같이 선언할 수도 있다.
twoDim = new[2][];
1차원의 크기만 지정하고 2차원의 크기를 지정하지 않을 수도 있지만, 1차원을 지정하지 않고 2차원 배열만 지정한다거나 둘 다 빈 공간으로 남겨두면 컴파일 에러가 발생한다.
* 배열의 길이
배열의 길이는 간단한다. (배열 이름).length 를 쓰면 int타입으로 된 배열 크기를 리턴해 준다.
* 실습
키를 관리하는 ManageHeight라는 클래스를 만들고 main() 메소드도 만들자. 반 학생들의 키를 번호 순서대로 출력하는 메소드를 만들고 출력. 각 반별 키의 평균을 계산하여 출력하는 메소드를 만들고 출력.
public class ManageHeight {
int[][] gradeHeights;
public static void main(String[] args) {
ManageHeight manage = new ManageHeight();
manage.setData();
for(int i = 1; i <= 5; i++) {
//manage.printHeight(i);
manage.printAverage(i);
}
}
public void setData() {
gradeHeights = new int[5][];
gradeHeights[0] = new int[] {170, 180, 173, 175, 177};
gradeHeights[1] = new int[] {160, 165, 167, 186};
gradeHeights[2] = new int[] {158, 177, 187, 176};
gradeHeights[3] = new int[] {173, 182, 181};
gradeHeights[4] = new int[] {170, 180, 165, 177, 172};
}
public void printHeight(int classNo) {
System.out.println("Class No : " + classNo);
for(int data : gradeHeights[classNo - 1]) {
System.out.println(data);
}
}
public void printAverage(int classNo) {
double avg = 0;
for(int data : gradeHeights[classNo - 1]) {
avg += data;
}
System.out.println("Class No.: " + classNo);
System.out.println("Height average : s" + avg / gradeHeights[classNo - 1].length);
}
}
* 정리
배열을 선언할 때 어떤 키워드를 타입 앞이나 뒤에 사용해야 하나요?
배열을 선언할 때에는 대괄호 [ ] 를 사용해야 한다.
배열의 첫번째 위치는 0인가요? 1인가요?
배열의 위치는 0부터 시작한다.
배열을 선언할 때 boolean 배열의 크기만 지정했다면 boolean배열의 [0] 위치에 있는 값은 무엇인가요?
숫자 배열의 초기 값은 0, boolean 배열의 초기 값은 false이다.
ArrayIndexOutOfBoundsException이라는 것은 언제 발생하나요?
ArrayIndexOutOfBoundsException 은 배열의 범위를 벗어난 위치를 참조하려고 할 때 발생한다. 즉, 10자리 배열에 12번째 위치를 참조하려는 경우에 발생한다.
중괄호를 이용하여 배열을 초기화할 때 중괄호 끝에 반드시 어떤 것을 입력해 주어야 하나요?
중괄호를 이용하여 배열을 선언할 때, 중괄호를 닫은 다음에 반드시 세미콜론 ; 을 입력해야만 한다.
2차원 배열을 정의할 때에는 대괄호를 몇 개 지정해야 하나요?
2차원 배열을 지정할 때에는 대괄호를 2개 지정한다.
배열을 쉽게 처리해주는 for문의 문법은 어떻게 되나요?
배열을 처리하는 for 루프는 다음과 같이 사용할 수 있다.
int[] a;로 선언되어 있는 배열은,
for(int data:a) {
...
}
와 같이 콜론을 사용하여 사용 가능하다.
자바 프로그램이 데이터를 전달해 주려면 클래스 이름 뒤에 어떻게 구분하여 나열하면 되나요?
main() 메소드의 String args[] 라는 매개변수는 java명령 실행시 클래스 이름 뒤에 나열된 값을 취한다.
예를 들어 ArrayTest라는 클래스가 시작하면서 값을 전달하려면
java ArrayTest a b c
와 같이 사용 가능하며, ArrayTest클래스의 main() 메소드의 매개변수인 args[] 배열의 0,1,2 위치에 있는 배열은 각각 a,b,c의 값이 할당된다.
자바 프로그램이 시작할 때 전달 받는 내용은 어떤 타입의 배열인가요?
String의 1차원 배열로 값이 전달된다.
그럼 이만.
'Backend > Java' 카테고리의 다른 글
[Java] #09. 패키지와 접근 제어자 (0) | 2022.03.14 |
---|---|
[Java] #08. 참조 자료형 (0) | 2022.03.14 |
[Java] #06. 자바의 제어문 (키워드 : 조건) (0) | 2022.03.10 |
[Java] #05. 자바의 연산자 (0) | 2022.03.10 |
[Java] #04. 자바의 변수들 (0) | 2022.03.10 |