Java Chapter5. 배열(array)

2011. 10. 17. 02:21

현 블로그는 모바일 환경이 아닌 PC환경에 최적화 되어있습니다.

 Mir의 운영환경

5. 배열(array)


자 이제 클래스의 구성요소의 마지막 배열이다.


따지고 보면 배열은 함수중에 하나이지만

String과 배열은 조금 특이한 함수이기도 하며

구성요소중 하나라고 생각될만큼 많이 쓰이기도 한다.



그럼 배열이란 무엇일까?

배열은 같은형태의 많은 변수를 만들어내는 명령어라고 생각하면된다.


뭐랄까 앞서 변수를 설명할때 메모리라는 창고에 변수라는 상자를
놓는다라고
 설명했던것을 기억하는지 모르겠다.

배열은 그상자를 차곡차곡 쌓아서 만든 서랍장이라고 생각하면 편할듯 하다.

서랍장이 3단이면 물건을 3개 담을수 있을것이고

50단 서랍장이면 50개를 담을수 있을것이다.


자 서랍장이야기로는 대략적인 개념으로만 이해를 하고 아래 그림을 보자.

(서랍장이야기는 따지고 보면 정확한 개념은 아니지만 잘 이해 안가는 사람들은

 배열이란 그냥 상자가 쌓여서 서랍장을 만들었다라고만 개념을 잡아도 된다.)



자 위 그림은 배열선언과 생성의 기본식이다.


배열의 선언은 아주 간단하다. 원하는 타입의 변수를 선언할때 

변수 또는 타입뒤에 배열임을 의미하는 "대괄호[ ]" 를 붙히면된다.


배열의 선언은 값을 저장할 공간을 만든것이 아니라

값을 저장할곳을 가르키는 주소값을 저장할 공간을 만드는것이다.


값을 저장할곳을 만드는것을 배열의 생성이라고 한다.


기본식으로는 설명하기 좀 헷갈릴수 있으니 필자가 배열을 하나 생성해 보겠다.



(클릭하세요)


위에서 나온 new를 다시한번 기억하기 바란다.

new는 메모리공간을 확보하라는 뜻이다.

무엇을 확보할지는 뒤에 붙는 명령마다 다르겠지만 여기서는 배열 int[5]를 
저장할수 있는 공간을 확보하라는 뜻이 된다.


자 위그림을 보면 배열은 참조변수라는것을 알수 있다.

참조변수는 주소값을 저장할수 있는 변수이다.
주소만 저장하면 되기때문에 
크기는 항상 4byte이다. 

즉 배열안에 모든 값들이 들어가는것이 아니라

배열 자체는 그 값들이 들어있는 주소만 나타낼 뿐이다.

값을 저장할 공간은 new명령으로 따로 생성하는것이다.


이렇게 배열을 이용하여 변수를 생성하면 변수의 이름들이 자동으로 만들어지는데

"배열이름[0]" 부터 만들어지기 시작한다. "배열이름[1]"부터가 아니다. 주의하자!


자 이제 배열을 만들었으니 배열을 초기화 시켜보자.

배열을 초기화 하는것은 별거 없다.

위에서 "배열이름[x]"이란 이름을가진 변수를 5개 생성하였으니

배열이름[x] = 값(X);

과 같은식으로 초기화 한다.

자 배열이름이라고 말한다고 헷갈려 하지말자 결국 생성된 변수의 이름일 뿐이다.


a[0] = 5;


이렇게 명령을 내리면 위의 그림에서 첫번째 a[0]의 이름을 가진 변수에 값 5가 저장 되는것이다.







그럼 배열에 대한 기본적인 개념을 끝내고 예제를 통해서 더욱더 알아보자.

public class Ex5_1 {


public static void main(String[] args){


int grade1;

int grade2;
int grade3;

int grade4;

int grade5;




grade1 = 90;

grade2 = 60;

grade3 = 75;

grade4 = 88;

grade5 = 49;




System.out.println("1번학생의 평균성적" + grade[0]);

System.out.println("2번학생의 평균성적" + grade[1]);

System.out.println("3번학생의 평균성적" + grade[2]);

System.out.println("4번학생의 평균성적" + grade[3]);

System.out.println("5번학생의 평균성적" + grade[4]);

}}

자 위예제는 1번학생부터 5번학생까지의 평균성적을 저장하여 출력하는것이다.

5개의 변수를 선언하고 난뒤 각 변수마다 성적을 저장하여 출력하였다.

이것을 이번엔 배열을 이용하여 만들어보자.
 

public class Ex5_2 {

public static void main(String[] args){


int[] grade;


grade = new int[10];


grade[0] = 90;

grade[1] = 60;

grade[2] = 75;

grade[3] = 88;

grade[4] = 49;




System.out.println("1번학생의 평균성적" + grade[0]);

System.out.println("2번학생의 평균성적" + grade[1]);

System.out.println("3번학생의 평균성적" + grade[2]);

System.out.println("4번학생의 평균성적" + grade[3]);

System.out.println("5번학생의 평균성적" + grade[4]);

}}


자 이번에는 배열grade를 만들어서 값을 저장해보았다.

위 배열을 쓰지 않았을때보다 조금은 줄어들었긴 했지만 별반차이가 없어보인다.

물론 5명이 아니라 40명의 성적을 저장시키는것이면 많이 줄긴 하겠지만

그래도 일일이 값을 대입하는게 솔직히 귀찮다.


자바를 만든사람도 그렇게 생각했었는가보다 그래서 나온것이 또다른 배열의 초기화 방법이다.

앞서 말한 배열의 초기화는 각 요소마다 하나씩 값을 넣어야 했었지만

두번째 배열의 초기화방법은 배열을 선언, 생성할때 바로 값을 넣어 생성시킨다.

아래 예제를 보자

public class Ex5_3 {

public static void main(String[] args){


int[] grade = {90, 60, 75, 88, 49};



System.out.println("1번학생의 평균성적" + grade[0]);

System.out.println("2번학생의 평균성적" + grade[1]);

System.out.println("3번학생의 평균성적" + grade[2]);

System.out.println("4번학생의 평균성적" + grade[3]);

System.out.println("5번학생의 평균성적" + grade[4]);

}}

확 줄어든게 눈에 보이는가? 

처음엔 배열을 선언하고 난뒤 new를 사용하여 저장공간을 만들고 요소마다 값을 집어넣었지만

지금은 배열을 선언하고 난뒤 바로 5개의 값을 그 배열에 넣어라고 명령을 내렸다.


그러면 자동적으로 5개의 값을 저장할 공간을 만들고 순서대로 값을 집어넣게 된다.

(주의할점! 위처럼 배열을 선언할때에만 { }안에 값을 집어넣는게 가능하다. 

 배열의 선언과 생성이 끝난뒤에 값을 집어 넣을려면 요소마다 따로 넣거나

 grade = new int[] {90, 60, 75, 88, 49}; 와 같이 new로 저장공간의 생성과

 동시에 값을 집어넣는것이 가능하다.
 위 두번째 방법과 비슷하지만 선언할때 값을 넣느냐 선언후에 값을 넣느냐 
 에 따라 약간의 차이가 있는것이다. )


첫번째 초기화 방법은 값을 하나 추가할려면 배열을 다시 6개의 크기로 선언한뒤
새로 생긴 6번째 공간에 새로운 값을 넣어주어야 하지만
두번째 초기화 방법은 그냥 값하나만 추가시키면 자동적으로 배열도 6개의 크기로 늘어난다.


자 이번엔 for문을 활용하여 좀더 줄여보자.

public class Ex5_4 {

public static void main(String[] args){


int[] grade = {90, 60, 75, 88, 49};



for(int i=0; i<grade.length; i++){

System.out.println((i+1)+"번학생의 평균성적" + grade[i]);

}}}


배열을 사용할때 for문은 거의 필수적인데

출력을 할때 for문을 사용하면 일일이 적어서 출력할 수고를 덜수 있기 때문이다.


아래 for문을 0부터 시작하여 grade.length만큼 반복하라고 명령을 내렸다.

.length는 앞으로 자주 볼 문구인데 배열의 크기를 나타내는 맴버변수이다.

(맴버변수는 후에 자세히 설명하도록 하겠다.)

grade는 5개의 변수를 가지고 있으니 grade.length는 5와 같다.

만약 위의 점수를 하나더 추가를 하면 grade.length는 6으로 되는것이다.

이렇게 length를 사용하면 후에 값을 추가하거나 제외 할때에
for문의 반복횟수를 일일이 고칠 필요가 없어진다.


위 i는 0부터 4까지 변화하면서 출력하기때문에

grade[i] 는 grade[0]부터 grade[4]까지 출력을 하게된다.


자 제일 위의 배열을 사용하지 않은 예제와 한번 비교를 해보기 바란다.

정말 많이 줄어들지 않았는가?


이렇게 배열과 반복문을 활용하면 전교생의 성적도 값만 입력하면 알아서
 저장후 출력까지 
하도록 프로그래밍을 할수 있다. 

(필자는 값도 자동으로 입력하게 할수 없냐고 물었는데 그것이 OMR카드이다.

OMR카드로 성적을 입수하여 자동적으로 값을 저장후 처리하게 되는것이다.
만약 OMR카드가 없으면 전국 학생의 시험지를 일일이 채점한후 성적을
하나하나 다 입력해야 될것이다.)



자 배열의 선언 , 생성, 간단한활용까지 이제 알아보았다.


배열은 방금 우리가 만든 한줄짜리 배열도 있지만

표와 같이 x행 y열을 가진 2차원 배열

x행 y열  z줄을 가진 3차원 배열도 만들수 있다.


하지만 아직 필자가 배울 필요성을 못느끼니 그냥 넘어가기로 하자.

혹 알고 싶은사람은 알아서 찾아보시길 ;;

( 다차원 배열은 데이터베이스에 쓰인다고 들었다. 그리고 1차원 배열만 가지고도

 현재 아무 무리 없이 프로그래밍을 하고 있으니 혹 나중에 필요할때 다시 배우던가 하자.)



배열의 활용은 for문과 합치면 너무 많다.

하나하나 예제로 설명하기 힘든것도 있지만 문제를 풀면서 습득하는게 더 좋을거 같다.

문제는 빠른시일내로 올리도록 하겠다!
(문제를 내는것도 시간이 걸리지만 답을 적는데도 엄청 시간이 걸린다 ㅠㅠ

 필자가 현재 나가고 있는 진도가 너무 빨라서 일단 설명위주로 업데이트를 해야할거 같다.)





------------------------------------------------------------------------------------
본 블로그의 글을 퍼가실때 꼬릿말, 퍼가시는곳 주소를 꼭 남겨주세요. 
출처 꼭 기재해주시고요. 상업적인 용도의 이용은 절대 금합니다.
혹 프린트를 할 경우 블로그주소와 함께 프린트 해주세요.
허락을 맡지 않고 무단도용을 할경우 법적인 제제가 있을수도 있습니다. 
(전 분명히 경고했습니다. 합의같은거 안합니다.)
그리고 혹 무단도용한것을 보신분은 신고해주시면 사례금 챙겨 드리겠습니다.
-----------------------------------------------------------------------------------

+ Recent posts