-
[ch5 자바 배열] 선언,생성 등 배열의 기초프로그래밍 언어/JAVA 2022. 6. 9. 21:38
배열이란?
같은 타입의 여러 변수를 하나의 묶음으로 다루는 것을 '배열(array)'이라고 한다. 많은 양의 데이터를 저장하기 위해서, 그 데이터의 숫자만큼 변수를 선언해야 한다면 매우 혼란스러울 것이다. 이런 경우 배열을 사용하면 많은 양의 데이터를 손쉽게 다룰 수 있다.
"배열은 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것"
여기서 중요한 것은 '같은 타입'이어야 한다는 것이며, 서로 다른 타입의 변수들로 구성된 배열은 만들 수 없다. 한 학급의 시험점수를 저장하고자 할 때가 배열을 사용하기 좋은 예이다. 만약 배열을 사용하지 않는다면 학생 5명의 점수를 저장하기 위해서 아래와 같이 5개의 변수를 선언해야할 것이다.
int score1, score2, score3, score4, score5;
변수 대신 배열을 이용하면 다음과 같이 간단히 처리할 수 있다. 변수의 선언과 달리 다뤄야할 데이터의 수가 아무리 많아도 단지 배열의 길이만 바꾸면 된다.
int [] score = new int[5]; //5개의 int 값을 저장할 수 있는 배열을 생성한다.
값을 저장할 수 있는 공간은 score[0]부터 score[4]까지 모두 5개이며, 변수 score는 배열을 다루는데 필요한 참조변수일 뿐 값을 저장하기 위한 공간은 아니다. 배열은 변수와 달리 각 저장공간이 연속적으로 배치되어 있다는 특징이 있다.
배열의 선언과 생성
배열을 선언하는 방법은 간단한데, 원하는 타입의 변수를 선언하고 변수 또는 타입에 배열임을 의미하는 대괄호[ ]를 붙이면 된다. 대괄호[ ]는 타입 뒤에 붙여도 되고 변수이름 뒤에 붙여도 된다.
선언방법 선언 예 타입 [ ] 변수이름 int[ ] score;
String [ ] name;타입 변수이름 [ ] int score[ ];
String name[ ];배열은 선언한 다음에 배열을 생성해야된다. 배열을 선언하는 것은 단지 생성된 배열을 다루기 위한, 참조변수를 위한 공간이 만들어질 뿐이고 배열을 생성해야만 비로소 값을 저장할 수 있는 공간이 만들어지는 것이다. 배열을 생성하기 위해서는 연산자 'new'와 함께 배열의 타입과 길이를 지정해줘야한다.
타입 [ ] 변수이름; // 배열을 선언(배열을 다루기 위한 참조변수 선언)
변수이름 = new 타입[길이]; //배열을 생성(실제 저장공간을 생성)
ex)
int [] score; // int 타입의 배열을 다루기 위한 참조변수 score 선언
score = new int[5]; // int 타입 값 5개를 저장할 수 있는 배열 생성위의 방식처럼 선언과 생성을 따로할 수 있지만 대부분 간략히 한 줄로 한다.
타입[ ] 변수이름 = new 타입[길이]; //배열의 선언과 생성을 동시에.
int[] score = new int[5]; //길이가 5인 int형 배열배열의 인덱스
생성된 배열의 각 저장공간을 '배열의 요소(element)'라고 하며, '배열의이름[인덱스]'의 형식으로 배열의 요소에 접근한다. 인덱스(index)는 배열의 요소마다 붙여진 일련번호로 각 요소를 구별하는데 사용된다. 인덱스(index)의 범위는 0부터 '배열의길이 -1'까지.
◎ int [ ] score = new int [ 5] ;
◎ score[3] = 100;
배열에 값을 저장하고 읽어오는 방법은 변수와 같다. 단지 변수이름 대신 '배열의[인덱스]'를 사용한다는 점만 다르다.
◎ int value = score [ 3 ];
score[3]에 저장되어 있는 값을 읽어 int형 변수 value에 저장한다.
배열의 길이(배열이름.length)
자바에서는 자바 가상 머신(JVM)이 모든 배열의 길이를 별도로 관리하며, '배열이름.length'를 통해서 배열의 길이에 대한 정보를 얻을 수 있다. 아래의 코드에서 배열 arr의 길이가 5이므로 arr.length의 값 역시 5가 된다. tmp라는 변수가 많이 사용되는데 temporary '일시적인'이라는 의미이다. 즉) 임시저장소라 생각하면 편하겠다.
int [] arr = new int[5];
int tmp = arr.length; //arr.lenth의 값은 5이고 tmp에 5가 저장된다.배열은 한번 생성하면 길이를 변경할 수 없기 때문에, 이미 생성된 배열의 길이는 변하지 않는다. '배열이름.lenth'는 상수다. 즉) 값을 읽을 수만 있을 뿐 변경할 수 없다. 아래 코드는 배열의 각 요소를 for문을 이용해 출력한다. 여기서 배열 score의 길이는 6이며, 인덱스의 범위는 0~5이다.
int [] score = new int[6];
for (int i=0; i<6; i++)
System.out.println(score[i]);만약 배열의 길이를 줄였다면 ? new int[5]로 지정해두고 조건식은 i<5로 변경하지 않았다면 이상태에서 에러가 난다.
why? 배열의 유효한 인덱스 범위인 0~4를 넘어 0부터 5까지 반복하기 때문에 5번째 반복에서 ArrayIndexOutOfBoundsException이라는 예외가 발생하여 비정상적으로 종료될 것이다.
그래서 배열의 길이를 직접 적어주는 것보다 '배열이름.length'를 사용하는 것이 좋다.
int [] score = new int[5];
for (int i=0; i<score.lenth; i++) //배열의 인덱스가 바껴도 조건식을 변경하지 않아도 된다.
System.out.println(score[i]);배열의 초기화
배열은 생성과 동시에 자동적으로 기본값(0)으로 초기화되므로 배열을 사용하기 전에 따로 초기화해주지 않아도 되지만, 원하는 값을 저장하려면 아래와 같이 각 요소마다 값을 지정해줘야한다.
int [] score = new int[5];
score[0] = 50;
score[1] = 60;
score[2] = 70;
score[3] = 80;
score[4] = 90;배열의 길이가 큰 경우에는 이렇게 요소 하나하나 값을 지정하기 보단 for문을 사용하는 것이 좋다. 위의 내용을 for문으로 바꾸면 아래와 같다.
int [] score = new int[5];
for(int i=0; i<score.lenth; i++)
score[i] = i * 10 + 50;그러나 for문으로 배열을 초기화하려면, 저장하려는 값에 일정한 규칙이 있어야만 가능하다. 따라서 자바에서는 다음과 같이 배열을 간단하게 초기화할 수 있다.
int [] score = new int[] { 50, 60, 70, 80, 90}; //배열의 생성과 초기화를 동시에
int [] score = { 50, 60, 70, 80, 90}; //new int[]를 생략할 수 있음
저장할 값들을 괄호{}안에 쉼표로 구분해서 나열하면 되며, 괄호{}안의 개수에 의해 배열의 길이가 자동으로 결정되기 때문에 괄호[] 안에 배열의 길이는 적지 않아도 된다. 심지어는 위와같이 'new 타입 [] '을 생략하여 코드를 더 간단히 할수도 있다.
배열의 출력
배열을 초기화할 때 for문을 사용하듯이, 배열에 저장된 값을 확인할 때도 for문을 사용하면 좋다.
int [] Arr = {100, 95, 80, 70, 60};
for(int i=0; i<Arr.lenth; i++) {
System.out.println(Arr[i]);
}위보다 더 간단하게 배열을 출력하는 방법은 'Arrays.toString(배열이름)' 메서드를 이용하는 것이다. 이 메서드는 배열의 모든 요소를 문자열로 만들어 반환한다.
int [] Arr = {100, 95, 80, 70, 60};
System.out.println(Arrays.toString(Arr); //배열 Arr의 모든 요소를 출력 [100, 95, 80, 70, 60]이 출력된다.만일 System.out.println(Arr)로 Arr의 값을 바로 출력하면 어떻게 될까? '타입@주소'의 형식으로 출력된다. 이 내용은 뒤에서 다룰 예정!
※ 예제 1번 ※
package ch5; import java.util.Arrays; public class Ex5_1 { public static void main(String[] args) { //배열 선언 int [] arr1 = new int[10]; int [] arr2 = new int[10]; int [] arr3 = {100, 95, 80, 70, 60}; String [] arr4 = {"a", "b", "c", "d"}; char [] arr5 = {'a', 'b', 'c', 'd'}; //배열 생성 //반복문으로 배열에 값 저장하기 for(int i=0; i<10; i++) { arr1[i]=i+1; System.out.print(arr1[i]+", "); } for(int i=0;i<10;i++) { arr2[i] = (int)(Math.random()*10)+1; } System.out.println(); System.out.println(Arrays.toString(arr2)); System.out.println(Arrays.toString(arr3)); System.out.println(Arrays.toString(arr4)); System.out.println(arr4); System.out.println(arr5); //char형만 toString 해주지 않아도 값이 출력된다. } }
배열의 활용
위에서 배열의 기본적인 내용을 살펴보았다. 여러 예제를 통해 배열을 어떻게 활용해야 하는지 알아보고자 한다.
※ 예제 2번 ※ - 총합과 평균
package ch5; public class Ex5_2 { public static void main(String[] args) { int arr[] = {80, 95, 71, 65, 100}; int sum =0; float avg = 0f; for(int i=0; i<5; i++) { sum+=arr[i]; } //avg = sum/arr.length; avg = sum/(float)arr.length;//계산결과를 float 타입으로 얻으려면 형변환 해야한다. System.out.println("총합: " + sum); System.out.println("평균: " +avg); } }
for문을 이용해서 배열에 저장된 값을 모두 더한 결과를 배열의 개수로 나누어 평균을 구하는 예제이다. 평균을 구하기 위해 전체 합을 배열의 길이인 arr.length로 나누었다. 이 때 int 타입과 int 타입간의 연산은 int 타입으로 결과를 얻기 때문에 정확한 평균값을 위해서 float타입으로 변환하여 나눗셈을 하였다.
※ 예제 3번 ※ - 최대값과 최소값
package ch5; public class Ex5_3 { public static void main(String[] args) { int[] score = {79, 88, 91, 33, 100, 55, 95}; int max = score[0]; int min = score[0]; for(int i=1; i<score.length; i++) { //배열의 2번째 요소부터 읽기 위해서 i의 값을 1로 초기화 if(score[i]>max) { max=score[i]; }else if(score[i]<min) { min=score[i]; } } System.out.println("최대값: "+max); System.out.println("최솟값: "+min); } }
※ 예제 4번 ※ - 섞기
package ch5; import java.util.Arrays; public class Ex5_4 { public static void main(String[] args) { int [] numArr = {0,1,2,3,4,5,6,7,8,9}; int tmp=0, j=0; System.out.println(Arrays.toString(numArr)); for(int i=0; i<100;i++) { j=(int)(Math.random()*numArr.length); //numArr[0]과 numArr[j]의 값을 서로 바꾼다. tmp = numArr[0]; numArr[0] = numArr[j]; numArr[j] = tmp; } System.out.println(Arrays.toString(numArr)); } }
길이가 10인 배열 numArr을 생성하고 0~9 숫자로 차례대로 초기화하여 출력한다. 그 다음 random()을 이용해 배열의 임의의 위치해 있는 값과 배열의 첫 번쨰 요소'numArr[0]'의 값을 교환하는 일을 100번 박복해서 배열의 요소가 뒤섞이게 한다.
※ 예제 5번 ※ - 로또번호 만들기
package ch5; public class Ex5_5 { public static void main(String[] args) { int [] lotto = new int[6]; for(int i=0; i<lotto.length;i++) { lotto[i] = (int)(Math.random()*45)+1; System.out.println("lotto["+i+"] = " + lotto[i]); } } }
그냥 출력 결과만 보고 임의로 작성했는데 Math.random말고 shuffle을 이용해서 하는 방법도 있다. 위에처럼 작성하면 중복된 번호가 나올 수 있다.
package ch5; public class Ex5_5 { public static void main(String[] args) { int [] lotto = new int[45]; int j=0, tmp=0; for(int i=0; i<lotto.length;i++) { lotto[i] = i+1; } for(int i=0; i<6; i++) { j=(int)(Math.random()*45); tmp = lotto[i]; lotto[i] = lotto[j]; lotto[j]=tmp; System.out.println("lotto["+i+"] = " + lotto[i]); } } }
로또번호를 셍성하는 예제로, 길이가 45인 배열에 1부터 45까지 값을 담은 다음 반복문을 이용해 배열의 인덱스가 i인 lotto[i]의 값과 random()에 의해 결정된 임의의 위치에 있는 값의 자리를 바꾸는 것을 6번 반복한다. 45개의 요소 중에서 앞에 6개의 요소만 임의의 위치에 있는 요소와 자리를 바꾸면 된다.
반응형'프로그래밍 언어 > JAVA' 카테고리의 다른 글
[ch5 자바 배열] 2차원 배열 알아보기 (0) 2022.06.10 [ch5 자바 배열] String 배열의 생성과 특징 (0) 2022.06.09 [ch4 자바 반복문] break문 & continue문 & 이름 붙은 반복문 (0) 2022.06.08 [ch4 자바 반복문] while문 알아보기 (0) 2022.06.08 [ch4 자바 반복문] for문 알아보기 (0) 2022.06.08