학습목표
- 배열 개념 이해
- 배열 선언과 사용
- 객체들의 배열 이해
- 메소드에 배열 넘겨주고 받기 이해
- 이차원 배열 이해
- 문제 해결에 배열 적용하기
배열
배열은 관련된 데이터를 그룹화하여 구성하기 위해 사용되는 간단하나 강력한 프로그래밍 언어의 구조이다.
10명의 학생들의 점수들을 입력 받아 평균을 구하는데 다음과 같이 작성한다.
그러나 우리가 평균 외에 각 점수가 평균 이상인지 혹은 평균보다 작은지를 알고자 하는 비교연산을 사용할 때 위 코드는 문제가 있다. 입력받은 점수를 평균과 비교하기 위해 10개의 점수를 다시 입력받아야 하기 때문이다.
배열의 선언과 사용
배 열은 같은 유형의 변수들의 모음이다. 한 배열을 만들기 위해서 배열 객체에 대한 참조 변수를 선언해야 한다. 다음으로 new 연산자를 사용하여 배열 객체를 생성하고 참조 변수가 가리키게 한다. 여l를 들면 10개의 점수들을 저장하는 10개의 정수형(int 형) 변수들의 모음으로 이루어진 배열은 다음과 같이 선언할 수 있다.
위 코드에서 첫 번째 문은 scores라는 정수형 배열 객제를 가리키는 참조 변수(배열 이름)을 선언한다. 배열 scores의 데이터 형은 int[]이다. 이 형은 int 형 정수들의 배열을 나타낸다. 두 번째 문은 배열 안에 107H 의 int 형 정수 값들을 저장하기 위한 메모리를 할당한다. 이 문에서 배열의 크기는 new 연산자 다음에 나오는 int[10] 에서 정해진다.
한 문으로 합치면 다음과 같다.
위 문은 다음과 같이 10개의 int 형 변수들을 선언하는 것과 같다.
위 선언문에서 배열 scores 다음의 대괄호안의 숫자는 배열 내의 위치를 나타낸다. scores[O] 이나 scores[l] 과 같은 변수는 배열 요소(element) 라고 부른다. 배열 내의 위치는 정수형 연산식으로 나타낼 수 있다. 이 연산식을 지수(index 혹은 subscript)라고 부른다. 지수는 1이 아닌 0부터 시작한다. 따라서 크기가 10 인 배열의 첫 번째 요소의 지수는 0이고 마지막 요소의 지수는 9 이다. 특정 위치에 있는 배열 요소를 나타내기 위해 우리는 다음과 같은 구문을 사용한다.
배열이름[지수]
배열 요소는 변수가 사용될 수 있는 곳에서는 어디에서나 사용될 수 있다. 다음은 모두 유효한 표현식이다.
다음 그림은 10개의 시험 점수를 저장하는 scores라는 배열을 보여준다(지수는 0부터 시작함에 유의하라).
배열은 같은 유형의 데이터 값들을 저장하는 변수들의 모음이기 때문에, 정수 값과 실수 값 두개의 데이터 유형으로 이루어진 배열은 선언할 수 없다.
배열을 다르게 선언할 수 있다. 배열 형의 괄호를 배열의 이름과 결합할 수 있다.
그러나 첫 번째 선언이 더 읽기 쉬우므로 사용이 권장된다.
한 배열에 저장되는 모든 값들은 같은 데이터 형을 가진다. 배열이 저장하는 값들의 데이터 형은 배열 요소 형이라고 부른다. 배열 요소의 데이터 형은 기본형 혹은 참조형일 수 있다. 그러므로 우리는 정수들의 배열 문자들의 배 열 혹은 문자열 객제틀의 배 열을 만들 수 있다.
크기가 Length이고 배열 요소 형이 Base_Type인 배열을 만드는 구문은 다음과 같다.
Base_Type[] Array_Name = new Base Type[Length];
배열 내에 있는 배열 요소들의 수는 배열의 크기라고 부른다. 배열의 크기는 위 구문에서 Length어l 의해 정해진다. 위의 배열 생성 문은 다음과 같이 2 개의 문으로 나눌 수 있다.
Base_Type[] Array_Name;
Array_Name = new BaseType[Length];
배열 선언의 다른 예들은 다음과 같다.
double[] costs = new double[100];
boolean[] flags = new boolean[50];
다음 프로그램은 10명의 학생들의 점수들을 입력 받아 평균을 구하고 각 점수가 평균 이상 혹은 미만인지를 보여준다.
예제 1) ProcessScore
범위 검사
배열이 만들어질 때 크기가 정해진다. 크기가 N인 배열은 0부터 N- 1 사이의 지수를 가진다. 이 배 열의 지수는 이 범위 내 에 있어 야 한다. 배열 요소가 사용될 때 마다 그 요소의 지수가 범위 내에 있는지를 자동적으로 검사한다. 만약 배열 지수가 범위를 벗어나면 ArraylndexOutOfBoundsException이라는 예외 (exception)가 발생한다. 에외는 실행오류이다. 예를 들어 다음 배열 선언문을 고려하라.
배열 grades는 크기가 100 인 문자들의 배열이다. 따라서 그 배열의 지수들은 0부터 99사이의 값들만을 사용할 수 있다 따라서 다음 코드는 예외를 발생시킨다.
이 코드에서 index가 100이 될 수 있다. 그러나 배열 grades의 최대 지수가 99 이므로 ArrayIndexOutOfBoundsException이라는 예외가 발생한다. 위와 같이 배열의 지수가 범위를 하나 만큼 벗어나는 오류는 프로그래머가 자주 범하는 실수이다. 배열 지수가 1부터 시작하지 않고 0부터 시작한다는 사실을 잊어 버려서 생기는 오류이다.
초기화 목록
초기화 목록은 한 번에 배열 객체를 만들고 배열 요소들을 주어진 값들로 초기화하기 위해 사용한다. 이는 변수 선언을 할 때 초기 값을 주는 것과 비슷하다. 초기화 목록의 값들은 중괄호들 사이에 있고 쉽표들에 의해 구분된다. 배열의 크기는 초기화 목록에 있는 항목들의 수에 의해 결정된다. 예를 들면
위 선언문에서 초기화 목록에 5개의 값이 있으므로 배열 grades의 크기는 5 이다. 위 선언문의 실행 결과는 다음과 같다.
초기화 목록은 배 열 선언문 내에서만 사용될 수 있다.
각 배 열은 크기를 저장하는 length 라는 상수를 가진다. 이 상수를 사용하여 다음과 같이 for문을 작성할 수 있다.
이 for 문은 우라가 scores 배열의 크기가 변경될 때 수정할 펼요가 없기 때문에 더 일반적이다.
객체들의 배열
지금까지 배열은 정수들과 실수들과 같은 기본형 값들을 저장하기 위해 사용되었다. 배열요소들은 기본형 값들로 제한되지 않는다. 배열들은 객체들에 대한 참조들을 요소로서 저장할 수 있다. 객체들에 대한 참조 값들이 배열 내에 저장될 때 각 요소는 별도의 객체이다. 즉 객체들의 배열은 객체 참조들의 배열이다. 다음 선언문을 고려하라
seasons는 String 객체들에 대한 참조들의 배열이다. new 연산자는 배열 객제를 생성하고 4개의 String 객체들의 참조 값들을 저장하기 위한 공간을 마련한다. 이 선언문은 어떠한 String 객체들도 생성하지 않는다. 처음에 그 배열은 다음과 같이 그릴 수 있다.
각 배열 요소는 null 값을 가진다. 다음으로 아래와 같은 코드가 실행된다고 하자.
그러면 그 배열은 다음과 같이 그릴 수 있다.
배열 seasons는 한 배열 객체이다. 각 배열 요소가 가리키는 객체들은 별도로 생성되어야 한다.
String 객제들은 문자열 상수들을 사용하여 만들 수 있다. 배열 객제를 만들 때 각 배열요소가 가리키는 객체들을 초기화 목록을 사용히여 만들 수 있다. 예를 들면 다음 선언문은 grades라는 배열 객체를 가라카는 참조 변수를 선언하고 그 배열 요소들을 초기화 목록을 사용하여 네 개의 String 객체들에 대한 참조들로 채운다.
객체들의 배열의 일반적인 예를 들어보자. 우리는 학생을 모델하는 Student 클래스를 사용한다. Student 클래스의 변수들과 메소드들은 다음 표에 요약되어 있다.
변 수 | name : 학생의 이름 |
number : 학생의 학번 | |
메소드 | Student (String newName, int newNumber): 학생의 이름이 newName이고 학번이 newNumber인 Student 객체를 생성한다. |
getName(): 학생의 이름을 반환한다. | |
getNumber(): 학생의 학번을 반환한다. | |
setName (String newName): 학생의 이름을 newName으로 변경한다. | |
setNumber (int newNumber): 학생의 학번을 newNumber로 변경한다. |
Student 객체들의 배열이 어떻게 만들어지고 처리되는지 알아본다. 다음은 Student 객체들의 배열을 가리키는 참조 변수를 선언하고 생성하는 코드이다.
위 코드에서 배열 요소들(Student 객체들)은 아직 만들어지지 않았고 배열 객체만이 만들어졌다는 점에 유념하라. 배열 요소들은 현재 어떤 객체도 가리키지 않는다. 따라서 각 배열 요소의 값은 null이다. 그림에서는 null 값을 - 로 표현하였다. 각 배열 요소는 Student 객체를 가리켜야 하기 때문에 Student 객체는 새로 만들어야 한다. 이름이 '홍길동'이고 학번이 101인 한 Student 객체를 생성하고 배열의 첫 번째 요소가 그 객체를 가리키게 하기 위한 코드는 다음과 같다.
다음 프로그램은 객체들을 생성하여 배열을 만들고 이를 출력하는 프로그램이다.
배열 넘겨주고 받기
배열도 객제이 므로 메소드에 매열을 넘겨 주고 메소드로부터 배열을 반환받는 것도 같으나 몇 가지 추가적인 규칙들이 있다. 우리는 배열 전체를 메소드에 매개 변수로 넘길 수 있다. 이 경우 배열 객체에 대한 참조(주소값)가 넘겨진다. 그에 따라 형식 매개 변수들과 실제 매개 변수들이 서로에 대한 별명들이 된다. 따라서 메소드 내에서 배열 요소를 바꾸는 것은 원 요소를 바꾼다. 배열 요소도 메소드에 넘겨질 수 있다. 이 경우에 넘겨지는 형식 매개 변수의 형은 배열요소 형과 같아야 한다.
시험 점수들을 저장하는 배열 내의 가장 작은 점수를 저장하는 배열 요소를 반환하는 메소드를 고려하자. 이 메소드에 우리는 시험 점수들의 배열을 넘겨 주어야 한다. 이 메소드는 다음과 같이 작성할 수 있다.
메소드의 형식 매개변수 scores의 데이터형은 int[] 이다. 이는 scores가 정수형 배열이라는 것을 나타낸다.
같은 클래스에서 이 메소드를 호출하기 위해서 우리는 다음과 같이 할 수 있다.
위 코드의 메소드 호출에서 우리는 scoreArray 배열 전체가 아닌 그 배열을 가리 키는 참조 값을 넘겨준다. 따라서 findMinScore 메소드가 실행될 때 scores는 scoreArray가 가리키는 배 열 객제를 가리킨다.
다음으로 메소드로부터 배열을 반환하는 예 를 고려 해 보자. 사용자로부터 시험접수들의 수와 학생들의 시 험점수들을 넘겨받아 그 점수들의 배 열을 반환하는 메소드를 작성 하면 다음과 같다.
위 메소드의 반환형은 int[]이다. 이는 이 메소드가 정수들의 배열을 반환한다는 것을 나타낸다. 배열은 참조형이기 때문에 정수들의 배열을 가리키는 참조 값이 반환된다.
위 메소드는 다음과 같이 호출될 수 있다.
새 배열은 inputGrades 메소드에 의해 만들어 지기 때문에 여기서 그 매열을 만들 필요는 없다.
명령 줄 인수
우리는 지금까지 다룬 모든 프로그램은 main 메 소드를 가지고 있다. 지금까지 main 메소드의 머리부의 설명을 미루어왔으나 이제 그 의미를 살펴보자 main 메소드의 머리부는 다음과 같이 선언된다.
이 머리부는 main 메소드에 대한 형식 매개 변수가 String 객체들의 배열이라는 것을 보여준다. 자바 실행 환경은 응용 프로그램이 실행을 위해 해석기에 제출될 때 main 메소드를 호출한다. 이때 제공되는 명령 줄 인수들(arguments)이 String[] 매개 변수에 대응된다. 즉 해석기가 호출될 때 명령 줄에 있는 추가 정보가 프로그램 내에서 사용되도록 하기 위해 args 배열에 저장된다.
다음 프로그램은 한 메시지를 출력하기 위해 명령 줄 인수들을 이용한다. 첫 번째 인수는 메시지의 제공자,두 번째 인수는 메시지의 수신자와 세 번째 인수는 메시지를 나타낸다.
프로그램은 세 개의 인수 값을 세 개의 줄에 출력한다.
main 함수에 인수를 주는 방법
입력 예시: java [프로그램명] Yongsoo Jisu Saranghae!!!
출력:
송신자: Yongsoo
수신자: Jisu
내용: Saranghae!!!
이차원 배열
행과 열로 이루어진 표는 많은 다른 유형의 정보를 전달하기 위한 매우 효율적인 수단이다. 다음 표는 한 자동차 회사의 판매원들의 분기별 판매 대수를 보여준다. 자바에서 우리는 표를 이차원 배열로 나타낸다.
판매원들의 분기별 판매대수
판매원\분기 | 1 | 2 | 3 | 4 |
---|---|---|---|---|
홍길동 | 72 | 85 | 93 | 97 |
임꺽정 | 136 | 178 | 154 | 239 |
김갑돌 | 52 | 76 | 92 | 125 |
이칠복 | 156 | 170 | 203 | 236 |
강진주 | 94 | 123 | 156 | 178 |
위 표는 5 개의 행과 4 개의 열을 가진 이차원 배열로 나타낼 수 있다. 행은 판매원을 나타내고 열은 분기를 나타낸다. 첫 번째 행은 홍길동의 분기별 판매 대수를 내타내고 두번째 행은 임쩍정의 분기별 판매 대수를 나타낸디. 세 번째 행의 두 번째 열의 값 76 은 판매원 김갑돌의 2 분기 판매 대수를 나타낸다. 우리는 이 표를 다음과 같이 이차원 배열로 선언할 수 있다.
int[][] salesTable;
or
int[] salesTable[];
or
int salestable[][];
그리고 다음과 같이 이차원 배열 객체를 만들 수 있다.
salesTable = new int[5][4];
이 배 열의 요소를 나타내기 위해서는 두 개의 지수가 필요하다. 한 지수는 행을 나타내고 다른 지수는 열을 나타낸다. 예를 들면 표의 4행 3열에 있는 값은 salesTable[3][2]에 의해 나타내진다. 각 지수는 0부터 시작한다는 점에 유념하라. 또한 이 배열의 행의 수는 salesTable.length라는 상수에 의해 나타내진다. 각 행에 있는 열의 수는 서로 다를 수 있다. 따라서 이 배 열의 2 번째 행에 있는 열의 수는 salesTable[l].length에 의해 나타내진다. 이차원 배열의 요소들이 어떻게 다루어지는 지를 알기 위해 몇 가지 예들을 살펴보자. 첫 번째 판매원의 분기별 평균 판매 대수를 구하는 코드는 다음과 같다.
다음으로 각 판매원의 분기별 평균 판매대수를 구해 보자 각 판매원의 분기별 평균 판매 대수를 저장하기 위해 크기 5의 일차원 배 열 이 필요하다. 코드는 다음과 같이 작성할 수 있다.
다음으로 각 분기의 판매원별 평균 판매대수를 구해보자 각 분기의 판매원별 평균 판매대수를 저장하기 위해 크기 4의 일차원 배 열이 필요하다. 코드는 다음과 같이 작성할 수 있다.
이차원 배열도 만들 때 각 요소의 값을 초기화 목록을 사용하여 줄 수 있다. 예를 들면 배열 salesTable을 만들 때 다음과 같이 초기화할 수 있다.
밖의 중괄호 안의 첫 번째 중괄호 쌍에 있는 값들은 표의 첫 번째 행에 대응되고 두 번째 중괄호 쌍에 있는 값들은 표의 두 번째 행에 대응된다. 지금까지 다룬 예 들을 종합하는 프로그램이다.
예제 2) CalculateAverage
이번에는 이차원 매열을 만들 때 각 행 의 크기를 다르게 만드는 방법을 알아보자. 즉 배열의 각 행의 크기를 똑같이 만들지 않아도 된다. 예 를 들띤 다음 코드는 2차원 배 열 객제를 생성할 때 먼저 행의 크기를 2로 정한다. 그리 고 첫 행의 크기 를 4로 정하고 두 번째 행의 크기를 5로 정한다. 즉 이 렇게 하여 총 9개의 int 형 데이 뎌를 저장하는 2 차원 배 열이 만들어진다. 물론 여기 서도 기본값이 배정되어 배 열요소의 각 값은 0 이 된다.
예제 프로그램 작성
한 교과목의 중간시험 점수들의 분포를 구하는 프로그램을 작성해 보자. 입의의 개수의 점수들을 읽어 들여야 한다고 가정하자 점수들은 O과 100 사이의 정수이다. 예를 들면 점수들을 다음과 같이 구간으로 분류하고 각 구간에 속하는 점수들의 수를 구하여 출력해야 한다.
구간 | 빈도 |
---|---|
0 ~ 9 | 0 |
10 ~ 19 | 1 |
20 ~ 29 | 3 |
30 ~ 39 | 5 |
40 ~ 49 | 8 |
50 ~ 59 | 10 |
60 ~ 69 | 15 |
70 ~ 79 | 27 |
80 ~ 89 | 12 |
90 ~ 99 | 9 |
프로그램의 흐름도는 다음과 같다.
완전한 프로그램은 다음과 같다.
예제 3) FindDist
요약
- 배열은 데이터를 그룹화하고 구성하기 위해 사용되는 간단하나 강력한 프로그래밍 언어의 구조이다.
- 배열은 데이터값들의 모음이다. 배열 안에 저장되는 값들은 배열 요소들이다.
- 배열 요소는 지수(혹은 연산식)에 의해 접근된다.
- 배열은 객체이다. 따라서 new 연산자를 사용하여 배열 객체를 생성해야 한다.
- 한 배열에 저장되는 모든 값들은 같은 데이 터 형을 가진다. 배열 요소의 데이터 형은 기본형 혹은 참조형일 수 있다.
- 배열이 만들어질 때 크기가 정해진다.
- 크기가 N인 배열은 0부터 N-1 사이의 지수를 가진다.
- 범위 검사는 배 열 요소를 언급하기 위해 사용되는 지수가 범위 내에 있어 야 함을 보징한다.
- 초기화 목록은 한 번에 배열 객체를 만들고 배열 요소들을 주어진 값들로 초기화하기 위해 사용한다.
- 객체들의 배 열은 객체들에 대한 참조들을 요소로서 저장할 수 있다. 객체들이 배열 내에 저장될 때 각 요소는 별도의 객체 이 다
- 배열 전체가 메소드에 매개 변수로서 넘겨질 수 있다. 이 경우 배 열 객체에 대한 참조가 넘겨진다. 메소드로부터 배열 전체를 반환받을 수도 있다.
- 명령 줄 인수들은 String 객체들의 배열 안에 저장되고 main 메소드에 넘겨진다.
- 이차원 배열은 배열들의 배열이다.
토론이 없습니다