자바의 변수는 1개의 데이터만 저장할 수 있습니다. 그렇기 때문에 저장해야 할 데이터의 수가 많아지면 그만큼 많은 변수가 필요하고 코드도 매우 길어집니다. 그래서 자바에는 많은 양의 데이터를 처리할 수 있는 배열이 존재합니다.
학생 30명의 성적을 저장하고, 평균값을 구한다고 가정하고 기존의 방법으로 변수를 사용해서 프로그램을 한다면 다음과 같이 작성을 해야됩니다.
int score1 = 80;
int score2 = 90;
int score3 = 85;
int score4 = 70;
...
int score30 = 77;
int sum = 0;
sum += score1;
sum += score2;
sum += score3;
...
sum += score30;
double avg = sum / 30.0;
위와같이 굉장히 비효율적이고 지루한 코딩을 하게 됩니다. 지금은 30개의 데이터지만 만약 100개나 더 많은 수의 데이터를 처리하려한다면 굉장히 힘든 코딩이 될겁니다. 이러한 비효율적인 코딩을 해결하고자 자바에서는 배열이라는 데이터 타입이 존재합니다.
배열
배열(Array)은 같은 타입의 데이터를 연속된 공간에 나열하고, 각 데이터에 인덱스를 부여해 놓은 자료구조입니다. 이 타입은 참조타입입니다. 위의 예제를 score배열을 이요하면 쉽고 간단하게 프로그램을 작성할 수 있습니다.
배열은 다음과 같은 특징을 가집니다.
1. 배열은 같은 타입의 데이터만 저장할 수 있습니다.
2. 한번 생성된 배열은 길이를 늘리거나 줄일 수 없습니다.
배열선언
배열을 사용하기 위해서는 우선 배열 변수를 선언해야 합니다. 배열 선언은 다음과 같이 두가지 형식으로 작성할 수 있습니다.
형식 1
타입[] 변수;
형식 2
타입 변수[];
대괄호 []는 배열 변수를 선언하는 기호로 사용되는데, 타입 뒤에 붙을 수도 있고 변수 뒤에 붙을 수도 있습니다. 타입은 배열에 저장될 데이터의 타입을 말합니다. 배열 변수는 참조 변수에 속합니다. 배열도 객체이므로 힙영역에 생성되고 배열 변수는 힙 영역의 배열 객체를 참조하게 됩니다. 만일 참조할 배열 객체가 없다면 배열 변수는 null값으로 초기화될 수 있습니다.
타입[] 변수 = null;
배열 생성
배일 객체를 생성하려면 값 목록을 이용하거나 new 연산자를 이용하는 방법이 있습니다.
값 목록으로 배열 생성
값의 목록이 있다면 다음과 같이 간단하게 배열 객체를 생성할 수 있습니다.
타압[] 변수 = {값0, 값1, 값2, 값3, ...};
중괄호 안에 주어진 값들을 항목으로 가지는 배열 객체를 생성합니다.
정수 타입 3개의 값을 배열 scores에 83, 90, 87로 초기화합니다. 이 형식은 배열을 생성하면서 동시에 초기화를 합니다. 하지만 배열을 미리 선언한 경우에는 중괄호를 이용해서 값을 지정할 수는 없습니다. 위의 프로그램에서 중요하게 보아야 할 부분이 있습니다. 배열의 인덱스는 항상 0부터 시작합니다. 배열이 n개의 크기로 선언이 된다면 인덱스는 0부터 n-1까지 사용할 수 있습니다. 이는 인덱스가 scores의 첫번째 주소로부터의 오프셋이기 때문입니다. 첫번째 주소로부터 0만큼 떨어진 곳에 첫번째 값이 들어있기 때문입니다. 두번째 값은 첫번째주소로부터 1만큼 떨어진 곳에 존재하기 때문에 인덱스는 0부터 시작하고 차례로 증가하게 됩니다. 처음에 프로그램언어를 배울때 혼동이 많이 되는 부분이라고 할 수 있으며 자바나 C같은 언어들은 인덱스를 0부터 시작합니다.
new 연산자로 배열 생성
값의 목록을 가지고 있지 않지만, 향후 값들을 저장할 배열을 미리 만들고 싶다면 new 연산자로 다음과 같이 배열 객체를 생성할 수 있다.
타입[] 변수 = new 타입[길이];
지정된 길이만큼의 배열을 생성할 수 있습니다. 배열을 선언하면 타입별로 초기값이 다릅니다.
분류 |
타입 |
초기값 |
기본타입[정수] |
byte[] char[] short[] int[] long[] |
0 '\0000' 0 0 0L |
기본타입[실수] |
float[] double[] |
0.0F 0.0 |
기본 타입[논리] |
boolean |
false |
참조 타입 |
클래스[] 인터페이스[] |
null null |
배열이 생성되고 나서 특정 인덱스 위치에 새로운 값을 저장하려면 다음과 같이 대입 연산자를 사용하시면 됩니다.
변수[인덱스] = 값;
위의 프로그램은 배열에 값을 넣는 방법과 초기화된 배열의 값을 보여줍니다. 3가지 타입의 배열을 선언했고 new 연산자로 생성한 다음 초기값을 출력했습니다. 정수형은 0이 나왔고 실수형은 0,0이 나왔고 String형은 null이 나왔습니다.
배열 길이
배열의 길이란 배열에 저장할 수 있는 전제 항목의 개수를 말합니다. 코드에서 배열의 길이를 얻으려면 배열 객체의 length 필드를 읽습니다. 필드는 객체내부의 변수를 말합니다. 객체의 필드나 메소드에 접근하기 위해서는 도트(.) 연산자를 사용해야 합니다.
여기서는 객체 변수인 length를 사용하여 코드를 작성했습니다. 이와 같이 리터럴 값을 사용하지 않고 프로그램을 작성하는 것이 좋습니다. 여기서는 3개로 쉽게 셀 수 있지만 길이가 긴 배열이 있을 수도 있으며 더욱 더 중요한 것은 프로그램을 수정할 때 입니다. 만약 학생수가 늘어서 배열의 길이가 늘어난다면 위의 프로그램은 초기화시키는 라인 5만 바꾸면 되지만 숫자 3을 사용했다면 각각의 3을 새로운 길이로 바꾸어줘야하고 어디에 있는지 배열의 길이를 나타낸 3인지 아니면 다른 의미인지를 파악하는데 시간이 많이 소모되고 오류발생 가능성도 올라가게 됩니다. 배열의 길이를 사용할 때는 length를 사용하는 것을 추천합니다. for문에서 배열을 사용할때는 인덱스때문에 i는 0으로 시작하고 n보다 작다로 끝이 납니다. 이것을 습관하해야지만 나중에 혼동되는 일이 없습니다. 나중에 배우게될 향상된 for문을 사용하면 배열이나 자바의 자료구조들이 좀 더 쉽게 이용할 수 있습니다.
'프로그래밍 > Java 프로그래밍' 카테고리의 다른 글
자바의 열거타입 (0) | 2020.07.05 |
---|---|
자바의 배열과 향상된 for문 (0) | 2020.07.04 |
자바 참조 타입과 참조변수 (0) | 2020.07.02 |
자바 반복문 (0) | 2020.07.01 |
자바 조건문 (0) | 2020.06.29 |