이번 글에서는 배열에 대해서 알아보도록 하겠습니다.
배열이란?
배열이라는 것은 특정한 자료형의 여러 변수들을 하나의 묶음으로 다루는것을 이야기합니다.
만약 여러분이 숫자 5개를 저장해야된다면 변수를 어떻게 선언하실건가요?
public class example{
public static void main(String[] args){
int n1, n2, n3, n4, n5;
}
}
숫자의 개수가 5개인 경우엔 위와 같이 별 어려움 없이 해결할 수 있습니다.
하지만 이런때 늘 나오는 이야기로, 저장할 숫자가 100개, 1000개, 혹은 10만개라면?
이런 경우엔 위와 같은 방법으론 해결할 수 없으실겁니다.
이때 배열을 사용하면 이를 손쉽게 다룰 수 있습니다. 배열의 기본 형식은 다음과 같습니다.
자료형[] 변수명 = new 자료형[크기]
int[] num = new int[5];
위와 같은 경우 int형 값 5개를 저장할 수 있는 크기가 5인 배열 num을 선언하는 것입니다.
이때 =를 기준으로 좌측부분에서 배열을 선언하고, 우측부분에서 new를 사용해 배열을 생성합니다.
배열같은 경우 선언뒤 꼭 생성을 해주어야 정상적으로 사용할 수 있습니다.
배열을 생성하면 메모리 공간에서 배열의 크기에 맞게 연속적인 메모리 공간을 부여받습니다.
이 생성 과정을 그림으로 한번 살펴보도록 합시다.
배열의 생성과정
먼저 배열을 선언하면, 참조변수인 배열을 위한 공간만 메모리상에 마련됩니다.
그 후 'new'를 사용해 배열을 생성하면, 메모리 공간에 5개의 연속된 저장공간을 부여받습니다.
이때 각 공간들에 따로 이름은 없고, '[]'안에 번호를 붙여서 사용되며, 이 번호를 인덱스라고 합니다.
각각의 공간들을 합쳐서 배열의 요소라고 말하는데, 인덱스는 이 배열의 첫 번째 요소부터
0, 1, 2, 3 ...순서로 배열의 크기 - 1인 숫자까지 부여받습니다.
배열을 생성하면 각 배열요소는 현재 배열의 자료형의 기본값(int는 0)으로 초기화됩니다.
마지막으로 할당 연산자'='에 의해 배열의 주소(가장 첫 번째 요소의 주소)가 참조변수 num에 저장됩니다.
메모리의 기억공간들은 byte단위로 위치를 식별할 수 있는 주소값이 존재합니다.
이 메모리 주소를 통해 배열명으로 각 요소에 접근해서 값을 사용하거나, 바꿀 수 있습니다.
위의 그림의 주소들은 제가 임의로 정해놓은 것이고, 실제로 그렇다는 이야기는 아닙니다.
이런 배열은 기본 자료형 뿐만 아닌 다른 참조자료형도 배열로 만들 수가 있습니다.
예를 들면 String같은 경우를 들 수 있겠는데, 참조변수의 경우 기본값이 null이기 때문에
String배열을 생성할 경우 모든 값이 자동으로 null로 초기화 됩니다.
그 외의 기본 자료형의 기본값은 다음과 같습니다.
배열의 초기화
배열은 위에서 말했다시피, 생성시에 자동적으로 기본값으로 초기화됩니다.
각 요소의 값을 바꾸고 싶다면, 다음과 같이 해주시면 됩니다.
int[] num = new int[5];
num[0] = 5;
num[1] = 4;
num[2] = 3;
num[3] = 2;
num[4] = 1;
이렇게 배열의 배열명과 각 요소의 인덱스를 사용해서 각 요소의 값을 바꿀 수 있습니다.
이외에도 배열 생성시에 값을 초기화 하는 방법도 있습니다.
int[] num = new int[] {5, 4, 3, 2, 1}
int[] num = {5, 4, 3, 2, 1};
두 가지 초기화 방법을 알아볼텐데, 전자의 경우 일단 배열 생성시 값을 지정할 땐
배열의 크기를 지정해주지 않으며, 입력한 데이터의 개수만큼 자동으로 크기가 정해집니다.
그런데 이런 방법을 사용할 땐 심지어 new int[]조차 생략해도 됩니다.
즉 위의 두가지 경우는 둘 다 똑같은 결과를 얻을 수 있다는 것입니다.
그럼에도 조금의 차이가 존재하는데,
예를 들어 배열의 선언과 초기화를 따로 할 때는 1번의 경우를 사용해야 합니다.
int[] num;
num = {5, 4, 3, 2, 1} // 에러 발생
num = new int[]{5, 4, 3, 2, 1} // 정상실행
따라서 위와 같은 경우에는 둘을 꼭 구분해서 사용하도록 하되,
책에서는 특별한 경우가 아닌 경우 2번을 사용하는걸 추천하고 있습니다.
그럼 이제 예제를 통해서 실제로 배열을 사용해봅시다.
public class example{
public static void main(String[] args){
int[] num = new int[5];
for(int i = 0; i < num.length; i++){
num[i] = (int)(Math.random() * 50) + 1;
System.out.println(num[i]);
}
}
}
위의 예제는 배열의 각 요소에 1~50의 임의의 정수를 대입하고, 이를 출력하는 예제입니다.
배열의 경우 주로 반복문과 같이 쓰이며, 반복횟수를 정할 때에 배열의 크기를 알아야 할텐데
배열 객체에 length라는 멤버변수가 있기 때문에, 배열의 크기를 구하고 싶을 때
배열명.length와 같이 사용해주시면 배열 요소의 총 개수를 쉽게 알 수 있습니다.
또다른 예제를 하나 해보겠습니다.
public class example{
public static void main(String[] args){
int[] num = new int[5];
for(int i = 0; i < num.length; i++){
num[i] = (int)(Math.random() * 500) + 1;
System.out.println(num[i]);
}
System.out.println("내림차순 정렬");
for(int i = 0; i < num.length-1; i++){
for(int j = i; j < num.length; j++){
if(num[i] < num[j]){
int tmp = num[i];
num[i] = num[j];
num[j] = tmp;
}
}
}
for(int i = 0; i < num.length; i++){
System.out.println(num[i]);
}
}
}
이번 예제는 위와 동일하게 각 요소에 임의의 정수를 대입하고,
이 배열의 값들을 중첩for문을 사용해 내림차순으로 재정렬 해서 출력해주는 예제입니다.
예제에 사용된 코드는 모두 알아봤던 것이니 어렵지 않게 구현 가능하실겁니다.
참고로 이렇게 인접한 두 원소를 비교해서 정렬하는 방법을 '버블정렬'이라고 말합니다.
이번 글은 여기까지 하고 마치도록 하고, 다음 글에서 이어서 설명하도록 하겠습니다.
감사합니다.
'프로그래밍 언어 > 자바' 카테고리의 다른 글
자바 12. 클래스와 객체 (0) | 2020.08.25 |
---|---|
자바 11. 배열-2 (0) | 2020.08.24 |
자바 9. 반복문 (0) | 2020.08.13 |
자바 8. 조건문 (0) | 2020.08.12 |
자바 7. 연산자-2 (0) | 2020.08.11 |