[Java] 배열과 for문, Enhanced-for문

김용준·2022년 9월 21일
0

Java Basic

목록 보기
12/22

배열이란?

배열은 같은 타입의 데이터를 여러개 저장할 수 있는 공간이다. 배열의 각 저장공간은 '인덱스(index)'를 따라 연속적으로 배치되어 있다. 인덱스는 배열의 저장공간마다 붙여진 일련번호다. 배열에 저장되어 있는 각각의 값을 '배열의 요소(element)'라고 한다. 배열에 저장할 수 있는 데이터의 개수를 배열의 '크기' 혹은 '길이'라고 한다. 배열의 특징은 다음과 같다.

  • 인덱스는 0부터 시작한다. (0 <= 인덱스 번호 < 배열의 길이)
  • Java의 배열은 한 번 정해진 길이를 변경할 수 없다.
  • Java의 배열은 동일한 타입의 값만 저장할 수 있다.

선언과 생성

선언

int[] array; 
정수형 배열의 '주소값'을 저장하는 변수 `array`를 선언한다.

생성

array = new int[5]
크기가 5인 정수형 배열을 생성하고 그 주소값을 `array`에 저장한다.

일반적으로 위 두 문장을 이어 다음과 같이 쓴다.

int[] array = new int[5]
자료형[] 참조변수명 = new 자료형[크기]
정수 5개를 담는 배열을 생성하고, 배열의 '주소값'을 변수 `array`에 대입한다.

배열을 처음 생성하면 배열의 자료형에 맞는 기본값들이 저장되어 있다.
예를 들어, 크기가 5인 정수형 배열이라면 0이 5개 저장되어 있다. 각 자료형의 기본값은 다음과 같다.

자료형기본값
int0
double0.0
char유니코드 첫 번째 문자
Stringnull (주소값 없음)
booleanfalse

또한, 배열의 길이를 나타내는 특별한 상수가 저장된다. 이미 생성된 배열의 길이는 변경할 수 없기 때문에 상수다. 배열이름.length를 통해 조회할 수 있다.

int[] array = new int[5]
길이가 5인 정수형 배열을 생성하고, 배열의 주소값을 변수 array에 대입한다.

int length = array.lengt
배열 array의 길이(5)를 변수 length에 대입한다.

데이터 저장

배열에 원하는 값을 저장하는 방법은 두 가지이다.
인덱스를 활용해 저장하거나 선언과 동시에 원하는 값을 저장하면된다.

int[] array = new [5]
array[0] = 10 	배열 array의 첫 번째에 10을 저장한다.
array[1] = 20	배열 array의 두 번째에 10을 저장한다.
5개의 인덱스 중 나머지에는 기본값이 저장된다.

int [] array = { 10, 20 }
배열 array의 첫 번째, 두 번째에 각각 10과 20이 저장된다.
배열의 길이는 자동으로 2가 된다.

String의 저장

일반적으로 정수같이 기본형을 저장하는 배열은 배열의 타입에 맞는 값이 저장되어 있다. 그러나 String배열은 각 인덱스에 String객체의 '주소값'이 저장되어 있다. 이처럼 객체를 저장하는 배열도 생성할 수 있다.

데이터 조회

배열에 저장된 값은 해당 값이 저장된 인덱스를 활용해서 조회할 수 있다. 배열에 저장된 값의 타입과 그 값을 저장하려는 변수의 타입은 일치해야 한다.

public class ArrayApp {
	
	public static void main(String[] args) {
	
		int[] intArray = {1, 2, 3};
        // 배열 생성
	
		int value1 = intArray[0];
		int value2 = intArray[1];
		int value3 = intArray[2];
        // 배열의 값들을 변수에 저장
	
		System.out.println(value1);
		System.out.println(value2);
		System.out.println(value3);
        // 배열의 값들이 저장된 변수를 활용하여 배열의 요소들 출력
	}
}
출력

1
2
3

for문의 활용

위에서 배운 배열이름.lengthfor문을 활용해 배열의 처음 요소부터 마지막 요소까지 접근할 수 있다. 아래 예제를 보자.

public class ArrayApp {

	public static void main(String[] args) {
		
		// 시험성적이 1등인 학생의 이름, 국어, 영어, 수학, 총점, 평균 출력하기
		String[] names = {"AAA", "BBB", "CCC", "DDD",};
		int[] korScores = {100, 90, 80, 85,};
		int[] engScores = {52, 87, 44, 82,};
		int[] mathScores = {72, 53, 81, 99,};
		
		int maxTotalScore = 0;
		int savedIndex = -1;
		
		for (int index = 0; index < names.length; index++) {
			int kor = korScores[index];
			int eng = engScores[index];
			int math = mathScores[index];
			int totalScore = kor + eng + math;
			
			if (totalScore > maxTotalScore) {
				maxTotalScore = totalScore;
				savedIndex = index;
			}
		}
		
		String name = names[savedIndex];
		int kor = korScores[savedIndex];
		int eng = engScores[savedIndex];
		int math = mathScores[savedIndex];
		int totalScore = kor + eng + math;
		double average = totalScore/3.0;
		
		System.out.println("이름: " + name);
		System.out.println("국어: " + kor);
		System.out.println("영어: " + eng);
		System.out.println("수학: " + math);
		System.out.println("총점: " + totalScore);
		System.out.println("평균: " + average);
	}
}
  1. 각 배열의 첫 번째 인덱스부터 for문 내부에 선언된 변수에 저장하여
    총점을 구한다.

  2. 현재 인덱스로부터 꺼낸 값이 maxTotalScore보다 크면 그 값을 maxTotalScore에 저장하고 현재 인덱스도 savedIndex에 저장한다.

  3. 현재 인덱스로부터 꺼낸 값이 maxTotalScore보다 작으면 다음 인덱스로 넘어간다.

  4. 1~3과정을 배열의 마지막까지 반복한 후, savedIndex를 이용해 총점이 1등인 학생의 값들을 출력한다.

Enhanced-for문의 활용

자료형[] 배열변수명 = {값1, 값2, 값3}

for (자료형 변수명 : 배열변수명) {
	수행문1
    수행문2
}
* 자료형 : 배열에 저장된 값의 타입이다.
* 변수명 : 배열의 각 요소를 저장할 변수의 이름이다.
* 배열변수 : 향상된 for문을 사용해서 반복처리할 대상배열이다.
* 향상된 for문은 지정된 배열변수의 배열의 모든 요소를 처음부터 끝까지 자동을 순회한다.
* 향상된 for문은 지정된 배열의 값을 순서대로 변수에 저장하고, 수행문을 실행한다.

Enhanced-for문을 활용하면 배열의 요소를 처음부터 끝까지 접근하기 위한 코드를 훨씬 간편하게 작성할 수 있다.

아래 예제는 크기가 5인 정수형 배열을 생성한 후, 배열의 모든 값을 출력하는 코드이다.

public class EnhancedForApp {
	
	public static void main(String[] args) {
		
		int[] intArray = new int[5];
		intArray[0] = 10;
		intArray[1] = 15;
		intArray[2] = 20;
		intArray[3] = 25;
		intArray[4] = 30;
		
		for (int element : intArray) {
			System.out.print(element + " ");
		}
	}
}
출력

10 15 20 25 30 

아래 예제는 Enhanced-for문을 응용하여 배열에서 최대값과 최소값을 찾는 코드이다.

public class EnhancedForApp {

	public static void main(String[] args) {
	
		int[] numbers = {10, 20, 5, 2, 99, 52, 44, 61};		
		
		int min = Integer.MAX_VALUE;	// int 자료형의 최대값 저장
		int max = Integer.MIN_VALUE;	// int 자료형의 최소값 저장
		
		for (int value : numbers) {
			if (value < min) {
				min = value;
			}
			if (value > max) {
				max = value;
			}
		}
		
		System.out.println("최소값: " + min);
		System.out.println("최대값: " + max);
	}
}

변수min의 초기값이 정수형의 최대값인 이유는 순회하고자하는 배열의 최소값보다 더 작은 값이 min에 저장되는 것을 방지하기 위함이다.
예를 들어 min의 초기값이 0이라면 배열의 최소값은 2지만, 배열을 순회하면서 그 어떤 값도 min에 저장되지 못할 것이다. max의 초기값이 정수형의 최소값인 이유도 마찬가지이다.

2차원 배열

1차원 배열과 다차원 배열
 		1차원 배열
 			자료형[] 변수명 = new 자료형[크기];
 			자료형[] 변수명 = {값, 값, 값, 값, ...};
 		
 		2차원 배열
 			자료형[][]변수명 = new 자료형[크기][크기];
 			자료형[][]변수명 = {{값, 값, 값}, {값, 값, 값}, {값, 값, 값}, ...};

2차원 배열을 포함해 배열 내부에 또 다른 배열을 가지는 구조를 다차원 배열이라고 한다. 2차원 배열은 행렬을 표현하는 데 사용할 수 있다.
아래 예제는 중첩 for문을 사용해서 2차원 배열에 저장된 값들을 출력하는 예제이다.

public class Array6 {

	public static void main(String[] args) {
    
		// 2차원 배열 생성
		int[][] scores = new int[2][3];
				
		// 2차원 배열에 값 저장
		scores[0][0] = 40;		
		scores[0][1] = 60;
		scores[0][2] = 30;
		scores[1][0] = 80;
		scores[1][1] = 90;
		scores[1][2] = 70;
		
		// 중첩 for문을 사용하여 2차원 배열에 저장된 값 출력
		for (int i = 0; i < 2; i++) {
			for (int j = 0; j < 3; j++) {
				System.out.print(scores[i][j] + " ");
			}
			System.out.println();
		}
		
		// 향상된 for문을 사용하여 2차원 배열에 저장된 값 출력
		for (int[] row : scores) {
			for (int value : row) {
				System.out.print(value + " ");
			}
			System.out.println();
		}
	}
}

위 예제의 2차원 배열을 도식화하면 다음과 같다.

profile
차선이 모여 최선이 된다.

0개의 댓글