본문으로 바로가기
반응형

 

배열(Array)

 

배열(Array)은 모든 언어에서 사용되는 가장 기본적인 메모리 공간이다. 배열(Array)은 자료형이 같은 둘 이상의 값을 저장할 수 있다. 자료형이 같기에 원시(Primitive - int, double 등) 타입, 또는 객체(Object, non-Primitive) 타입으로 배열을 선언하여 해당 특정 타입의 값을 공간의 크기에 따라 저장할 수 있다.

배열(Array)은 여타 Class 형 객체들과 달리 특별한 형태로 구현되어 있다. 별도의 Source Code를 확인할 수 없으며 동적으로 사용자가 구현하면 내부적으로 Class가 생성되는 방식이다. 자바(Java)에서 최상위 Class인 Object를 직접 상속받아서 구현되기 때문에 아래와 같이 Class의 이름을 확인해볼 수는 있다.(즉, 배열의 바로 상위 Class는 Object이다.)

package com.test;

public Test{
	public static void main(String[] args){
    	int[] test = new int[10];
        System.out.println(test.getClass().getName());
    }
}

// 결과
[I

위에 표시하였듯이, 결과는 [I 처럼 표시되는데, "[" 는 1차원을 의미하고 "I"는 Integer를 의미한다. 즉, 선언된 배열의 차원과 타입에 대해 결과로써 확인할 수 있다. 만약 2차원으로 구현하였다면 [[I 와 같이 확인되고, float 타입으로 구현 시 [F와 같이 확인할 수 있을 것이다.


배열의 사용법은 위의 코드블럭에서 표시한 것과 같이 확인할 수 있다. 타입, 차원(Dimension), 크기를 결정하여 배열을 구현할 수 있게 된다. 이 때, 크기는 반드시 int 형태로만 선언할 수 있다. 배열 선언은 위와 같이 비어 있는 배열을 선언할 수도 있고 생성과 동시에 초기화하여 구현할 수도 있다.

 

package com.test;

public class Test {
    public static void main(String[] args){
        int[] test = new int[10];              // 비어 있는 배열 선언
        int[] test2 = new int[] {10, 20, 30};  // 선언과 동시에 초기화
        int[] test3 = {10, 20, 30, 40, 50};    // 선언과 동시에 초기화2
        
    }
}

 

배열은 위와 같이 정의하면 그 안에 값을 선언하여 넣을 수 있다. 물론 선언한 배열의 타입과 동일한 타입의 변수 혹은 값만 넣을 수 있다. 이미 선언되어 있다면 값을 넣을 위치의 값이 새로 넣은 것으로 수정되어 들어간다. 그렇다면 비어있는 배열의 경우 아무런 값도 들어 있지 않을걸까?

그렇지 않다. 원시(Primitive) 타입의 경우, int, double, float 과 같은 숫자 타입인 경우, 0 으로 초기화되어 있으며 boolean의 논리 타입인 경우는 false로, Object 타입(String도 Object)인 경우에는 null 로 초기화 되어 있다.

배열의 내부에 어떻게 필요한 값을 넣을 수 있을까? 배열에 값을 넣는 방식은 Index를 사용하여 수행할 수 있다. Index는 배열의 공간에 대한 위치를 정의한 것이다. 이 Index는 0부터 시작하여 배열의 크기 - 1 까지 지정할 수 있으며 아래와 같은 방식으로 사용할 수 있다.

 

package com.test;

public class Test {
    public static void main(String[] args){
        int[] test = new int[10];
        test[0] = 1;
        test[1] = 3;
        test[2] = 4;
        test[10] = 5;	// Index는 0부터 9(배열크기-1)까지 가능하여 실행 시 예외가 발생
    }
}

 

동일하게 배열의 Index를 사용하여 배열 내부에 삽입된 값을 가져올 수도 있다. 배열은 한 번 선언하면 그 타입과 크기를 변경할 수 없다. 배열의 크기는 length 라는 member field를 통해 확인할 수 있는데, 이 field가 final 이 선언되어 있어 선언 시에 크기를 지정해버리면 그 후에 변경할 수 없기 때문이다. 아래를 참고하여 배열의 크기를 확인하는 방법을 알아보자

 

package Testing;

public class Test {
    public static void main(String[] args){
        int[] test = new int[] {10, 20, 30, 40}; // 선언과 동시에 초기화
        System.out.println(test.length);         // 배열의 크기를 출력   
    }
}

// 결과
4

 

위에서 확인하듯이 length라는 field를 이용해 값을 가져올 수 있는데 그렇다면 궁금증이 생긴다. 자바(Java)의 표준 개발 방식에 따르면 상수(Constant)값은 보통 대문자로 표기하는데, 왜 length는 소문자로 되어 있으며 배열은 지금의 표준과 다르게 method가 아닌 member field를 가진 상태일까? 결론적으로는 자바(Java)가 당시 개발될 때에는 초기여서 지금과 같은 표준이 자리잡지 않았다고 한다. 지금의 표준을 통해 개발한다면 아마도 getLength() 와 같은 method를 통해 크기를 가져올 수 있을 지도 모른다.

배열은 보통 여러 값이 하나의 배열이라는 변수 내에 들어가 있기 때문에 반복문을 통해 그 값을 호출하는 것이 일반적이다. 자바의 기본적인 반복문을 통해 값을 출력하는 코드 예제는 아래를 확인한다.

 

package com.test;

public class Test {
    public static void main(String[] args){
        int[] test = new int[] {10, 20, 30, 40};
        for(int i=0; i < test.length; i++){
            System.out.print(i + ", ");
        }
    }
}

 

보통은 위와 같이 해당 배열의 길이를 기반으로 값들을 호출한다. 동적인 사용이 더욱 편하기 때문이다.

배열은 이후에 포스팅할 여러 자료구조를 구현하는데 매우 기초적인 자료구조가 된다. 배열은 매우 사용이 간편하고 쓰임새가 많기 때문에 잘 익혀두는 것이 중요하며 이후에 알아볼 자료구조를 이해하는데도 큰 도움이 된다.

 


참고

모든 배열(Array)은 자바(Java)의 Interface인 Cloneable 과 java.io.Serializable 을 구현한다. 이것이 무슨 의미인지는 별도로 확인해보도록 한다.

 

 

공부하는 학생이자 초보 경력자로서 포스팅을 진행중입니다. 오류가 있으면 피드백을 주시면 언제든지 환영합니다.

 

반응형