ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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 해주지 않아도 값이 출력된다.
    		
    	}
    
    }

    예제 1번 출력 값

     

     

    배열의 활용

    위에서 배열의 기본적인 내용을 살펴보았다. 여러 예제를 통해 배열을 어떻게 활용해야 하는지 알아보고자 한다.

     

    ※ 예제 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);
    	}
    
    }

    예제2번 출력 값

    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);
    
    	}
    
    }

    예제 3번 출력값

     

     

    ※ 예제 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));
    		
    	}
    
    }

    예제4번 출력값

     

    길이가 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]);
    
    		}
    		
    	}
    
    }

    예제 5번 출력 값

     

    로또번호를 셍성하는 예제로, 길이가 45인 배열에 1부터 45까지 값을 담은 다음 반복문을 이용해 배열의 인덱스가 i인 lotto[i]의 값과 random()에 의해 결정된 임의의 위치에 있는 값의 자리를 바꾸는 것을 6번 반복한다. 45개의 요소 중에서 앞에 6개의 요소만 임의의 위치에 있는 요소와 자리를 바꾸면 된다.

     

     

     

     

    반응형

    댓글

Designed by Tistory.