프로그래밍 언어/자바

자바 10. 배열-1

닉네임못짓는사람 2020. 8. 14. 13:11
반응형

이번 글에서는 배열에 대해서 알아보도록 하겠습니다.

 

배열이란?


배열이라는 것은 특정한 자료형의 여러 변수들을 하나의 묶음으로 다루는것을 이야기합니다.

만약 여러분이 숫자 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