배열 생성
배열을 만드는 방법은 몇 가지 방법은 아래와 같다.
(1) 선언과 동시에 빈 배열 생성
int[] intArray = new int[5]; // 크기 5의 빈 배열
(2) 선언 후, 배열 생성
int[] intArray;
intArray = new int[5]; // 크기 5의 빈 배열
(3) 리터럴로 생성
int[] intArray = {1, 2, 3, 4, 5};
이렇게 하면 5개의 원소가 있으니까 intArray는 자동으로 크기 5의 배열이 된다.
그런데 이 방식은 변수를 정의할 때만 할 수 있다. 밑에 코드처럼 두 줄에 나누어서 하면 오류가 나온다.
int[] intArray;
intArray = {1, 2, 3, 4, 5}; // 오류
배열 사용
배열 사용하는 방법 중 먼저 값을 대입하는 방법을 보자.
intArray[0] = 1;
intArray[1] = 2;
intArray[2] = 3;
intArray[3] = 4;
intArray[4] = 5;
이렇게 하면 0번 인덱스에는 정수 1을, 1번 인덱스에는 정수 2를 넣어주게 된다. 이런식으로 intArray 배열을 채우게 되는 것이다. 여기서 중요한 점: 인덱스는 0부터 시작한다! 5칸 짜리 배열이라면 인덱스가 0부터 4까지이다.
아래와 같이 범위에서 벗어나면,
intArray[5] = 6;
런타임에 이런 에러가 나온다.
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
런타임?
런타임이란, 코드 작성 시점이 아니라 실제 실행될 때를 뜻한다. intArray[5] = 6;을 적었을 때는 오류가 없다. 문법적으로 오류가 없기 때문이다. 그런데 실제 실행을 해서 접근하려고 하면 문제가 생기는 것이다.
변수명 뒤에 인덱스가 들어간다는 것 말고는 일반적인 변수와 사용법이 같다.
값을 대입할 때는 아까처럼
intArray[0] = 1;
intArray[1] = 2;
값을 읽을 때는 다음과 같이
System.out.println(intArray[0] + intArray[1]); // 1 + 2
3
앨리어싱 (Aliasing)
아래와 같이 배열을 통째로 넘길 수도 있다.
int[] arr1 = {1, 2, 3, 4, 5};
int[] arr2 = arr1;
arr1[0] = 100;
System.out.println(arr2[0]);
100
위와 같은 코드를 출력하면 콘솔 창에는 100이 나온다.
arr1을 arr2에 지정해줬을 때, 두 변수는 같은 주소를 가리키게 된다. 사실 arr1과 arr2는 아예 똑같은 값인 것.
arr2를 arr1의 'Alias(가명)'이라고 할 수 있습니다.
arr1을 arr2에 새롭게 복사하고 싶으면 아래와 같이 clone이라는 메소드를 사용하면 된다.
int[] arr1 = {1, 2, 3, 4, 5};
int[] arr2 = arr1.clone();
arr1[0] = 100;
System.out.println(arr1[0]);
System.out.println(arr2[0]);
100
1
이렇게 clone라는 메소드를 사용하면 된다고 한다. 메소드의 사용은 나중에 천천히 배울테니 문법적인 어려움이 있어도 걱정하지 말고 지금은 '이런게 있구나' 정도만 확인하자
어쨌든 이렇게 하면 배열이 복사가 된 것이라, arr1과 arr2는 서로 다른 배열이다. 그래서 arr1[0]을 수정해도 arr2[0]에는 영향을 미치지 않고, 1이 출력된다.
예제 1
100개 짜리 배열을 만들고 첫 번째 칸은 1, 두 번째 칸은 2, ..., 마지막 칸은 100으로 채워보자.
int[] intArray = new int[100];
for (int i = 0; i < 100; i++) {
intArray[i] = i + 1;
}
여기서 코드를 더 직관적으로 바꾸려면 100 대신 intArray.length를 쓰면 된다. length를 쓰면 우리가 배열의 크기를 몰라도 사용할 수 있고, 코드를 읽는 입장에서도 의미를 쉽게 해석할 수 있어서 좋다.
int[] intArray = new int[100];
for (int i = 0; i < intArray.length; i++) {
intArray[i] = i + 1;
}
위에서 만든 배열에 값이 제대로 들어갔는지 확인해보자.
for (int i = 0; i < intArray.length; i++) {
System.out.println(intArray[i]);
}
1
2
3
4
...
99
100
배열이 아닌 일반 변수를 읽는 것과 거의 똑같다.
for-each
자바에서 for-each를 쓰는 방법.
for (int i : intArray) {
System.out.println(i);
}
이렇게 쓰면, 처음에 수행 부분으로 들어갈 때 i는 intArray의 0번 인덱스의 값(원소)을 갖게 되고, 그 다음 들어갈 때는 1번 인덱스의 값(원소)을 갖게 되고... 이런 식으로 배열의 마지막 값(원소)까지 갖게 된다.
for (double i : intArray) {
System.out.println(i);
}
double에 int값을 넣으면 자동으로 형 변환이 되기 때문에 위의 식처럼 써도 문제 없다.
예제 2
문자열을 담는 fruitsArray을 만든 후, 원소를 저장하고, for - each문을 활용하여 원소들을 출력.
String[] fruitsArray = new String[5];
fruitsArray[0] = "딸기";
fruitsArray[1] = "당근";
fruitsArray[2] = "수박";
fruitsArray[3] = "참외";
fruitsArray[4] = "메론";
for (String fruit : fruitsArray) {
System.out.println(fruit);
}
딸기
당근
수박
참외
메론
'TIL > Java' 카테고리의 다른 글
[Java] 다중 배열(Multi Array) (0) | 2021.12.28 |
---|---|
[Java] 배열(Array)_염기서열문제 (0) | 2021.12.28 |
[Java] 조건문과 반복문_For (0) | 2021.12.27 |
[Java] 조건문과 반복문_While (0) | 2021.12.27 |
[Java] 조건문과 반복문_Switch (0) | 2021.12.27 |