9장 배열
이충기
명지대학교
들어가며
Q: 한 교과목의 성적 처리를 하는 프로그램에서 100명의 수강생들의 점수들을 저장해야 한다. 이 점수들을 어떻 게 저장해야 할까?
A:
배열
배열은 관련된 데이터를 그룹화하여 사용하는 간단하나 강력한 프로그래밍 언어의 구조이다.
배열은 같은 유형의 데이터 값들의 모음이다.
배열
0 1 2 3 4 5 6 7 8 9 82 98 85 74 69 93 88 80 76 72
크기가 N인 배열은 0 부터 N-1 사이의 지수를 가진다.
scores
전체 배열은이름을 가진다. 각 배열요소는 특정 지수에 저장된다.
이 배열은 10개의 값들을 포함한다.
그들의 지수는 0부터 9까지이다.
배열
배열 안에 저장되는 값들은 배열 요소들이라고 부른다.
배열은 같은 유형(요소 데이터 형)의 여러 값들을 저장한다.
요소 데이터 형은 기본형 혹은 참조형일 수 있다.
그러므로 우리는 정수들의 배열, 문자들의 배열, 혹은 문자 열 객체들의 배열 등을 만들 수 있다.
배열 그 자체는 객체이다.
배열
특정 위치에 있는 배열 요소를 나타내는 구문 배열명[지수]
예: scores[2]는 배열 scores의 세 번째 값을 나타낸다.
배열
배열 요소는 변수가 사용될 수 있는 곳에서는 어디나 사용될 수 있다.
예: scores[2] = 89;
scores[first] = scores[first] + 2;
average = (scores[0] + scores[1]) / 2;
System.out.println(scores[5]);
배열의 선언
배열은 객체이다. 따라서 배열을 만들기 위해서 먼저 배열 객체에 대한 참조 변수를 선언해야 한다.
int[ ] scores;
배열 선언에서 괄호가 요소 형 혹은 배열의 이름과 결합될 수 있다.
그러므로 다음의 두 선언들은 같다.
int[ ] scores;
int scores[ ];
다음으로 new 연산자를 사용하여 배열 객체를 생성해야 한다.
scores = new int[10];
배열의 선언
scores 배열은 다음과 같이 선언될 수 있다.
int[ ] scores = new int[10];
변수 scores 의 데이터형은 int[ ] (정수들의 배열)이다.
배열의 크기는 new 연산자 다음에 나오는 int[10]에서 정해진다.
즉, 크기는 10이다.
참조 변수 scores는 10개의 정수들을 저장할 수 있는 새 배열 객체를 가리킨다.
예: 배열 선언
double[ ] costs = new double[100];
boolean flags[ ];
flags = new boolean[20];
String[] names = new String[10];
범위 검사
배열이 만들어질 때 크기가 정해진다.
크기가 N인 배열은 0부터 N-1 사이의 지수를 가진다.
배열 요소가 사용될 때마다 지수가 범위 내에 있는 지를 자동적으로 검사한다.
배열 지수가 범위를 벗어나면 ArrayIndexOutOfBoundsException 이라는 예외(실행 오류)가 발생한다.
예: 범위 검사
char[ ] grades = new char[100];
for (int index = 1; index <= 100; index++) System.out.println(grades[index]);
위 코드에서 배열의 지수들은 0부터 99사이여야 한다.그러나 for 문에서 index가 100이 될 수 있다. 이는 오류이다.
문제
범위 검사
각 배열 객체는 크기를 저장하는 length라는 상수를 가진다.
배열의 크기는 다음과 같이 배열명을 사용하여 참조된다:
scores.length
length 는 배열의 가장 큰 지수가 아니라 요소들의 수를 저장한다.
예제 프로그램 1: 배열 선언 및 사용
// 사용자로부터 점수들을 읽어 배열에 저장하고 역순으로 출력한다 import java.util.Scanner;
public class ReverseScores {
public static void main (String[] args) {
Scanner scan = new Scanner (System.in);
int[ ] scores = new int[10];
int i;
for (i = 0; i < scores.length; i++) {
System.out.print ((i+1) + “번째 점수를 입력하세요: ");
scores[i] = scan.nextInt();
}System.out.println (“반대 순서의 점수들: ");
for (i = scores.length - 1; i >= 0; i--) System.out.print (scores[i] + " ");
초기화 목록
초기화 목록은 한 번에 배열 객체를 만들고 배열 요소들 을 초기화하기 위해 사용될 수 있다.
값들은 중괄호들 사이에 쉼표들로 구분된다.
배열의 크기는 초기화 목록에 있는 항목들의 수에 의해 결정된다.
예: char[ ] grades = {'A', 'B', 'C', 'D', ’F'};
예제 프로그램 2: 초기화 목록
// 배열내의 점수들을 출력한다 public class PrintScores {
public static void main (String[] args) {
int[] scores = {82, 98, 85, 74, 69, 93, 88, 80, 76, 72};
System.out.println (“배열 크기: " + scores.length);
System.out.println ("점수들: ");
for (int i = 0; i < scores.length; i++) System.out.print (scores[i] + " ");
} }
객체들의 배열
배열들은 객체들에 대한 참조들을 요소로서 저장할 수 있다.
예: String[] seasons = new String[4];
각 배열 요소는 null 값을 가진다.
객체들의 배열
배열 요소가 가리키는 객체들은 별도로 생성되어야 한다.
예: seasons[0] = "spring";
seasons[1] = "summer";
seasons[2] = "fall";
객체들의 배열
배열 객체를 만들 때 각 배열요소가 가리키는 객체들을 초기화 목록을 사용하여 만들 수 있다.
예: String[] grades = {“freshman“, "sophomore", "junior", "senior"};
배열 넘겨주고 받기
배열 전체가 메소드에 매개변수로서 넘겨질 수 있다.
이 경우 배열 객체에 대한 참조가 넘겨진다.
메소드 내에서 배열 요소를 바꾸는 것은 원 요소를 바꾼다.
배열 요소도 메소드에 넘겨질 수 있다.
이 경우 형식 매개변수의 형은 요소 형과 같아야 한다.
예제 프로그램 3: 배열 넘겨주기
// scores 배열 내의 가장 작은 점수를 찾는다 public int findMinScore(int[ ] scores) {
int minScore = scores [0];
for (int i = 1 ; i < scores.length ; i++) { if ( score [i] < minScore )
minScore = scores [i];
}
return minScore;
}
명령 줄 인수
main 메소드의 머리부를 고려하라.
public static void main(String[] args)
형식 매개 변수가 String 객체들의 배열이라는 것을 보여준다.
이 값들은 자바 해석기가 호출될 때 제공되는 명령 줄 인수들로부터 온다.
예제 프로그램 4: 명령 줄 인수
// 메시지의 제공자, 수신자와 메시지를 세 줄에 걸쳐 출력한다 public class PrintMessage {
public static void main(String[] args) {
System.out.println("From: " + args[0]);
System.out.println("To: " + args[1]);
System.out.println("Contents: " + args[2]);
} }
예제 프로그램 4: 실행 결과
>java PrintMessage 영수 지수 사랑해 From: 영수
To: 지수
Contents: 사랑해
해설: 명령 줄의 첫 번째 인수(영수)는 args[0]에 두 번째 인수(지수)는 args[1]에 세 번째 인수(사랑해)는 args[2]에 저장된다.
2차원 배열
이차원 배열은 배열들의 배열이다.
다음 문들은 똑같이 5행 4열의 이차원 배열을 만든다.
int[ ] salesTable[ ] = new int[5][4];
int salesTable[ ][ ] = new int[5][4];
int[ ][ ] salesTable = new int[5][4];
예제 프로그램 5: 평균 판매대수
// 각 판매원의 분기별 평균 판매대수를 구한다.
// salesTable[i][j]는 판매원 i의 j 분기의 판매 대수를 저장한다.
int sum;
double[ ] rowaverage;
rowaverage = new double[5];
for ( int i = 0 ; i < 5 ; i++ ) { sum = 0;
for ( int j = 0 ; j < 4 ; j++ )
sum = sum + salesTable[i][j];
rowaverage[i] = sum / 4.0 ; }
2차원 배열
초기화 목록을 사용하여 이차원 배열을 선언할 수 있다.
예: int[ ][ ] intarray = {{1,3,5,7,9} ,{2,4,6,8,10} };
이차원 배열의 각 행의 크기를 다르게 선언할 수 있다.
예: int[ ][ ] intarray;
intarray = new int[2][];
intarray[0] = new int[4];
intarray[1] = new int[5];
예제 프로그램 6: 점수 분포
문제: 임의의 개수의 점수들(0과 100사이)을 10점 단위의 구간으로 분류하고 각 구간에 속하는 점수들의 수를 구하여 출력하라.
변수들
- score: 점수
- frequency: 10개 구간의 빈도수를 저장하는 배열 객체 참조변수 - i: 반복 제어 변수
- scan: Scanner 객체 참조 변수
알고리즘은 다음 슬라이드에 있다.
완성 프로그램은 [프로그램 9.5]에 있다.
알고리즘
1. 첫 번째 점수를 요청하고 읽어 들인다
점수 = -1
2. 점수가 어느 구간에 속하는 지를 찾고 그 구간의 빈도를 1 만큼 증가시킨다
3. 다음 점수를 요청하고 입력 받는다 false
true
요약
배열
배열의 선언 및 사용
객체들의 배열
배열 넘겨주고 받기
명령 줄 인수
이차원 배열
예제 프로그램 작성