[Java] #8 배열

febCho·2023년 10월 8일
0

Java

목록 보기
23/53

배열

배열은 같은 자료형들끼리 모아두는 하나의 묶음이자 메모리 상의 연속적인 공간으로, 배열 안에는 여러 데이터를 넣을 수 있다는 점에서 하나의 데이터만 담을 수 있는 변수와 차이가 있다.

배열만의 특징을 예제를 통해 좀 더 알아보자.

1. 일차원 배열

package kr.s06.array;

public class ArrayMain01 {
	public static void main(String[] args) {
		char[] ch;
		ch = new char[4];
		
		//배열의 초기화
		ch[0] = 'J';
		ch[1] = 'a';
		ch[2] = 'v';
		ch[3] = 'a';
		
		//배열의 요소 출력
		System.out.println(ch[0]);
		System.out.println(ch[1]);
		System.out.println(ch[2]);
		System.out.println(ch[3]);
		System.out.println("===========");
		
		//반복문을 이용한 배열의 요소 출력
		for(int i=0;i<ch.length;i++) {
			System.out.println("ch[" + i + "]: " + ch[i]);
		}
		System.out.println("=============");
		
		//배열의 선언, 생성
		int[] it = new int[6];
		//int it[] = new int[6];처럼 자료형 뒤 혹은 배열명 뒤에 [] 위치
		
		//배열의 선언, 생성(명시적 배열 생성), 초기화
		char[] ch2 = new char[] {'자', '바'};
		
		//배열의 선언, 생성(암시적 배열 생성), 초기화
		char[] ch3 = {'강', '남', '구'};
	}
}
  1. 변수의 경우 변수 선언과 변수 생성이 같은 의미이나, 배열은 선언과 생성의 의미가 다르다.
    배열 선언: char[] ch;, 배열 생성: ch = new char[4];

  2. char[]배열의 자료형을 의미하며 배열을 선언한다는 것은 곧 '배열을 가리킬 준비'를 하는 것이다. 따라서 char[] ch;를 해석하면, ch 안에 연속된 메모리 공간인 배열에 접근하기 위한 배열의 주소가 저장될 것이다.

  3. ch = new char[4];는 배열 생성으로, new는 배열 생성 연산자이며, 대괄호 [] 안에 있는 숫자는 배열의 길이이다. 즉 데이터를 담을 방 4개를 만들겠다는 것을 의미한다.

  4. 또한, 이렇게 만들어진 각 방의 번호를 Index라 부르며 0부터 출발한다.

  5. 배열 또한 변수처럼 초기화가 필요한데, 대괄호 사이에는 각 방의 번호를 써준다. ch[0] = 'J';

  6. 이렇게 저장된 데이터를 출력하고자 할 때는 System.out.println(ch[0]); 배열명과 Index를 함께 명시한다.

System.out.println(ch[0]);
System.out.println(ch[1]);
System.out.println(ch[2]);
System.out.println(ch[3]);
출력)
J
a
v
a
  1. 위와 같이 개별적으로 출력하는 것 외에도 순차적으로 증가하는 Index를 활용해 반복문(for문)으로 배열의 요소를 출력할 수 있다.
    이때, 배열을 생성하면 함께 만들어지는 length를 호출해 방 길이를 구한다.
for(int i=0;i<ch.length;i++) {
	System.out.println("ch[" + i + "]: " + ch[i]);
	//i: index 0~3
		}

항상 염두해 두어야 할 것은 index는 0부터 시작하기 때문에 ch.length가 포함되면 안 된다는 것이다. i<=ch.length; (X), i<ch.length; (O)

  1. 변수와 같이 선언과 생성을 동시에 하는 것이 가능하며
    int[] it = new int[6];
    배열의 선언과 생성, 초기화를 동시에 하는 것도 가능하다.
    char[] ch2 = new char[] {'자', '바'};
    이때 배열 생성 연산자를 명시하는 '명시적 배열 생성'보다는 '암시적 배열 생성'을 더 자주 사용한다.
    char[] ch3 = {'강', '남', '구'};

이렇듯 변수와 유사한 특성을 보이는 배열은 다음과 같은 차이점을 지닌다.

package kr.s06.array;

public class ArrayMain02 {
	public static void main(String[] args)
		int[] array = new int[5];
		
		//반복문을 이용한 요소의 출력
		for(int i=0;i<array.length;i++) {
			System.out.println("array[" + i + "]: " + array[i]);
		}
		System.out.println("===============");
		
		//배열의 요소 변경
		array[0] = 10;
		array[1] = 20;
		array[2] = 30;
		array[3] = 40;
		array[4] = 50;
		//array[5] = 60; - 없는 인덱스 호출 시 에러 발생
		
		//반복문을 이용한 배열의 요소 출력
		for(int i=0;i<array.length;i++) {
			System.out.println("array[" + i + "]: " + array[i]);
		}
	}
}
  1. 변수는 초기화 하기 전, 선언과 생성만 한 당시에는 데이터가 없다. 하지만 ★배열은 '기본값'이라는 데이터★가 있다.
    자료형 기본값

기본값을 확인하기 위해 위 예제를 출력해본 결과는 다음과 같다.

출력)
array[0]: 0
array[1]: 0
array[2]: 0
array[3]: 0
array[4]: 0
===============
array[0]: 10
array[1]: 20
array[2]: 30
array[3]: 40
array[4]: 50
  1. 또한, array[5] = 60; 없는 인덱스를 호출 시에는 에러가 발생한다.


지금까지의 성적 프로그램은 korean, english 등 과목별 변수값을 지정해 주었다.
배열을 활용해 성적 프로그램을 만든다면 어떤 차이점이 있을까?
> 배열, for문을 활용해 성적 프로그램 만들기

  1. 여기서 주의할 점은 배열은 방을 생성한 이후에 방을 늘리거나 줄이지 못한다는 점이다. (고정 길이 != 가변 길이)


다음은 배열을 활용하여 여러 숫자 중 최대값과 최소값을 구하는 방법이다.
배열이 여러 데이터를 저장할 수 있다는 점에서 조건(삼항) 연산자를 통해 최대값, 최소값을 구할 때보다 여러 데이터를 함께 대조할 수 있다.
참고) 5. 조건(삼항) 연산자

package kr.s06.array;

public class ArrayMain04 {
	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++) {
			//최대값 구하기
			if(score[i] > max) {
				max = score[i];
			}
			//최소값 구하기
			if(score[i] < min) {
				min = score[i]; //최소값이 변동
			}
		}
		//최대값, 최소값 출력
		System.out.println("최대값: " + max);
		System.out.println("최소값: " + min);
	}
}
  1. 임의의 숫자 여러 개를 배열에 저장해 준다.
    int[] score = {79, 88, 91, 33, 100, 55, 95};

  2. 그리고 최대값과 최소값을 저장해줄 변수를 선언하며 배열의 첫 번째 값으로 초기화 해준다.
    int max = score[0];, int min = score[0];

  3. for문을 통해 루프를 돌며 값을 대조해 줄 것인데, 제일 중요한 건 0번 데이터(첫 번째 값)와 대조할 것이기 때문에 인덱스가 될 i가 1부터 출발한다는 점이다. for(int i=1;i<score.length;i++) {

  4. 먼저 최대값을 구하기 위해 if문을 활용, 조건 체크를 해준다. 1번 인덱스에 저장된 값(score[1])현재 max에 저장된 0번 데이터(첫 번째 값 = score[0])보다 크다면, max = score[i]이 변한다.

  5. 최소값을 구하는 if문에서는 반대로, 1번 인덱스에 저장된 값(score[1])현재 min에 저장된 0번 데이터(첫 번째 값 = score[0])보다 작다면, min = score[i]이 변한다.

  6. 루프를 돌며 마지막 index에 저장된 데이터까지 비교를 마친 뒤, 최종적으로 각 변수(max, min)에 저장된 값을 출력한다.

System.out.println("최대값: " + max);
System.out.println("최소값: " + min);


package kr.s06.array;

public class ArrayMain05 {
	public static void main(String[] args) {
		//배열 선언 및 생성, 초기화
		int[] array = {10, 20, 30, 40, 50};
		            // 0,  1,  2,  3,  4, length = 5
		
		//(전통적) 반복문을 이용한 배열의 요소 출력
		for(int i=0;i<array.length;i++) {
			System.out.println("array[" + i + "]: " + array[i]);
		}
		System.out.println("===================");
		
		//개선된 루프(확장 for문)
		for(int num : array) {
			System.out.println(num);
		}
	}
}
  1. 배열을 출력할 때 역시 확장 for문을 활용할 수 있다.
    배열의 자료형과 같은 자료형을 가진 변수가 루프를 돌며 배열에 담긴 데이터를 읽어 와 저장하기 때문에 해당 변수를 출력하면 된다.
for(int num: array) {
	System.out.println(num);
}

배열에 문자열을 저장하는 것 역시 가능하다. 이를 '객체형 배열'이라고 하며 방법 상에 큰 차이는 없다.

package kr.s06.array;

public class ArrayMain06 {
	public static void main(String[] args) {
		//문자열을 저장하는 배열 사용하기
		//배열 선언 및 생성
		String[] array = new String[3];
		
		//배열의 초기화
		array[0] = "Java";
		array[1] = "Oracle";
		array[2] = "HTML";
		
		//반복문을 이용한 배열의 요소 출력
		for(int i=0;i<array.length;i++) {
			System.out.println(array[i]);
		}
		System.out.println("=================");
		
		//확장 for문을 이용한 배열의 요소 출력
		for(String str : array) {
			System.out.println(str);
		}
	}
}

보다시피 선언 및 생성, 초기화 과정이 동일하며 확장 for문 역시 사용 가능하다.


다음은 위에서 작성해 본 성적 프로그램과 달리, 값을 직접 배열에 입력하여 성적을 처리하는 프로그램을 만들어 보았다.
> Scanner, 배열, for문, do~while문을 활용해 성적 프로그램 만들기


배열을 배우기 이전부터 우리는 배열을 사용하고 있었는데, 그건 바로 진입점(main)이다.

package kr.s06.array;

public class ArrayMain08 {
	public static void main(String[] args) {
		//클래스를 실행할 때 외부에서 데이터 전달
		//if문을 통해 args 배열에 데이터가 있는지 아래와 같이 확인
		
		if(args.length > 0) {
			for(int i=0;i<args.length;i++) {
				System.out.println(i + " : " + args[i]);
			}
		}else {
			System.out.println("입력한 내용이 없습니다.");
		}
	}
}
  1. 우리가 명시해왔던 public static void main(String[] args)에서 args는 문자열을 넣을 수 있는 배열명을 말하며, 이 args 배열에 외부에 존재하는 데이터를 넣어 출력할 수 있다.

  2. 이때 ctrl + F11 단축키를 사용하는 대신 'Run as > Run configurations'를 직접 클릭해야 외부에서 데이터를 가져와 실행할 수 있다.

  3. Run configurations를 클릭하면 아래와 같은 팝업창이 뜨는데, 이때 main 탭에서 구동하려는 클래스를 찾아 올바르게 선택하고, Argument 탭에서 입력하고자 하는 값을 입력하고 Run을 누르면 콘솔에 해당 데이터가 출력된다.
    Run configurations
    이때 공백이 구분자이다.

  4. 만약 데이터를 입력하지 않는다면 에러가 아닌 무반응이 일어난다. 그 이유는 args라는 배열은 이미 만들어져 있기 때문이다. 다만 데이터가 입력되지 않아 length가 0인 상황인데, 이를 구별하기 위해 if문으로 경우를 나누어 출력하도록 코드를 작성하였다.
    전달되는 데이터가 있음(= 길이가 0 이상): if(args.length > 0) {
    전달되는 데이터가 없음: else {System.out.println("입력한 내용이 없습니다.");}

  5. 공백이 구분자인 상황에서 공백을 포함한 문자열을 하나의 index에 넣고 싶다면 ""(큰 따옴표)를 이용한다.
    큰 따옴표

그렇다면 String[] args숫자를 입력하고 싶다면 어떻게 하면 될까?

package kr.s06.array;

public class ArrayMain09 {
	public static void main(String[] args) {
		
		//전달되는 데이터는 모두 문자열로 인식하기 때문에
		//덧셈을 하지 못 하고 문자열 연결을 수행함
		System.out.println(args[0] + args[1]);
		System.out.println("====================");
		
		//String => int 변환 (함수의 도움 필요)
		int num1 = Integer.parseInt(args[0]);
		int num2 = Integer.parseInt(args[1]);
		
		System.out.println("합계 : " + (num1 + num2));
	}
}
  1. System.out.println(args[0] + args[1]); 위와 같이 코드를 작성하고 아래와 같이 값을 입력하면,
    숫자 연결
    입력한 숫자의 자료형이 String이 되기 때문에 '+'가 연산이 아닌 연결>이 된다.
    따라서 출력값은 '12345678'이다.

  2. 연산을 원한다면, String을 int로 변환하는 함수의 도움이 필요하다.
    그 함수는 바로 Integer.pareInt();이다.
    이를 적용해 다음과 같이 코드를 작성하고 똑같은 값을 입력하면,

int num1 = Integer.parseInt(args[0]);
int num2 = Integer.parseInt(args[1]);
System.out.println("합계 : " + (num1 + num2));

(num1 + num2)의 출력값은 '6912'가 된다.

위 예제의 출력식을 정리하면 다음과 같다.

출력)
12345678
====================
합계 : 6912


위에서 배운 내용을 토대로 2가지 실습을 진행하였다.

package kr.s06.array;

public class ArrayMain10 {
	public static void main(String[] args) {
		/*
		 * [실습]
		 * 1) 10, 20, 30, 40, 50을 초기값으로 갖는 1차원 배열을 test 이름으로
		 * 선언, 생성, 초기화 하시오.
		 * 2) 반복문을 이용해서 출력하시오.
		 * 3) 확장 for문을 이용해서 출력하시오.
		 * 4) 인덱스3의 데이터를 100으로 변경하시오.
		 * 5) 마지막 요소의 값을 200으로 변경하시오.
		 * 6) 반복문을 사용하여 모든 요소의 값을 0으로 초기화하시오.
		 * 7) 홀수 인덱스에 10, 짝수 인덱스에 20 저장
		 * 8) 모든 요소의 총합과 평균(총합을 요소의 수로 나눔)을 구하고 출력하시오.
		 * (sum(총합), avg(평균))
		 */
		
		//1)
		int[] test = {10, 20, 30, 40, 50};
		
		//2)
		for(int i=0;i<test.length;i++) {
			System.out.println("test[" + i + "]: " + test[i]);
		}
		System.out.println("===============");
		
		//3)
		for(int num : test) {
			System.out.println(num);
		}
		System.out.println("===============");
		
		//4)
		test[3] = 100;
		
		//5)
		test[test.length-1] = 200;
		
		//6)
		for(int i=0;i<test.length;i++) {
			System.out.println(test[i]=0);
		}
		System.out.println("===============");
		
		//7)
		for(int i=0;i<test.length;i++) {
			if(i%2==1) {
				System.out.println(test[i]=10);
			}else if(i%2==0) {
				System.out.println(test[i]=20);
			}
		}
		System.out.println("===============");
		
		//8)
		int sum = 0, avg = 0;
		
		for(int i=0;i<test.length;i++) {
			sum += test[i];
		}
		
		avg = sum / test.length;
		
		System.out.printf("총점: %d%n", sum);
		System.out.printf("평균: %d%n", avg);
	}
}

위 실습에서 유의해야 하는 문제는 5~8번이다.

  1. 5) 마지막 요소의 값을 200으로 변경하시오.
    이때 마지막 요소는 test.length가 아니라 test.length-1을 통해 구해야 한다. index는 0에서부터 출발하기 때문에 마지막 요소의 인덱스는 배열의 길이에서 1을 빼야 하기 때문이다.

  2. 6) 반복문을 사용하여 모든 요소의 값을 0으로 초기화하시오.
    for문을 돌며 인덱스 값이 될 i를 0부터 test.length 전까지 증가시켜 주는데, 이때 각 인덱스가 해당하는 방에 0을 대입하는 동시에 확인 차 출력을 하기 위해서는 다음과 같이 코드를 작성하면 된다.

for(int i=0;i<test.length;i++) {
	System.out.println(test[i]=0);
}
  1. 7) 홀수 인덱스에 10, 짝수 인덱스에 20 저장
    for문 안에서 if문을 활용해 홀수인지 짝수인지 조건 체크를 하고, 그에 따라 맞는 값을 각각 대입해 주면 된다. 이때 조건은 '2로 나누었을 때 나머지가 1인지 0인지'로 정한다.
for(int i=0;i<test.length;i++) {
	if(i%2==1) {
		System.out.println(test[i]=10);
	}else if(i%2==0) {
		System.out.println(test[i]=20);
	}
}
  1. 8) 모든 요소의 총합과 평균(총합을 요소의 수로 나눔)을 구하고 출력하시오.
    성적 구하는 프로그램을 만들었을 때와 동일한데, 평균을 저장할 변수를 실수(float) 형태로 저장하라는 언급이 없으니, 정수형으로 생성한다.
    이에 따라 평균을 구하는 식은 강제 형변환 없이 avg = sum / test.length;가 된다.


다음 실습은 배열을 활용한 구구단 프로그램을 만드는 것이다.
> Scanner, 배열, for문을 활용해 구구단 프로그램 만들기


그 다음 실습은 요소의 수를 지정하고, 그에 맞게 입력을 받은 다음 요소를 역순으로 출력하기였다.

package kr.s06.array;

public class ArrayMain12 {
	public static void main(String[] args) {
		/*
		 * [실습]
		 * 요소의 수를 지정하고 지정된 수로 정수형 배열을 생성해서 해당 배열에
		 * 정수를 저장하시오.
		 * 배열에 저장된 요소를 역순으로 출력하시오.
		 * 
		 * [입력 예시]
		 * 요소수: 3
		 * array[0] : 20
		 * array[1] : 10
		 * array[2] : 5
		 * 
		 * [출력 예시]
		 * 요소를 역순으로 정렬했습니다.
		 * array[0] : 5
		 * array[1] : 10
		 * array[2] : 20
		 */
		
		java.util.Scanner input = new java.util.Scanner(System.in);
		
		System.out.print("요소수: ");
		int num = input.nextInt();
		
		int[] array = new int[num];
		
		for(int i=0;i<array.length;i++) {
			System.out.print("array[" + i + "] : ");
			array[i] = input.nextInt();
		}
		//역순으로 정렬
		for(int i=0;i<array.length/2;i++) {
			int t = array[i];
			array[i] = array[array.length-1-i];
			array[array.length-1-i] = t;
		}
		System.out.println("요소를 역순으로 정렬했습니다.");
		//          array 배열 길이가 num이니까
		for(int i=0;i<num;i++) {
			System.out.println("array[" + i + "]: " + array[i]);
		}
		
		input.close();
	}
}

우선 Scanner를 통해 요소수를 입력 받고, 그 수에 맞는 길이를 가진 배열을 생성, 데이터를 저장해 보자.

  1. Scanner를 통해 입력 받은 요소수를 num이라는 정수형 변수에 저장하고, 이를 array라는 배열의 길이로 명시하면 아래와 같은 코드가 완성된다.
    int[] array = new int[num];

  2. 다음은 array라는 배열에 num 만큼 루프를 돌며 데이터를 저장한다.

for(int i=0;i<array.length;i++) {
			System.out.print("array[" + i + "] : ");
			array[i] = input.nextInt();
		}

이때, for문에 array.length 대신 num이 들어가도 동일한 결과가 출력 되며 i가 0에서 num 전까지 변화하는 동안 Scanner로 데이터를 각 인덱스마다 입력 받아 저장한다.

  1. 역순으로 출력하기에 앞서 역순으로 정렬하는 과정이 필요하다. 이때 핵심은 for문을 돌며 인덱스가 서로 대칭인 요소들을 바꿔치기하는 것이다.

    3-1. 우선 배열을 반으로 접어 마주보는 인덱스들의 값을 서로 바꿔치기 한다고 생각해 보자. 그에 따라 for(int i=0;i<array.length/2;i++) { for문에서 루프를 돌아야 하는 횟수는 0에서 배열의 전체 길이의 반인 array.length/2** 전까지가 된다.

    3-2. 그 다음은 for문 안에서 데이터 교체를 위한 임의의 변수를 지정하고, 그 임의 변수에 array[i] 값을 넣어 초기화를 해준다. int t = array[i];

    3-3. 다음은 비어 있는 array[i]에 array[array.length-1-i] 값을 넣어준다.

    왜 array[array.length-1-i]일까?
    ① array.length-1은 마지막 인덱스이다.
    ② 여기서 i의 대척점에 있는 인덱스를 구하기 위해 i를 빼준다.
    마지막 인덱스에서 i만큼 앞으로 당겨온다고 생각하면 쉽다.
    ex. 배열 길이 6, 인덱스 0~5 → array[1]의 대칭: array[6-1-1] = array[4]

    3-4. 마지막으로 비어 있는 array[array.length-1-i]에 임의 변수에 저장되어 있던 array[i] 값을 넣어준다.

  2. 그렇게 인덱스가 대칭인 요소들을 바꿔치기 한 후에는 for문을 이용해 요소를 출력한다. 여기서 num 대신 array.length를 써도 같은 값이 출력된다.

for(int i=0;i<num;i++) {
			System.out.println("array[" + i + "]: " + array[i]);
		}
  1. 모든 작업이 끝나면, input.close(); 해준다.

2. 다차원 배열

다차원 배열이란 1차원 배열을 그룹으로 묶은 것으로 행과 열의 개념을 갖게 된다.

다차원 배열

이러한 다차원 배열의 요소를 반복문을 통해 출력하고자 하는 경우 이중 반복문이 필요하다. 다음 '2차원 배열' 예제를 통해 다차원 배열의 구조와 출력에 대해 자세히 알아 보자.

package kr.s06.array;

public class SecondArrayMain01 {
	public static void main(String[] args) {
		int[][] test;
		test = new int[2][3];
		
		//행번호 열번호
		test[0][0] = 100;
		test[0][1] = 200;
		test[0][2] = 300;
		
		test[1][0] = 400;
		test[1][1] = 500;
		test[1][2] = 600;
		
		//2차원 배열의 요소 출력
		System.out.println(test[0][0]);
		System.out.println(test[0][1]);
		System.out.println(test[0][2]);
		
		System.out.println(test[1][0]);
		System.out.println(test[1][1]);
		System.out.println(test[1][2]);
		
		System.out.println("==============");
		
		//반복문을 이용한 2차원 배열의 요소 출력
		for(int i=0;i<test.length;i++) {
			for(int j = 0;j<test[i].length;j++) {
				System.out.println(
						"test[" + i + "][" + j + "]: " + test[i][j]);
			}
		}
		
		//2차원 배열의 선언 및 생성
		int[][] test2 = new int[3][4]; //3행 4열
		
		//2차원 배열의 선언, 생성(명시적 배열 생성), 초기화
		int[][] test3 = new int[][] {
			                         {10, 20, 30},
			                         {40, 50, 60}
		                            };
		                            
		//2차원 배열의 선언, 생성(암시적 배열 생성), 초기화
		int[][] test4 = {
				          {100, 200, 300, 400},
				          {500, 600, 700, 800}
		                };
		}
	}

  1. 기본적인 생성과 선언, 초기화와 출력은 일차원 배열과 다르지 않다. 단, 2차원 배열의 경우 행과 열의 개념을 가지고 있기에 그 부분을 함께 명시해 줘야 한다.
int[][] test; //2차원 배열 선언
test = new int[2][3]; //2차원 배열 생성

//2차원 배열 초기화
//행번호 열번호
test[0][0] = 100;
test[0][1] = 200;
test[0][2] = 300;
		
test[1][0] = 400;
test[1][1] = 500;
test[1][2] = 600;

//2차원 배열의 요소 출력
System.out.println(test[0][0]);
System.out.println(test[0][1]);
System.out.println(test[0][2]);
		
System.out.println(test[1][0]);
System.out.println(test[1][1]);
System.out.println(test[1][2]);

위와 같이 0번 행의 0번 열, 0번 행의 1번 열...로 index가 나뉘어 각 방마다 데이터를 저장하는 것이 2차원 배열의 구조다.

  1. 반복문을 이용해 2차원 배열의 요소를 출력하기 위해서는 앞서 말한 것처럼 이중 반복문 즉 '이중 for문'이 필요하다.
    그 이유는 요소의 일반적인 출력에서도 알 수 있듯 2차원 배열은 행과 열이 모두 달라지기 때문에 반복문을 통해 순차적으로 증가시켜줘야 하는 대상이 둘이기 때문이다.
    System.out.println(test[0][0]);
    System.out.println(test[0][1]);
    → .......
    System.out.println(test[1][2]);

  2. 단, 이때 i와 j를 아래와 같이 직접 카운팅해서 숫자로 명시하기 보다는
    직접 명시

//반복문을 이용한 2차원 배열의 요소 출력
for(int i=0;i<test.length;i++) {
	for(int j = 0;j<test[i].length;j++) {
		System.out.println(
			"test[" + i + "][" + j + "]: " + test[i][j]);
		}
	}

위 예제와 같이 length를 활용하는 것이 좋다.
이때 test.length는 우리가 만든 test라는 배열의 '행의 길이'를 말하며, i는 행의 번호를 바꾸게 하는 변수가 된다. 그리고 test[i].length각 행에 접근해 length를 호출하는 형태로 '열의 길이'를 말하며 j는 열의 번호를 바꾸게 하는 변수가 된다.

  1. 그리고 다차원 배열 역시 생성, 선언, 초기화가 동시에 가능하다.
		//2차원 배열의 선언 및 생성
		int[][] test2 = new int[3][4]; //3행 4열
		
		//2차원 배열의 선언, 생성(명시적 배열 생성), 초기화
		int[][] test3 = new int[][] {
			                         {10, 20, 30},
			                         {40, 50, 60}
		                            };
		                            
		//2차원 배열의 선언, 생성(암시적 배열 생성), 초기화
		int[][] test4 = {
				          {100, 200, 300, 400},
				          {500, 600, 700, 800}
		                };

이때 배열 생성 연산자 new를 명시하는 것은 '명시적 배열 생성'이고, 그냥 중괄호만 명시하는 것은 '암시적 배열 생성'이라는 점은 동일하지만 행을 의미하는 중괄호를 중괄호 안에 넣어주는 형태로 행과 열을 구분한다는 점이 다르다.

test4 배열로 예를 들어 설명하자면 test4[0][0] = 100;, test4[1][0] = 500;이 되는 셈이다.

다음은 다차원 배열을 활용해 좀 더 고차원의 성적 프로그램 2가지 만들어 보았다.

> 다차원 배열, for문을 활용해 성적 프로그램 만들기

> Scanner, 다차원 배열, for문, do~while문을 활용해 성적 프로그램 만들기

profile
Done is better than perfect.

0개의 댓글