1 chap8: arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하...

41
1 Chap8: Arrays Chap8: Arrays

Upload: eddie-joynes

Post on 15-Jan-2016

218 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

1

Chap8: ArraysChap8: Arrays

Page 2: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

2

배열의 종류

같은 자료 형들끼리 모아둘 수 있는 묶음이

하나밖에 없는 경우

1 차원 배열이 여러 개 있는 경우

boolean,char,int 등과 같은 기본 자료 형의

배열

객체를 참조하는 참조변수들의

묶음

Page 3: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

3

One-Dimensional Arrays

• Definition: – An array is a data structure that holds some fixed quantity of

multiple data items (elements) of the same data type.

• Arrays are objects, and they are created with the new keyword.

Page 4: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

4

One-Dimensional Arrays

• 배열을 선언하고 생성하는 절차– 선언과 동시에 생성 가능

• int[] numbers = new int[6]

– 어떠한 자료의 배열도 생성가능하다 .• float[] distances = new float[20];

• Char[] letters = new char[50];

• Date[] dates = new Date[30];

– 배열의 크기를 표시할 때 상수 ( 또는 일반 변수 ) 사용 가능• final int SIZE = 31;

• int SIZE2=40;

• double[] temperature = new double[SIZE];

• double[] temperature2 = new double[SIZE2];

– 배열은 일단 생성되면 그 크기를 변경할 수 없다 .

Page 5: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

5

One-Dimensional Arrays

• [ 주의 ] 배열의 선언시에 크기 지정은 안됨– int matrix[5]; // 잘못됨– int matrix[5] = {1,2,3,4,5}; // 잘못됨

• 배열의 사용– 다음과 같은 코드에서

• int[] numbers = new int[6]

– 첫 원소는 numbers[0], 마지막 원소는 numbers[5]– 예

• numbers[0] = 0;

• numbers[3] = 30;

Page 6: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

6

One-Dimensional Arrays

• 또 다른 참조 변수 선언 방법– 자바에서는 C 언어와 유사하게 배열 참조 변수를 선언할 수 있다 .

• int[] values; // ① 자바 방식• int values[]; // C② 언어 유사 방식• 위 두 가지는 100% 동일

– 여러 개의 배열 변수 선언시 주의• int[] values, grades; // 2 개의 변수 모두 배열로서 선언됨• int values, grades[]; // values 는 int 변수 , grades 만 배열 변수• int values[], grades[]; // 2 개의 변수 모두 배열로서 선언됨

Page 7: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

7

One-Dimensional Arrays

int[] number = new int[6];

int x = 6;

number[1] = 7;

number[3] = number[x - 5] + 2;

int[] s = number;

int[] number ==

a1 : int[6]

0 1 2 3 4 5

a1

0 0 0 0 00

int[] number ==

a1 : int[6]

0 1 2 3 4 5

int[] s ==

a1

7 0 9 0 00

a1

Page 8: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

8

배열 생성 과정

1) 배열 선언 char[] ch; 또는 char

ch[];

2) 배열 생성 ch = new char[4];

3) 배열 초기화 ch[0]=‘J’; ch[1]=‘a’; ch[2]=‘v’; ch[3]=‘a’;

Page 9: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

9

Default Initialization

• An array of numeric values is initialized with all zero values

• An array of booleans is initialized with false values

• An array of objects is initialized to null values, where null means “no value.”

Page 10: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

10

More Examples

int[] r = new int[6]; ... r[0] = 1; for ( int i=0; i < r.length-1; i=i+1 )

{ r[i+1] = r[i] * 2; }

int[] r = new char[]{1,2,4,8,16,32}; int[] r; r = new char[] {1,2,4,8,16,32};

int[] r = {1, 2, 4, 8, 16, 32}; a1

2 4 8 16 321

int[] r ==

a1 : int[6]

0 1 2 3 4 5

Page 11: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

11

More Examples

• 배열의 크기

• for-each 루프– Java 1.5 부터 지원

– 위 코드는 반복이 진행되면서 첫 번째 원소부터 마지막 원소까지 차례대로 value 에 대입되면서 for 문의 몸체가 수행된다 .

int[] numbers = new int[100];

for(int i=0; i < numbers.length; i++) numbers[i] = (int)(Math.random()*1000);

배열의 크기는 length 라는 필드로 알 수 있습니다 .

for (int value: numbers) System.out.println(value);

Page 12: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

12

More Examples

• for~each 활용 예제

– 배열의 모든 원소를 처리하는 경우엔 for ~ each 구문이 좋다 .• 배열의 크기에 신경쓰지 않아도 되고 인덱스 변수 생성이 필요 없다 .

– for~each 구문이 적합하지 않은 경우• 배열 원소의 값을 변경하는 경우• 역순으로 배열 원소를 처리하는 경우• 일부 원소만을 출력하는 경우• 두 개 이상의 배열을 처리하는 경우

public class Test { public static void main(String[] args) { String[] strings = { "Java", "C", "C++" }; for (String s : strings) System.out.println(s); }}

Page 13: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

13

Method & Array

• Arrays can be parameters to methods and can be results from methods. (send

the address of the array object)

public double[] inverse(double[] r) { int size = r.length; double[] answer = new double[size]; for ( int i = 0; i != size; i = i+1 ) { answer[(size - 1) - i)] = r[i]; } return answer; }

double[] d = {2.3, -4.6, 8, 3.14}; double[] e = inverse(d);

it is the address of the array (here, the address of the four-element array named by d)

which is bound to the formal parameter, r.

Inside the method, a second array is created, and the second array gets copies of the

elements in the first array.

When the method finishes, it returns as its answer the address of the second array.

Page 14: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

14

Method & Array

• 메소드의 매개 변수로 배열 전달– call by value 로 처리– 하지만 주소가 복사되기 때문에 call by reference 효과가 발생

Page 15: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

15

Method & Array

public class ScoreTest1 { final static int STUDENTS = 5;

public static void main(String[] args) { int[] scores = new int[STUDENTS]; getValues(scores); getAverage(scores); }

private static void getValues(int[] array) { Scanner scan = new Scanner(System.in); for (int i = 0; i < array.length; i++) { array[i] = i; } }

private static void getAverage(int[] array) { int total = 0; for (int i = 0; i < array.length; i++) total += array[i]; System.out.println(" 평균은 " + total / array.length + " 입니다 "); }}

Page 16: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

16

Method & Array

• 메소드의 반환값으로 배열 전달– 메소드가 반환값으로 배열을 전달 할 수 있다 .– 이 때에도 배열 참조값이 복사됨

import java.util.Scanner;public class Test { public static void main(String[] args) { int[] array; array = getData(); printData(array); } private static int[] getData() { int[] testData = { 10, 20, 30, 40, 50 }; return testData; } private static void printData(int[] array) { for (int i = 0; i < array.length; i++) System.out.println(array[i]); }}

Page 17: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

17

Array of Object

• 객체들의 배열에서는 객체에 대한 참조값을 각 원소가 저장– 배열 객체 생성

• Car[] cars = new new Car[6];

– 배열에 객체 할당• cars[0] = new Cars();

• cars[1] = new Cars();

– For 루프를 이용한 객체 할당

Page 18: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

18

Array of Object (Example)

class Car { public int speed // 속도 public int mileage // 주행거리 public String color // 색상

public Car() { speed = mileage = 0; color = "red"; } public void speedUp() { // 속도 증가 메소드 speed += 10; } public String toString() { // 객체의 상태를 문자열로 반환하는 메소드 return " 속도 : " + speed + " 주행거리 : " + mileage + " 색상 : " + color; }}

Page 19: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

19

Array of Object (Example)

public class CarTest { public static void main(String[] args) { final int NUM_CARS = 5; Car[] cars = new Car[NUM_CARS];

for (int i = 0; i < cars.length; i++) { cars[i] = new Car(); cars[i].speedUp(); System.out.println(cars[i]); } }}

Page 20: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

20

Use of Arrays

• Collecting Input Data within Arrays– Example: Vote Counting (See Figure 8.1, class VoteCounting)

• Translation Tables– Example: Substitution Code (See class SubsitutionCode)

• Arrays of Objects– Example: Bank Account (See next slide)– An array can be partially filled with objects

for ( int i = 0; i != account.length; i = i+1 )

{ if ( bank[i] != null )

{ System.out.println("Balance of account "

+ i + " is "

+ account[i].balanceOf() );

}

}

Page 21: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

21

Use of Arrays (cont’d)

BankAccount[] bank = new BankAccount[100];

BankAccount[] bank ==

a1 : BankAccount[100]

0 1 99

a1

null null … null

BankAccount[] bank ==

a1 : BankAccount[100]

0 1 99

a1

null a2 … null

bank[1] = new BankAccount(20);

a2 : BankAccount

int balance ==

public void deposit(int amount) public boolean withdraw(int amount)

20

Page 22: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

22

Case Study: Database

• What is a database?– a large collection of information.– Ex: a company’s sales records or its customer accounts

or its payroll information– in OO terms: a “container” into which objects are

inserted, located, and removed.

• What is a record?– the objects that are stored in a database.– uniquely identified by its key.

Page 23: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

23

Build a Database in Java

1. Keys are objects.

2. Records are objects, and a record holds as one of its attributes (the

address of) its key object.

3. A database is a kind of “array” of record objects; it must have methods

for inserting a record, finding a record, and deleting a record.

4. When the database's user wishes to insert a record into the database,

she calls the databases' insert method, supplying the record as the

argument; when she wishes to find a record, she calls the find

method, supplying a key object as an argument; when she wishes to

delete a record, the calls the delete method, supplying a key object

as an argument

Page 24: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

24

Page 25: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

25

Architecture

DatabaseRecord

Key

insertfinddelete

getKey(): Key

equals(Key y) : boolean

1 *

Page 26: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

26

Specification

insert(Record r): boolean

Attempts to insert the record, r, into the database. Returns true if the record is successfully added,

false otherwise.

find(Key k): Record

Attempts to locate the record whose key has value k. If successful, the address of the record is returned,

otherwise, null is returned.

Methods

class Database a container for data items, called Records

delete(Key k): boolean

Deletes the record whose key has value k. If successful, true is returned;

if no record has key k, false is returned.

Page 27: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

27

keyOf(): Key Returns the key that uniquely identifies the record.

Methods

class Record a data item that can be stored in a database

equals(Key m):

boolean

Compares itself to another key, m, for equality.If this key and m are same key value, then true is returned;

if m is a different key value, then false is returned.

lessthan(Key m):

boolean

Compares itself to another key, m, for lessthan. If this object's own key is a lesser key value than m,

true is returned; otherwise, false is returned.

Methods

class Key an identification, or “key,” value

Page 28: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

28

Implementation

• class Database (Figure 8.4)• class Record (Figure 8.5) for Bank Account• class Key (Figure 8.5) for Bank Account• class Record (Figure 8.6) for Book• class Key (Figure 8.6) for Book

Page 29: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

29

Execution

Here is a short code fragment that constructs a database for a library and inserts a book into it:

Database library = new Database(50000);

Record book = new Book( new Key("QA", 76.8), "Charles Dickens",

"Great Expectations", 1860 );

library.insert(book);

// We might locate the book this way:

Key lookup_key = new Key("QA", 76.8);

book = library.find(lookup_key);

// We can delete the book, if necessary:

boolean deleted = library.delete(lookup_key);

Page 30: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

30

Case Study: Playing Pieces of Card Games

Deck Card

new Card() : Cardsuitcount

1 *

Page 31: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

31

Specification

private Card[] deck container for the cards left in the deck

newCard(): Card return a card from the deck;

if the deck is empty, return null

moreCards():boolean

return true if more cards remain in the deck;return false, otherwise

Methods

Attributes

class CardDeck models a deck of cards

private String suit the card's suit, e.g., spades, hearts, diamonds, clubs

Attributes

class Card models a playing card

private int count the card's count, e.g., ace, 2, 3, ..., king

Page 32: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

32

Implementation

• class Card (Figure 8.9)• class CardDeck (Figure 9.10)

Page 33: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

33

static final variable

• The keyword, final, states that the variable name

can not be changed by an assignment; the value is

forever constant.

• The keyword, static, ensures that these variables

are unique and not copied as fields into any Card

objects that are constructed from class Card.

• It is traditional to declare static final variables with

names that are all upper-case letters.

Page 34: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

34

Two-Dimensional Arrays

• Definition: A two-dimensional array is an array whose elements are arrays. • Example: Election

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

• the length of row : election.length • the length of column : election[0].length

Candidate

Region0 1 2 3

0

1

2

int[][] election ==

a1:int[3][]

0

1

2

a1

a2

a3

a4

0 0 0 0

a2:int[4] 0 1 2 3

0 0 0 0

a3:int[4] 0 1 2 3

0 0 0 0

a4:int[4] 0 1 2 3

Page 35: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

35

int[ ][ ] election = new int[3][4]; election[1][3] = election[1][3] + 1;

for ( int j = 0; j != 4; j = j+1 ) { int votes = 0; for ( int i = 0; i != 3; i = i+1 ) { votes = votes + election[i][j]; } System.out.println("Candidate " + j + " has “ + votes + " votes"); }

for ( int i = 0; i != 3; i = i+1 ) { int total = 0; for ( int j = 0; j != 4; j = j+1 ) { total = total + election[i][j]; } System.out.println(total + " votes were cast in Region " + i); }

for ( int i = 0; i != 3; i = i+1 ) { int[] region = election[i]; // region holds the address of a row int total = 0; for ( int j = 0; j != 4; j = j+1 ) { total = total + region[j]; } System.out.println(total + " votes were cast in Region " + i); }

Note: we cannot treat a matrix's columns in a similar way.

Page 36: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

36

Ragged Array

• A two-dimensional array can have rows of different lengths

• Example:int max_words = 20;

char[][] word = new char[max_words][];

int count = 0; // how many words are saved in the array

boolean processing = true;

while ( processing )

{ String s = JOptionPane.showInputDialog("Please type a word: ");

if ( s.equals("") )

{ processing = false; }

else { word[count] = new char[ s.length() ];

for ( int i = 0; i != s.length(); i = i+1 )

// first i-1 characters in s are copied into word[line_num]

{ word[count][i] = s.charAt(i); }

count = count + 1;

}

}

Page 37: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

37

a1 : char[20][]

0

1

2

19

null

null

null

0 0 0 0

a2 : char[5] 0 1 2 3 4

null a1 : char[20][]

0

1

2

19

a2

null

null

null

0

char[][] word = new char[max_words][]

word[line_num] = new char[s.length()]

Page 38: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

38

store “bread” into the array

‘b’ ‘r’ ‘e’ ‘a’

a2 : char[5] 0 1 2 3 4

a1 : char[20][]

0

1

2

19

a2

null

null

null

‘d’

store “is” into the array

‘b’ ‘r’ ‘e’ ‘a’

a2 : char[5] 0 1 2 3 4

a1 : char[20][]

0

1

2

19

a2

a3

null

null

‘d’

‘i’ ‘s’

a3 : char[2] 0 1

Page 39: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

39

Case Study: Slide-Puzzle Game

1

*

SlidePuzzleBoard

PuzzlePieces

private PuzzlePiece[][] boardmove(int w): boolean

private int face_value

Page 40: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

40

Class Diagram

PuzzleController

JOptionPane

PuzzleWriter

PuzzlePieceSlidePuzzleBoard

play()

private PuzzlePiece[][] boardmove(int w): boolean

private int face_value

displayPuzzle()printError(String s)

1 *

Page 41: 1 Chap8: Arrays. 2 배열의 종류 같은 자료 형들끼리 모 아둘 수 있는 묶음이 하 나밖에 없는 경우 1 차원 배열이 여러 개 있는 경우 boolean,char,

41

Implementation

• class PuzzlePiece (Figure 8.12)• class SlidePuzzleBoard (Figure 8.13)• class PuzzleController (Figure 8.15)• class PuzzleWriter (Figure 8.16)• class SlidePuzzle (Figure 8.15)