자바 배열 (단일차원배열/다중배열/이중배열) - 선언 & 초기화
By Commin .September 28, 2016
Programming
배열
배열이란?
저는 개인적으로 배열을 같은 속성을 가진 덩어리를 줄세우는 과정이라고 정의하고 싶습니다.
이렇게 원이라는 속성을 가지고 3개를 넣을 수 있는공간을 가진 원배열에 원 3개를 줄세우고, 네모라는 속성을 가지고 3개를 넣을 수 있는 공간을 가진 네모배열에 네모 3개를 줄세우는 것이 배열입니다.
원이라는 속성으로 정의된 배열에 네모가 들어가면 오류가 나게됩니다. 그렇기때문에 배열을 선언 할 때 자료형을 반드시 제시해주어야 합니다.
배열을쓰면 무슨 장점이 있을까요? 예를 들어 1부터 10까지의 int형 데이터가 있다고 가정합니다. 이 데이터들을 int형 객체에 담아서 출력을 하려고 할 때 일반적으로는 하나하나 객체를 생성하고 그 객체에 1부터 10까지 따로따로 넣어줘야 합니다.
1 2 3 4 5 6 7 8 | int a = 1; int b = 2; int c = 3; int d = 4; . . . int j = 10; | cs |
그런데 이건 너무 비효율적입니다. 코딩의 길이도 늘어날 뿐더러 데이터 관리도 힘들죠. 게다가 내부적으로는 객체를 여러군데에 무작위로 생성하고 그걸 기억하려 하다보니 리소스도 더 많이 차지하게됩니다. 이런 경우에 배열을 쓰면 어떻게 될까요?
int a [10] = {1,2,3,4,5,6,7,8,9,10};
한줄이면 코딩을 할 수 있고 원한다면 for문으로 간단하게 데이터를 처리할 수도있습니다. 또한 내부적으로는 배열 a의 첫 시작부분인 a[0]의 주소만 기억하면 나머지는 차례대로 줄을 서있으니 몇번째인지만 안다면 바로 찾을 수 있으니 리소스도 절약 할 수 있습니다. 배열에 대해 알아야겠다는 의지가 불타오르시나요? ^^ 배열은 프로그램에 아주 중요한 개념 중 하나이니 반드시 알고 넘어가야겠습니다.
배열의 종류에는 단일차원배열과 다중배열이 있습니다. 이제부터 하나하나 저와함께 알아가보도록 하죠.
단일차원배열
단일차원배열이란 ?
제가 처음에 배열을 무엇이라고 생각한다고 했지요? 맞습니다. 줄서기입니다. 단일차원배열이란 어려울게없습니다. 그냥 한줄서기를 하는 배열입니다. 아무리 길어도 한줄로서야만 하는 녀석이죠.
10개의 int형 데이터를 관리해야 할 일이 있어서 배열을 쓰는 상황이라고 생각해봅시다. 배열을 만들 때 크기를 지정하여 초기화 할 수 있는데, 10개보다 작은 공간의 배열을 만들어도 안되고, 쓸때없이 10개보다 큰 공간의 배열을 만들어 리소스를 낭비 할 필요도 없습니다. 개수가 정해져있는 데이터를 배열로 처리 할때는 데이터의 크기만큼 배열을 지정해 주면됩니다.
int [] A = new int[10]; 으로 공간을 선언만 하였을 때는 그림과같이 10개의 공간이 만들어집니다. 이 공간에 값을 넣어보겠습니다.
1 2 3 | A[0] = 101; A[1] = 102; A[2] = 103; | cs |
A[0],A[1],A[2]에 차례대로 값을 넣으니 공간에 값이 제대로 들어갑니다. 그러면 값을 넣지않은 공간에는 무슨 값들이 들어있을까요? 자료형마다 다른 default 값이 들어있습니다.
short,int,double,float형의 default값은 0
String 형의 default값은 null
char 형의 default 값은 공백
배열의 개념 중 가장 중요한 부분은 배열의 주소할당입니다. A[5]의 값을 가지고 올 때, java는 A[5]의 주소를 기억하고 있다가 값을 가지고 올까요? 답을 먼저 말씀드리자면 아닙니다. 배열이 선언될때 java는 배열을 heap 영역 어딘가에 주소를 할당해줍니다. 할당된 주소를 이해하기 쉽게 100 이라고 하겠습니다.
int 자료형의 크기는 4byte이므로 한공간의 크기역시 4byte로 계산해봅시다. A배열의 첫시작인 A[0]의 시작 주소는 처음 할당받은 100이됩니다. 그리고 A[0]이 끝나는 지점은 104이므로 A[1]의 시작주소는 104가됩니다. A[9]의 시작주소는 어떻게될까요? 네 그렇습니다. 0보다 9는 9만큼 크고 한 공간의 크기는 4이므로 9*4 =36 만큼 떨어져있고 , 시작주소가 100이므로 100+36=136 A[9]의 시작주소는 136이라는 점을 쉽게 알 수 있습니다. 이렇게 컴퓨터는 A배열의 시작 주소만 알고있다면, A배열의 어떤요소의 값을 바로 구해낼 수 있습니다.
이런 식으로 A배열에 두개 이상의 줄이 서있다면 다중배열이라합니다. 위 그림을 코드로 나타내면 이렇게됩니다.
1 | int A[][] = new int [2][10]; | cs |
그렇습니다. 앞에 있는 대괄호 안에 숫자 2는 줄의 갯수를 의미합니다. 그리고 뒤에 있는 대괄호의 숫자는 줄의 크기를 의미하죠. 그러니까 두줄로 줄을 서는데 한줄에 최대 10개씩 설 수 있다 라는 의미입니다. 그러면 int A[][][] = new int [2][2][2] 는 어떻게 구성이 될지 감이 오실까요? 안오시겠지만 한번 생각해보세요. 별거없습니다. 생각해보시고 모르시겠다면 댓글 남겨주세요 ^^ 3차원이상의 다중배열은 다루지않겠습니다. 잘 안쓰니까요^^; 그러나 한번쯤 생각은 해볼필요가 있습니다.
다중배열에서도 저장방식이 중요한데, 단일차원배열과 별다를게없습니다. 처음 선언할때 각각의 줄의 시작주소를 기억하여 원하는 값을 가져오는거지요. ArrayExam.java 에 주석으로 설명한 동적배열을 초기화하는 방법에대해서는 더이상 설명할 부분이 없기때문에 쓰지않겠습니다. 주석을 보시고 한번 코딩해보시면됩니다. 그림은 그려놓을게요 ^^
*그림과 ArrayExam.java 소스내용과는 상관없습니다. 그러나 같은 맥락이므로 이해하실 수 있습니다.
다음 포스팅에서는 지금까지 배운 내용으로만으로 간단한 프로그램을 짜보도록 하겠습니다. 감사합니다.
끝
- Commin's JAVA BASIC Category
- 자바 이클립스 설치 및 환경변수 설정
- 자바 문법의 개념 및 용어
- 자바 기본 입출력
- 자바 제어문
- 자바 메서드 및 배열
- 자바 클래스
- [초급 JAVA]자바 class의 기본개념/객체(Object) 와 클래스 - 1
- [초급 JAVA]자바 class의 기본개념/객체(Object) 와 클래스 - 2
- [초급 JAVA]자바 생성자로 초기화 하고 코딩하기/JAVA Constructor
- [초급 JAVA]자바 this,static,final 지정예약어 - final
- [초급 JAVA]자바 this,static,final 지정예약어 - this & this()
- [초급 JAVA]자바 this,static,final 지정예약어 - static
- [초급 JAVA]자바 상속(extends) 예제로 이해하기/ super & super() 이해하기
- [초급 JAVA]자바 interface 와 abstract 예제로 이해하기
'LECTURE > # java basic' 카테고리의 다른 글
[초급 JAVA]자바 class의 기본개념/객체(Object) 와 클래스 - 1 (1) | 2016.09.30 |
---|---|
[초급 JAVA]예제-학생 시험 성적 평균 & 석차 입력/출력 프로그램 (0) | 2016.09.29 |
[초급 JAVA]자바 메서드 (CallByName/CallByValue/return) (1) | 2016.09.22 |
[초급 JAVA]자바 제어문 - while 제어문 /do~while() 제어문 (0) | 2016.09.21 |
[초급 JAVA]자바 제어문 - for 문 (단일 for 제어문 / 다중 for 제어문) (0) | 2016.09.21 |