• 검색 결과가 없습니다.

9장 배열

N/A
N/A
Protected

Academic year: 2022

Share "9장 배열"

Copied!
30
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

9장 배열

이충기

명지대학교

(2)

들어가며

Q: 한 교과목의 성적 처리를 하는 프로그램에서 100명의 수강생들의 점수들을 저장해야 한다. 이 점수들을 어떻 게 저장해야 할까?

A:

(3)

배열

 배열은 관련된 데이터를 그룹화하여 사용하는 간단하나 강력한 프로그래밍 언어의 구조이다.

 배열은 같은 유형의 데이터 값들의 모음이다.

(4)

배열

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까지이다.

(5)

배열

 배열 안에 저장되는 값들은 배열 요소들이라고 부른다.

 배열은 같은 유형(요소 데이터 형)의 여러 값들을 저장한다.

 요소 데이터 형은 기본형 혹은 참조형일 수 있다.

 그러므로 우리는 정수들의 배열, 문자들의 배열, 혹은 문자 열 객체들의 배열 등을 만들 수 있다.

 배열 그 자체는 객체이다.

(6)

배열

 특정 위치에 있는 배열 요소를 나타내는 구문 배열명[지수]

 예: scores[2]는 배열 scores의 세 번째 값을 나타낸다.

(7)

배열

 배열 요소는 변수가 사용될 수 있는 곳에서는 어디나 사용될 수 있다.

 예: scores[2] = 89;

scores[first] = scores[first] + 2;

average = (scores[0] + scores[1]) / 2;

System.out.println(scores[5]);

(8)

배열의 선언

 배열은 객체이다. 따라서 배열을 만들기 위해서 먼저 배열 객체에 대한 참조 변수를 선언해야 한다.

int[ ] scores;

 배열 선언에서 괄호가 요소 형 혹은 배열의 이름과 결합될 수 있다.

그러므로 다음의 두 선언들은 같다.

int[ ] scores;

int scores[ ];

 다음으로 new 연산자를 사용하여 배열 객체를 생성해야 한다.

scores = new int[10];

(9)

배열의 선언

 scores 배열은 다음과 같이 선언될 수 있다.

int[ ] scores = new int[10];

 변수 scores 의 데이터형은 int[ ] (정수들의 배열)이다.

 배열의 크기는 new 연산자 다음에 나오는 int[10]에서 정해진다.

즉, 크기는 10이다.

 참조 변수 scores는 10개의 정수들을 저장할 수 있는 새 배열 객체를 가리킨다.

(10)

예: 배열 선언

 double[ ] costs = new double[100];

 boolean flags[ ];

 flags = new boolean[20];

 String[] names = new String[10];

(11)

범위 검사

 배열이 만들어질 때 크기가 정해진다.

 크기가 N인 배열은 0부터 N-1 사이의 지수를 가진다.

 배열 요소가 사용될 때마다 지수가 범위 내에 있는 지를 자동적으로 검사한다.

 배열 지수가 범위를 벗어나면 ArrayIndexOutOfBoundsException 이라는 예외(실행 오류)가 발생한다.

(12)

예: 범위 검사

char[ ] grades = new char[100];

for (int index = 1; index <= 100; index++) System.out.println(grades[index]);

위 코드에서 배열의 지수들은 0부터 99사이여야 한다.

그러나 for 문에서 index가 100이 될 수 있다. 이는 오류이다.

문제

(13)

범위 검사

 각 배열 객체는 크기를 저장하는 length라는 상수를 가진다.

 배열의 크기는 다음과 같이 배열명을 사용하여 참조된다:

scores.length

 length 는 배열의 가장 큰 지수가 아니라 요소들의 수를 저장한다.

(14)

예제 프로그램 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] + " ");

(15)

초기화 목록

 초기화 목록은 한 번에 배열 객체를 만들고 배열 요소들 을 초기화하기 위해 사용될 수 있다.

 값들은 중괄호들 사이에 쉼표들로 구분된다.

 배열의 크기는 초기화 목록에 있는 항목들의 수에 의해 결정된다.

예: char[ ] grades = {'A', 'B', 'C', 'D', ’F'};

(16)

예제 프로그램 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] + " ");

} }

(17)

객체들의 배열

 배열들은 객체들에 대한 참조들을 요소로서 저장할 수 있다.

 예: String[] seasons = new String[4];

 각 배열 요소는 null 값을 가진다.

(18)

객체들의 배열

 배열 요소가 가리키는 객체들은 별도로 생성되어야 한다.

 예: seasons[0] = "spring";

seasons[1] = "summer";

seasons[2] = "fall";

(19)

객체들의 배열

 배열 객체를 만들 때 각 배열요소가 가리키는 객체들을 초기화 목록을 사용하여 만들 수 있다.

예: String[] grades = {“freshman“, "sophomore", "junior", "senior"};

(20)

배열 넘겨주고 받기

 배열 전체가 메소드에 매개변수로서 넘겨질 수 있다.

 이 경우 배열 객체에 대한 참조가 넘겨진다.

 메소드 내에서 배열 요소를 바꾸는 것은 원 요소를 바꾼다.

 배열 요소도 메소드에 넘겨질 수 있다.

이 경우 형식 매개변수의 형은 요소 형과 같아야 한다.

(21)

예제 프로그램 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;

}

(22)

명령 줄 인수

 main 메소드의 머리부를 고려하라.

public static void main(String[] args)

 형식 매개 변수가 String 객체들의 배열이라는 것을 보여준다.

 이 값들은 자바 해석기가 호출될 때 제공되는 명령 줄 인수들로부터 온다.

(23)

예제 프로그램 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]);

} }

(24)

예제 프로그램 4: 실행 결과

>java PrintMessage 영수 지수 사랑해 From: 영수

To: 지수

Contents: 사랑해

해설: 명령 줄의 첫 번째 인수(영수)는 args[0]에 두 번째 인수(지수)는 args[1]에 세 번째 인수(사랑해)는 args[2]

에 저장된다.

(25)

2차원 배열

 이차원 배열은 배열들의 배열이다.

 다음 문들은 똑같이 5행 4열의 이차원 배열을 만든다.

int[ ] salesTable[ ] = new int[5][4];

int salesTable[ ][ ] = new int[5][4];

int[ ][ ] salesTable = new int[5][4];

(26)

예제 프로그램 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 ; }

(27)

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];

(28)

예제 프로그램 6: 점수 분포

 문제: 임의의 개수의 점수들(0과 100사이)을 10점 단위의 구간으로 분류하고 각 구간에 속하는 점수들의 수를 구하여 출력하라.

 변수들

- score: 점수

- frequency: 10개 구간의 빈도수를 저장하는 배열 객체 참조변수 - i: 반복 제어 변수

- scan: Scanner 객체 참조 변수

 알고리즘은 다음 슬라이드에 있다.

 완성 프로그램은 [프로그램 9.5]에 있다.

(29)

알고리즘

1. 첫 번째 점수를 요청하고 읽어 들인다

점수 = -1

2. 점수가 어느 구간에 속하는 지를 찾고 그 구간의 빈도를 1 만큼 증가시킨다

3. 다음 점수를 요청하고 입력 받는다 false

true

(30)

요약

 배열

 배열의 선언 및 사용

 객체들의 배열

 배열 넘겨주고 받기

 명령 줄 인수

 이차원 배열

 예제 프로그램 작성

참조

관련 문서