자바 배열

CSJ·2022년 4월 24일

JavaStudy

목록 보기
3/4
post-thumbnail

배열

교실 학생이 10명이 있고, 10명의 영어점수의 평균과 총합계를 구하는 예를 생각해 보자. 10개의 점수를 저장할 변수가 필요한데, 여러 개의 변수를 한 개로 효과적으로 관리할 수 있는 것이 배열이다.

작성 코드

public class Main2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub


		//배열
		int[] englishScores = {80,90,30,40,70,95,76,98,100,77};
		int sum = 0;
		double average = 0.0;
		
		for(int i=0;i<10;i++) {
			sum = sum + englishScores[i];
		}
		System.out.println(sum);
		
		average = (double)sum / (double)englishScores.length;
		System.out.println(average);
		
		
	}

}

위와 같이 int[] englishScore 와 같이 대괄호 []를 사용하여 변수를 선언하면 단순한 변수가 아니라 배열인 변수로 사용할 수 있다. 아래와 같은 방법으로도 사용이 가능하다.

실행 결과

756
75.6

위 프로그램을 실행시킨 결과이다.

작성 코드

int[] englishScores = new int[10];
englishScores[0] = 80;
englishScores[1] = 90;
englishScores[2] = 30;
englishScores[3] = 40;
englishScores[4] = 70;
englishScores[5] = 95;
englishScores[6] = 76;
englishScores[7] = 98;
englishScores[8] = 100;
englishScores[9] = 77;

new int[10] 으로 10개의 저장 공간을 만들었으므로, englishScore[0]부터 시작해서 englishScore[9]까지 총 10개를 사용할 수 있다. 만약 englishScore[10]로 쓰면 0부터 9까지가 10개인데 11번쨰 공간에는 아무것도 없는데 값을 참조하려고 하니까 에러가 난다.

그리고, englishScores.length는 배열의 크기 정보인 10이라는 값이 자동으로 들어가 있어서 사용할 수 있다. 즉, 배열변수.length 형태로 배열크기 정보를 참조한다.
정수가 아닌 double형 배열이나 String형 배열은 아래와 같이 만들 수 있다.

double[] arrayDouble = new double[10];
String[] arrayString = new String[10];

요약하자면, 배열(array)이라는 것은 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것으로 많은 양의 값(데이터)을 다룰 때 유용하다.

형 변환(Type Conversion)

평균을 구하는 부분을 보면 아래와 같이 정수형 변수인 sum과 length의 앞에 소괄호()로 실수인 double로 변환을 한 부분을 볼 수 있다. 이렇게 괄호로 Type을 변환한 것을 형 변환이라고 한다.

average = (double)sum / (double)englishScoren.length;

형 변환을 하지 않아도 평균을 구할 수 있지만 average = sum / englishScores.length; 이렇게 계산하면 75.6이라는 값이 나오지 않고, 75.0이라고 나온다. 소수점까지 정확한 계산을 하려면 (double)을 사용해 형 변환을 해주면 된다.

이차원 배열

한 학교에 학급이 7개가 있는 경우를 생각해보자. 한 학급에 10명의 학생이 있다면 총 70명의 점수를 저장하고, 계산해야 한다. 물론 int[] englishScores = new int[70];으로 70개의 배열을 만들어도 좋지만, 학급과 학급 내 학생을 구분하여 2차원 배열을 사용하는 것이 좋다.

int[][] arr2 = new int[3][4];

같이 이차원 배열을 사용하면, 아래 그림과 같이 3*4의 12개의 이차원 배열 저장공간(변수)가 만들어 진다.

1번째 칸2번째 칸3번째 칸4번째 칸
arr2 [0][0]arr2 [0][1]arr2 [0][2]arr2 [0][3]
arr2 [1][0]arr2 [1][1]arr2 [1][2]arr2 [0][3]
arr2 [2][0]arr2 [2][1]arr2 [2][2]arr2 [2][3]

작성 코드

public class Main2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		int[][] englishScores =
			{ {80,90,30,40,70,95,76,98,100,77},
				{94,22,34,21,65,23,65,21,66,55},
				{30,40,70,95,76,98,100,77,22,66},
				{40,70,95,76,98,100,77,100,99,88},
				{10,90,30,40,70,95,76,98,67,45},
				{89,90,30,40,70,95,76,98,25,78},
				{97,90,99,40,70,95,76,98,54,23},
			};
		int sum = 0;
		double average = 0.0;
		for(int i=0;i<7;i++) {
			for(int j=0;j<10;j++) {
				sum = sum + englishScores[i][i];
			}
		}
		System.out.println(sum);
		average = (double) sum / 70.0;
		System.out.println(average);
	}

}

int[][] englishScores = new int[7][10]; 와 같이2차원 배열을 선언하고 나중에 값을 할당하여 사용할 수 있다.

실행 결과

4890
69.85714285714286

배열 안의 데이터 내림차순 정렬

앞에서 배운 영어점수의 일차원 배열을 점수가 높은 순부터 내림차순으로 정렬하는 예제를 만들어 보자.

작성 코드

public class Main2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

	int[] englishScores = {80,90,30,40,70,95,76,98,100,77};
		int temp = 0; // 순서 변경 시 임시로 값을 저장할 때 사용하는 임시 변수
		for (int i=0; i < englishScores.length; i++) {
			for (int j = i + 1; j < englishScores.length; j++) {
				if (englishScores[i] < englishScores[j]) {
                //내부의 값을 비교해서 큰 값이 뒤에 있으면 앞뒤값을 바꾼다
					temp = englishScores[i];
					englishScores[i] = englishScores[j];
					englishScores[j] = temp;
				}
				
			}
			System.out.print(englishScores[i] + " "); // 정렬된 값 출력
		}
	}

}

실행 결과

100 98 95 90 80 77 76 70 40 30

배열 안의 데이터 오름차순 정렬

이번에는 거꾸로 점수가 낮은 순에서 오름차순으로 정렬하려면 어떻게 할까? 아래와 같이 더 작은 값이 앞으로 오도록 부호만 <에서>로 바꾸어 주면 된다!

작성 코드

public class Main2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        
	int[] englishScores = {80,90,30,40,70,95,76,98,100,77};
		int temp = 0;
		for (int  i = 0; i < englishScores.length; i++) {
			for (int j = i +1; j < englishScores.length; j++) {
				if (englishScores[i] > englishScores[j]) {
					temp = englishScores[i];
					englishScores[i] = englishScores[j];
					englishScores[j] = temp;
				}
			}
			System.out.print(englishScores[i] + " ");
		}
	}

}

실행 결과

30 40 70 76 77 80 90 95 98 100

배열 데이터 반복 처리 : for each 문

배열을 편하게 상요하기 위해서 기존의 for 반복문 외에 for each 반복문을 사용하게 되면 배열을 다루는데 조금 더 편리함을 제공해 준다.

for (int i=; i<arr.length; i++)
system.out.print(arr[i]+" ")

위와 같은 반복문의 경우, for each 반복문을 사용하면 아래와 같이 줄여서 쓸 수 있다.

for (int e : arr)
system.out.print(arr[i]+" ")

즉, int[] arr = new int[10]; 정수형 배열 arr에 대해서 각각의 원소(element)값을 하나씩 e 변수에 대입을 하여 반복하는 문장이다.

출력 결과는 총합과 평균값으로 이전 for 반복문의 결과와 동일하다.

작성 코드

public class Main2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        
	int[] englishScores = {80,90,30,40,70,95,76,98,100,77};
		int sum = 0;
		double average = 0.0;
		for(int score : englishScores) {
			sum = sum + score;
		}
		System.out.println(sum);
		
		average = (double)sum / (double)englishScores.length;
		System.out.println(average);
	}

}

이번 벨로그에서는 배열,이차원배열,형 변환과 for each 반복문에 대해서 살펴보았습니다.

profile

0개의 댓글