티스토리 뷰

반응형

#2차원 배열의 선언

1차원 배열의 선언에서 대괄호[] 하나만 추가하면 2차원 배열을 선언할 수 있다. 

2차원 배열 선언 방법

타입[][] 변수이름;

2차원 배열은 테이블 형태로 데이터를 저장하는 데 사용된다. 

 

예시) int[][] ex = new int[4][3];

 위의 문장은 4행 3열의 데이터를 담는 배열을 생성한 것이다.  생성한 배열은 12개의 int값을 저장할 수 있다. 
 배열을 생성하면  배열 요소에 타입의  기본값이 자동적으로 저장된다.(int형의 기본값은 0이다.)

 

#2차원 배열의 인덱스

2차원 배열은 행(row)과 열(cloumn)으로 구성되어 있다. 행과 열은 index에도 각각 한 개씩 존재한다. 

index의 범위

행 index의 범위 : '0 ~ 행의 길이 -1' 

열 index의 범위 : '0 ~ 열의 길이 -1' 

예시) int[][] socre =  new int[5][4];

위의 문장의 행과 열의 인덱스 범위는 '행 index범위 : 0~4 , 열 index범위 : 0~3'이다.

 

2차원 배열의 각 요소의 접근하는 방법은 '배열 이름[행 index] [열 index]'이다.

예시) int[][] score= new int [2][3]; // 2행 3열의 2차원 배열 score생성 

위의 문장과 같이 배열을 생성하면, socre[0][0]부터 score[1][2]까지의 모두 6개 (2*3=6)의 int값을 저장할 수 있는 저장공간이 생긴다.

score[0][0] score[0][1] score[0][2]
score[1][0] score[1][1] score[1][2]

 

#2차원 배열의 초기화

2차원 배열의 초기화 방법은 1차원 배열의 초기화에 괄호{}를 하나 더 추가하여 행별로 구분해주면 된다. 

그리고 1차원 배열처럼 생성과 초기화를 동시에 할 수 있다. 

 

예제 1) 배열 score의 모든 요소의 합 구하기.

public class Ex5_8 {

	public static void main(String[] args) {
		//배열 생성과 초기화 
        int[][] score = { 
				{ 100, 100, 100 }, 
				{ 20, 20, 20 }, 
				{ 30, 30, 30 }, 
				{ 40, 40, 40 } 
		};
		
		int sum = 0; //score전체를 더하는 변수
		//socre.length(행) ,  score[i].length(열)
		for (int i = 0; i < score.length; i++) { 
			for (int j = 0; j < score[i].length; j++) {
				System.out.printf("socre[%d] [%d] = %d%n", i, j, score[i][j]);
				sum += score[i][j];
			}
		}
		System.out.println("sum = " + sum);
	}
}

int[][] score = {}; 을 사용하여 4행 3열의 배열을 생성했다. 그리고 배열의 행은 길이가 달라도 괜찮다. 

 2차 배열을 쓰기 위해서는 이중 반복문을 써야 한다. 

 score.length는 행의 길이로 score.length = 4이다.

 score[i].length는 열의 길이로  score[i].length = 3이다.  

안쪽 for문의 출력문은 배열 score의 값을 찍어내고, 그 값을 아래 문장인 변수 sum에 값을 차례대로 저장한다. 

마지막 출력문에 있는 변수 sum은 차례대로 저장되었던 값을 출력하여 보여준다. 

 

* 출력 결과 

socre[0] [0] = 100
socre[0] [1] = 100
socre[0] [2] = 100
socre[1] [0] = 20
socre[1] [1] = 20
socre[1] [2] = 20
socre[2] [0] = 30
socre[2] [1] = 30
socre[2] [2] = 30
socre[3] [0] = 40
socre[3] [1] = 40
socre[3] [2] = 40
sum = 570

 

예제 2) 5명의 학생의 세 과목 점수의 총점과 평균 구하기.

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 korTotal = 0, engTotal = 0 , mathTotal = 0;
		
		System.out.println("번호  국어  영어  수학  총점  평균");
		System.out.println("=============================");
		
		for(int i=0; i < score.length; i++) {
			int sum = 0; //개인별 총점 초기화
			float avg = 0.0f; //개인별 평균 초기화
			
			//개인별 과목 성적
			korTotal += score[i][0];
			engTotal += score[i][1];
			mathTotal += score[i][2];
			
			//번호 출력
			System.out.printf("%3d" , i+1);
			
			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 %5.1f%n", sum, avg);
		}
		System.out.println("=================================");
		System.out.printf("총점:%3d %4d %4d%n", korTotal, engTotal, mathTotal);
	}

}

int [][] socre = {}; 사용하여 5행 3열의 배열을 생성했다. 

이 부분에서 score.length = 5, score [i]. length = 3이라는 것을 알 수 있다. 

바깥 for문에서는 개인별 총점, 평균을 초기화 및 개인별 과목의 점수를 각각 과목 변수에 저장하고 번호를 출력한다. 

안쪽 for문은 개인별 과목 성적을 더하여 한 줄의 값의 총합을 출력한다. 

총합의 출력이 끝나면 다음 문장인 평균을 구하는 코드를 실행한다.

정확한 값을 위해 평균은 float로 형변환하여 열의 길이(score [i]. length)로 나누면 된다. 

반복문은 바깥 for문의 조건이 ture일 때까지 돌아가다가 false가 되면 반복문을 빠져나와 그다음 코드를 순차적으로 실행하게 된다.  

* 출력 결과 

번호  국어  영어  수학  총점  평균
=============================
  1  100  100  100  300 100.0
  2   20   20   20   60  20.0
  3   30   30   30   90  30.0
  4   40   40   40  120  40.0
  5   50   50   50  150  50.0
=================================
총점:240  240  240

 

예제 3) 영단어 뜻 맞추기

import java.util.Scanner;

public class Ex5_10 {

	public static void main(String[] args) {
		String[][] words = { 
				{"chair", "의자"},  
				{"computer", "컴퓨터"},
				{"integer", "정수"}
		};
		
		Scanner scanner = new Scanner(System.in);
		
		for(int i = 0; i< words.length; i++) {
			System.out.printf("Q%d. %s의 뜻은?", i+1, words[i][0]); //%s - 문자열 출력지시자
			
			String tmp = scanner.nextLine();
			
			if(tmp.equals(words[i][1])) { 
				System.out.printf("정답입니다.%n%n"); 
			} else {
				System.out.printf("틀렸습니다. 정답은 %s입니다. %n%n" , words[i][1]);
			}
		}
	}
}

for문의 words[i][0]은 문제이고, if문의 words[i][1]은 정답이다. 

콘솔 창에 영어단어가 뜨면 콘솔창에 정답을 입력하면 scanner.nextLine()을 통해 입력한 문자가 tmp에 저장된다. 

그다음에 tmp에 저장된 값을 equlas()를 이용하여 words[i][1]와 같은지 비교해서 정답인지 확인한다. 

 

* 출력 결과 

Q1. chair의 뜻은?나무
틀렸습니다. 정답은 의자입니다. 

Q2. computer의 뜻은?컴퓨터
정답입니다.

Q3. integer의 뜻은?정수
정답입니다.

반응형