ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ch5 자바 배열] 2차원 배열 알아보기
    프로그래밍 언어/JAVA 2022. 6. 10. 11:20
    2차원 배열의 선언

    앞에서 포스팅한 배열은 1차원 배열인데, 2차원 이상의 배열, 다차원(multi-dimensional) 배열도 선언해서 사용할 수 있다. 메모리 용량이 허용하는 한, 차원의 제한은 없지만, 주로 1,2차원 배열이 사용되므로 2차원 배열만 잘 이해하고 나면 3차원 이상의 배열도 어렵지 않게 다룰 수 있다.

     

    2차원 배열을 선언하는 방법은 1차원 배열과 같으나, 대괄호[] 하나가 더 들어간다.

    선언 방법 선언 예
    타입 [][] 변수이름; int [][] score;
    타입 변수이름 [][]; int score [][];
    타입[] 변수이름; int[] score[];
    더보기

    3차원 이상의 고차원 배열의 선언은 대괄호[]의 개수를 차원의 수만큼 추가해 주기만 하면 된다.

     

     

    2차원 배열은 주로 테이블 형태의 데이터를 담는데 사용되며,

    만일 4행 3열의 데이터를 담기 위한 배열을 생성하려면 아래와 같다. 

    int [][] score = new int[4][3]; //4행 3열의 2차원 배열을 생성한다.

    위의 문장이 수행되면 4행 3열의 데이터, 모두 12개의 int값을 저장할 수 있는 공간이 마련된다.

     

     

     

     

    2차원 배열의 인덱스

    2차원 배열은 행(row)과 열(column)로 구성되어 있기 때문에 index도 행과 열에 각각 하나씩 존재한다. '행 index'의 범위는 '0~행의 길이-1'이고 '열 index'의 범위는 '0~열의 길이-1'이다. 그리고 2차원 배열의 각 요소에 접근하는 방법은 '배열이름[행index][열index]'이다.  만약 int [][] score = new int[4][3]; 이와 같이 배열 score를 생성하면, score[0][0]부터 score[3][2]까지 모두 12개 (4x3=12)의 int 값을 저장할 수 있는 공간이 마련되고, 각 배열 요소에 접근할 수 있는 방법은 아래의 그림과 같다.

     

     

    2차원 배열의 초기화

    2차원 배열도 괄호{}를 사용해서 생성과 초기화를 동시에 할 수 있다. 다만, 1차원 배열보다 괄호{}를 한번 더 써서 행별로 구분해준다. 

    int [ ][ ] arr = new int[ ][ ] { {1,2,3}, {4,5,6}};
    int [] [] arr = { {1,2,3}, {4,5,6} };

     

    크기가 작은 배열은 위와 같이 간단히 한 줄로 써주는 것도 좋지만, 가능하면 다음과 같이 행별로 줄 바꿈을 해주는 것이 보기도 좋고 이해하기 쉽다.

    int [ ][ ] arr = {
                           {1,2,3},
                           {4,5,6}
                           };

     

    ※ 예제 1번 ※

    package ch5;
    
    public class Ex5_8 {
    
    	public static void main(String[] args) {
    		
    		int sum=0;
    		int [][] score = {
    				{100,100,100},
    				{20,20,20},
    				{30,30,30},
    				{40,40,40}
    		};
    		
    		for(int i=0; i<score.length;i++) {
    			for(int j=0; j<score[i].length;j++) {
    				System.out.printf("score[%d][%d] =%d%n",i,j,score[i][j]);
    				sum += score[i][j];
    			}
    		}
    		System.out.println("sum = " +sum);
    
    	}
    
    }

    예제 1번 출력 값

    2차원 배열 score의 모든 요소의 합을 구하고, 출력하는 예제이다. 2차원 배열은 '배열의 배열'로 구성되어 있다. 즉, 여러개의 1차원 배열을 묶어서 또 하나의 배열로 만든 것이다. 그렇다면 score.length의 값은 얼마일까? 배열 참조변수 score가 참조하고 있는 배열의 길이가 얼마인가를 세어보면 될 것이다. 정답은 4이다. 그리고 score[0].length은 배열 참조변수 score[0]이  참조하고 있는 배열의 길이이므로 3이다.

     

     

    ※ 예제 2번 ※

    package ch5;
    
    public class Ex5_9 {
    
    	public static void main(String[] args) {
    		int [] [] score = { 
    				{100, 100, 100},
    				{20, 20, 20},
    				{30, 30, 30},
    				{40, 40, 40},
    				{50, 50, 50},	
    		};
    		int kor=0, eng=0, math=0;
    		
    		System.out.println("번호  국어  영어  수학  총점  평균" );
    		System.out.println("==========================");
    		for(int i=0; i<score.length; i++) {
    			int sum=0; //개인별 총점
    			float avg = 0.0f;//개인별 평균
    			System.out.print(i+1);
    			
    			//과목별 총점
    			kor+=score[i][0];
    			eng+=score[i][1];
    			math+=score[i][2];
    			
    			for(int j=0; j<score[i].length;j++) {
    				sum+=score[i][j];
    				System.out.printf("%5d",score[i][j]);
    			}
    			avg= sum/(float)score[i].length;
    			System.out.printf("%5d %6.1f%n",sum,avg);
    		}
    		System.out.println("==========================");
    		System.out.printf("총점: %5d %5d %5d", kor, eng, math);
    		}
    
    	}

    예제 2번 출력 값

    5명의 학생의 세과목 점수를 더해서 각 학생의 총점과 평균을 계산하고, 과목별 총점을 계산하는 예제이다.

     

    참고내용)

    1. avg 평균을 실수로 나오게 하기 위해서 avg= sum/(float)score[i].length; (float)형으로 나눠주었다. 

    2. 소숫점 1자리만 나오게 하기 위해서 System.out.printf("%5d %6.1f%n",sum,avg); %6.1로 자릿수를 지정해주었다. %다음 나오는 숫자를 띄어쓰기를 의미함

     

     

    ※ 예제 3번 ※

    package ch5;
    
    import java.util.Scanner;
    
    public class Ex5_10 {
    
    	public static void main(String[] args) {
    		
    		String[][] words = {
    				{"chair","의자"},
    				{"computer","컴퓨터"},
    				{"integer","정수"}
    		};
    		for(int i=0; i<words.length;i++) {
    			System.out.print(words[i][0]+"의 뜻은? ");
    			Scanner sc = new Scanner(System.in);
    			String answer = sc.nextLine();
    			if(answer.equals(words[i][1])) {
    				System.out.println("정답입니다.");
    			}else {
    				System.out.println("틀렸습니다. 정답은 "+words[i][1]+"입니다.");
    			}
    		}
    	}
    
    }

    예제 3번 출력 값

    words[i][0]은 문제이고, words[i][1]은 답이다. words[i][0]을 화면에 보여주고 scanner를 통해 입력받은 답을 answer에 저장한다. 그 후 equlas()를 활용해 정답과 똑같은지 확인한다.

     

     

    Arrays로 배열 다루기

    Arrays클래스는 배열을 다루는데 유용한 메서드를 제공하는데, 그중에서도 자주 사용하는 몇가지만 정리해봤다.

     

    1. 배열의 비교와 출력 - equals(), toString()

    toString() 배열의 모든 요소를 문자열로 편하게 출력할 수 있다. toString()은 1차원 배열에서만 사용할 수 있으므로, 다차원 배열에서는 deepToString()을 사용해야 한다. deepToString()은 배열의 모든 요소를 재귀적으로 접근해서 문자열을 구성하므로 2차원뿐만 아니라 3차원 이상의 배열에도 동작한다.

    int [] arr = {0,1,2,3,4,5};
    int [][]arr2D = {{11,12},{21,22}};
    System.out.println(Arrays.toString(arr)); // [0, 1, 2, 3, 4, 5]
    System.out.println(Arrays.deepToString(arr2D)); // [[11, 12], [21, 22]]

     

    equals()는 두 배열에 저장된 모든 요소를 비교해서 같으면 true, 다르면 false를 반환한다. equlas()도 일차원 배열에서만 사용 가능하므로, 다차원 배열의 비교에서는 deepEquals()를 사용해야 한다.

     

     

    2. 배열의 복사 - copyOf(), copyOfRange()

    copyOf()는 배열 전체를, copyOfRange()는 배열의 일부를 복사해서 새로운 배열을 만들어 반환한다. 늘 그렇듯이 copyOfRange()에 지정된 범위의 끝은 포함되지 않는다.

    package ch5;
    
    import java.util.Arrays;
    
    public class Ex5_11 {
    
    	public static void main(String[] args) {
    		int [] arr = {0,1,2,3,4,5};
    		int [] arr2 = Arrays.copyOf(arr, arr.length);
    		int [] arr3 = Arrays.copyOf(arr, 3);
    		int [] arr4 = Arrays.copyOf(arr, 7);
    		int [] arr5 = Arrays.copyOfRange(arr, 2,4);
    		int [] arr6 = Arrays.copyOfRange(arr, 0,7);
    		
    		System.out.println(Arrays.toString(arr));
    		System.out.println(Arrays.toString(arr2));
    		System.out.println(Arrays.toString(arr3));
    		System.out.println(Arrays.toString(arr4));
    		System.out.println(Arrays.toString(arr5));
    		System.out.println(Arrays.toString(arr6));
    }
    
    }

     

     

    3. 배열의 정렬 - sort()

    배열을 정렬할 때는 sort()를 사용한다.

    int [ ] arr = {3, 2, 0, 1, 4};
    Arrays.sort(arr); //배열 arr을 정렬한다.
    System.out.println(Arrays.toString(arr)); // [0, 1, 2, 3, 4]

     

    반응형

    댓글

Designed by Tistory.