6. 배열과배열리스트 한동일vip.sejong.ac.kr/dihan/java/lec06_07.pdf · 2019. 10. 12. ·...

25
JAVA 프로그래밍 6. 배열과 배열 리스트 한동일 2/49 학습 목표 To become familiar with using arrays and array lists To learn about wrapper classes, auto-boxing and the generalized for loop To study common array algorithms To learn how to use two-dimensional arrays To understand when to choose array lists and arrays in your programs To implement partially filled arrays

Upload: others

Post on 14-Sep-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 6. 배열과배열리스트 한동일vip.sejong.ac.kr/dihan/java/lec06_07.pdf · 2019. 10. 12. · JAVA 프로그래밍 6. 배열과배열리스트 한동일 2/49 학습목표 To

JAVA 프로그래밍

6. 배열과 배열 리스트

한 동 일

2/49

학습 목표

To become familiar with using arrays and arraylists

To learn about wrapper classes, auto-boxingand the generalized for loop

To study common array algorithms

To learn how to use two-dimensional arrays

To understand when to choose array lists and arrays in your programs

To implement partially filled arrays

Page 2: 6. 배열과배열리스트 한동일vip.sejong.ac.kr/dihan/java/lec06_07.pdf · 2019. 10. 12. · JAVA 프로그래밍 6. 배열과배열리스트 한동일 2/49 학습목표 To

3/49

자료형(data type)

숫자형 - 정수형, 실수형

기본형 문자형

논리형

자료형

배열형

참조형 클래스형

인터페이스형

자료형은 구조 및 개념, 값의 범위, 연산 등을 정의.

4/49

참조형(reference type)

객체를 가리키는 형

배열

같은 형의 여러 값을 저장하는데 이용하는 자료형

C/C++와 달리 객체로 취급

클래스형

클래스 이름

객체를 가리키는 참조형

인터페이스형

인터페이스 이름

인터페이스를 구현한 객체에 대한 참조

Page 3: 6. 배열과배열리스트 한동일vip.sejong.ac.kr/dihan/java/lec06_07.pdf · 2019. 10. 12. · JAVA 프로그래밍 6. 배열과배열리스트 한동일 2/49 학습목표 To

5/49

배열(Arrays)

순서가 있고 같은 형의 원소들의 모임

배열 사용 단계

배열 변수 선언

배열 변수 : 배열을 가리키는 변수

배열에 속한 원소의 형과 차원 등을 명시

배열 객체 생성

new 연산자를 통해 동적으로 생성

int[] vector1, vector2; double vector3[], data; // data는 배열형 아님short matrix[][];

Object[] myArray;

6/49

배열 아래와 같이 선언된 경우

배열 객체 생성 예

혹은 배열 변수 선언과 동시에 배열 할당 초기화는 배열 선언 시

vector1 = new int[5];vector2 = {1, 2, 3, 4, 5, 6, 7, 8, 9}; // error 발생

matrix = new short[10][100];myArray = new Point[3];

int[ ] vector2 = {1, 2, 3, 4, 5, 6, 7, 8, 9}; int[ ] day = new int[31];int day[ ] = new int[31];

int[] vector1, vector2;short matrix[][];

Object[] myArray;

Page 4: 6. 배열과배열리스트 한동일vip.sejong.ac.kr/dihan/java/lec06_07.pdf · 2019. 10. 12. · JAVA 프로그래밍 6. 배열과배열리스트 한동일 2/49 학습목표 To

7/49

배열

int[] vector ;

vector = new int[3] ;

vector[0] vector[1] vector[2]

vector :

vector :

배열 변수 선언과 생성에 따른 메모리 구조

배열의 초기값 Numbers : 0

Boolean : false

객체 참조 : null

가급적 프로그래머가 원하는 값으로 설정 이후 사용할 것

8/49

배열 배열 요소의 접근 : [] 사용

double[] data = new double[10]; // Fig 8.1

data[2] = 29.95; // Fig 8.2

An Array Reference and an Array Storing a Value in an Array

Page 5: 6. 배열과배열리스트 한동일vip.sejong.ac.kr/dihan/java/lec06_07.pdf · 2019. 10. 12. · JAVA 프로그래밍 6. 배열과배열리스트 한동일 2/49 학습목표 To

9/49

배열

배열에 값 저장

배열의 인덱스는 0부터 시작

length 필드를 통한 배열의 길이 획득: 메소드 아님!

인덱스 범위 : 0 ~ length - 1

범위 초과 : IndexOutOfBoundException이 발생

int a[ ] = new int[50];for(int i=0; i < a.length; i++)

a[i] = i;

double[] data = new double[10];data[10] = 29.95; // ERROR

10/49

배열 리스트(Array Lists)

배열의 제한점

초기에 설정한 크기로 length가 제한됨

프로그램 중간에 배열의 크기를 바꾸기 위해서는새로운 배열을 생성하여 복사해야 함

배열 리스트(Array Lists)

ArrayList 클래스 : 객체를 집합적으로 다룰 수 있는도구 제공

크기를 늘리거나 줄이는 메소드 제공

임의 위치의 요소(element)를 삭제하거나 추가하는메소드 제공

Page 6: 6. 배열과배열리스트 한동일vip.sejong.ac.kr/dihan/java/lec06_07.pdf · 2019. 10. 12. · JAVA 프로그래밍 6. 배열과배열리스트 한동일 2/49 학습목표 To

11/49

ArrayList 클래스 : 범용 클래스

ArrayList<T> : T형 객체들의 모임

T 위치에 기본 자료형(ex: int, double) 사용 불가

size() method : 배열 리스트의 크기 정보 추출

배열 리스트

ArrayList<BankAccount> accounts = new ArrayList<BankAccount>();accounts.add(new BankAccount(1001));accounts.add(new BankAccount(1015));accounts.add(new BankAccount(1022));

12/49

배열 리스트

배열 리스트 요소(element)의 추출

get() method 사용

index 는 0에서 시작

인덱스 범위 : 0 ~ .size() - 1

BankAccount anAccount = accounts.get(2); // gets the third element of the array list

int i = accounts.size();anAccount = accounts.get(i); // Error// legal index values are 0. . .i-1

Page 7: 6. 배열과배열리스트 한동일vip.sejong.ac.kr/dihan/java/lec06_07.pdf · 2019. 10. 12. · JAVA 프로그래밍 6. 배열과배열리스트 한동일 2/49 학습목표 To

13/49

배열 리스트

값의 할당

set() method 사용

이전 값은 없어지고 새로운 값이 할당

객체의 추가 : add() method 사용

BankAccount anAccount = new BankAccount(1729);accounts.set(2, anAccount);

accounts.add(a) // 배열 리스트의 마지막에 a 객체 추가

accounts.add(i, a) // 배열 리스트의 i 위치에 a 객체 삽입(그림 8.3 참고)

14/49

Figure 8.3:Adding an Element in the Middle of an Array List

배열 리스트

Page 8: 6. 배열과배열리스트 한동일vip.sejong.ac.kr/dihan/java/lec06_07.pdf · 2019. 10. 12. · JAVA 프로그래밍 6. 배열과배열리스트 한동일 2/49 학습목표 To

15/49

배열 리스트

객체의 삭제 : remove method 사용

accounts.remove(i) // i 번째 인덱스의 값을 삭제하고 크기가 1 줄어듦

Figure 8.4:Removing an Element in the Middle of an Array List

16/49

기본형에 해당하는 클래스

int -> Integer, char -> Character, double -> Double

제공하는 이유

각 형에 관련된 상수와 메소드들에 대한 홈(home) 역

할을 담당

기본형을 객체로 다루어야 하는 경우 랩퍼 클래스를이용하여 기본형에 해당하는 객체를 생성

예 : 배열 리스트 이용 시 사용

랩퍼 클래스(Wrapper Class)

Page 9: 6. 배열과배열리스트 한동일vip.sejong.ac.kr/dihan/java/lec06_07.pdf · 2019. 10. 12. · JAVA 프로그래밍 6. 배열과배열리스트 한동일 2/49 학습목표 To

17/49

랩퍼 클래스(포장 클래스)

Object

Number

Float

Double

Character

System

String

StringBufferBoolean

Wrapper 클래스

Byte

Short

Long

Integer

18/49

랩퍼 클래스

기본형과 이와 연관된 랩퍼 클래스

Page 10: 6. 배열과배열리스트 한동일vip.sejong.ac.kr/dihan/java/lec06_07.pdf · 2019. 10. 12. · JAVA 프로그래밍 6. 배열과배열리스트 한동일 2/49 학습목표 To

19/49

Boolean Class

상수 public static final Boolean TRUE = new Boolean(true) public static final Boolean FALSE = new Boolean(false)

메소드 Boolean(boolean b) :

초기 값으로 b를 받아 boolean 객체를 만드는 생성자 Boolean(String s) :

"true"나 "false"와 같은 스트링 값을 받아 Boolean boolean booleanValue() :

객체의 boolean 값을 리턴 static boolean getBoolean(String name) :

시스템 속성의 boolean 값을 리턴 static Boolean valueOf(String s) :

스트링 s에 해당하는 Boolean 값을 리턴

20/49

Character Class

상 수

public static final int MAX_RADIX = 36

public static final char MAX_VALUE =‘\ffff’

public static final int MIN_RADIX = 2

public static final char MIN_VALUE =’\0000’

메소드

Character(char value) : value 값으로 객체를 초기화하는 생성자

char charValue() : char형으로 변환하는 기능

static boolean isDigit(char ch) : 숫자인가를 판별하는 기능

static boolean isLetter(char ch) : 문자인가를 판별하는 기능

static boolean isLetterOrDigit(char ch) : 문자이거나 숫자일 때 참을 리턴

Page 11: 6. 배열과배열리스트 한동일vip.sejong.ac.kr/dihan/java/lec06_07.pdf · 2019. 10. 12. · JAVA 프로그래밍 6. 배열과배열리스트 한동일 2/49 학습목표 To

21/49

Number Class 추상 클래스 (abstract class)

Interger, Long, Float, Double 클래스들의 슈퍼클래스

형 변환에 관한 메소드가 포함.

메소드

abstract int intValue() : int형으로 변환하는 메소드.

abstract long longValue() : long형으로 변환하는 메소드

abstract float floatValue() : float형으로 변환하는 메소드

abstract double doubleValue() : double형으로 변환하는 메소드

JAVA API의 Number클래스 참고

22/49

자바의 기본형인 int 형을 위한 기호 상수와 int 형을 다루는

데 필요한 메소드들을 제공

상수

public static final int MAX_VALUE = 2147483647

public static final int MIN_VALUE = -2147483648

JAVA API의 Integer클래스 참고

Integer Class

Page 12: 6. 배열과배열리스트 한동일vip.sejong.ac.kr/dihan/java/lec06_07.pdf · 2019. 10. 12. · JAVA 프로그래밍 6. 배열과배열리스트 한동일 2/49 학습목표 To

23/49

메소드

static int parseInt(String s) :

문자열로 저장된 숫자를 int형으로 바꾸는 메소드

static int parseInt(String s , int radix) :

문자열로 저장된 숫자를 주어진 진법의 int형으로 바꾸는 메소드

static String toBinaryString(int i) :

2진수 형태의 문자열로 바꾸는 메소드

static String toHexString(int i) :

16진수 형태의 문자열로 바꾸는 메소드

static Integer valueOf(String s) :

문자열로 저장된 숫자를 가지고 있는 Integer 객체로 바꾸는 메소드

int intValue() :

Integer 객체의 int 값을 제공하는 메소드

Integer Class

24/49

Double Class

상수

public static final double MAX_VALUE = 1.79769313486231570e+308

public static final double MIN_VALUE = 4.94065645841246544e-324

public static final double NaN = 0.0 / 0.0

public static final double NEGATIVE_INFINITY = -1.0 / 0.0

public static final double POSITIVE_INFINITY = 1.0 / 0.0

Page 13: 6. 배열과배열리스트 한동일vip.sejong.ac.kr/dihan/java/lec06_07.pdf · 2019. 10. 12. · JAVA 프로그래밍 6. 배열과배열리스트 한동일 2/49 학습목표 To

25/49

Double Class

메소드

static long doubleToLongBits(double value) :

double형으로 표현되어 있는 비트를 long형의 비트 패턴으로 바꾸는 메소드

static boolean isNaN(double v) : 매개 변수가 NaN인지를 검사하는 메소드

static boolean isInfinite(double v) : 매개 변수가 무한대인지를 검사하는 메소드

static Double valueOf(String s) : 스트링을 Double형으로 변환하는 메소드

26/49

자동 포장(Auto-boxing)

기본 데이터형과 랩퍼 클래스 간의 변환을 자동으로 구현

자바 버전 5.0부터 지원

Double d = 29.95; // auto-boxing; same as Double d = new Double(29.95);

double x = d; // auto-unboxing; same as double x = d.doubleValue();

Page 14: 6. 배열과배열리스트 한동일vip.sejong.ac.kr/dihan/java/lec06_07.pdf · 2019. 10. 12. · JAVA 프로그래밍 6. 배열과배열리스트 한동일 2/49 학습목표 To

27/49

자동 포장(Auto-boxing)

자동 포장을 이용한 산술 연산

의미

d를 자동 비포장하여 double 형으로 변환

1을 더함

결과를 새로운 Double 랩퍼 객체로 자동 포장

새롭게 만들어진 랩퍼 객체에 대한 참조를 e에 저장

Double e = d + 1;

28/49

개선된 for 루프 : for each 배열 전체 탐색 시 기존 방법

위와 동일한 동작을 수행하는 for each 루프

double[] data = . . .;double sum = 0;for (int i = 0; i < data.length; i++){

double e = data[i];sum = sum + e;

}

double[] data = . . .;double sum = 0;for (double e : data) { // You should read this loop as "for each e in data"

sum = sum + e;}

Page 15: 6. 배열과배열리스트 한동일vip.sejong.ac.kr/dihan/java/lec06_07.pdf · 2019. 10. 12. · JAVA 프로그래밍 6. 배열과배열리스트 한동일 2/49 학습목표 To

29/49

개선된 for 루프 : for each for each 루프 구문

배열 전체를 탐색하지 않는 경우나 for 루프의 index를 이용해야 하는 경우는 기존 방법 이용

for (Type variable : collection)statement

Example:for (double e : data)

sum = sum + e;

Purpose:To execute a loop for each element in the collection. In each iteration, the variable is assigned the next element of the collection. Then the statement is executed.

30/49

개선된 for 루프 : for each 배열 리스트 전체 탐색 시 기존 방법

for each 루프

double sum = 0;for (int i = 0; i < accounts.size(); i++){

BankAccount a = accounts.get(i);sum = sum + a.getBalance();

}

ArrayList<BankAccount> accounts = . . . ;double sum = 0;for (BankAccount a : accounts){

sum = sum + a.getBalance();}

Page 16: 6. 배열과배열리스트 한동일vip.sejong.ac.kr/dihan/java/lec06_07.pdf · 2019. 10. 12. · JAVA 프로그래밍 6. 배열과배열리스트 한동일 2/49 학습목표 To

31/49

이차원 배열(2-D arrays) 배열의 배열(array of array)

배열의 원소가 다시 배열이 되는 배열

다차원 배열

index 쌍으로 배열 요소 접근

첫번째 차원의 크기는 반드시 명시 행의 수 획득 : matrix.length

열의 수 획득 : matrix[0].length, matrix[1].length, 등등

int[ ][ ] matrix = new int[3][3];

int[ ][ ] matrix = new int[3][ ];for (int i=0; i < matrix.length; i++)

matrix[i] = new int[3];

matrix [i][j] = 3*i + j;

32/49

이차원 배열의 초기화

// int A[ ][ ] = {{0, 1, 2},{ 3, 4, 5}};int A[ ][ ] = new int[2][3];for(int i=0; i < 2; i++)

for(int j=0; j < 3; j++)A[i][j] = i*3+j;

A[0][0] = 0 A[0][1] = 1 A[0][2] = 2

A[1][0] = 3 A[1][1] = 4 A[1][2] = 5

0 행

1 행

0 열 1 열 2 열

이차원 배열(2-D arrays)

Page 17: 6. 배열과배열리스트 한동일vip.sejong.ac.kr/dihan/java/lec06_07.pdf · 2019. 10. 12. · JAVA 프로그래밍 6. 배열과배열리스트 한동일 2/49 학습목표 To

33/49

배열의 복사

배열 변수의 복사

배열 변수는 해당 배열에 대한 참조를 저장

따라서 참조 복사는 동일한 배열을 가리키는 또 하

나의 참조를 획득

double[] data = new double[10];// fill array . . .double[] prices = data;

34/49

배열의 복사

Figure 8.7:Two References to the Same Array

배열 변수의 복사

Page 18: 6. 배열과배열리스트 한동일vip.sejong.ac.kr/dihan/java/lec06_07.pdf · 2019. 10. 12. · JAVA 프로그래밍 6. 배열과배열리스트 한동일 2/49 학습목표 To

35/49

배열의 복사

배열의 복제 : clone 메소드 사용

double[] prices = (double[]) data.clone();

Figure 8.8:Cloning an Array

36/49

배열의 복사

배열 요소의 복사

System.arraycopy(from, fromStart, to, toStart, count);

Figure 8.9:The System.arraycopy Method

Page 19: 6. 배열과배열리스트 한동일vip.sejong.ac.kr/dihan/java/lec06_07.pdf · 2019. 10. 12. · JAVA 프로그래밍 6. 배열과배열리스트 한동일 2/49 학습목표 To

37/49

배열의 복사

배열 요소의 삽입

System.arraycopy(data, i, data, i + 1, data.length - i - 1);data[i] = x;

Figure 8.10:Inserting a New Element Into an Array

38/49

배열의 복사

배열 요소의 제거

System.arraycopy(data, i + 1, data, i, data.length - i - 1);

Figure 8.11:Removing an Element from an Array

Page 20: 6. 배열과배열리스트 한동일vip.sejong.ac.kr/dihan/java/lec06_07.pdf · 2019. 10. 12. · JAVA 프로그래밍 6. 배열과배열리스트 한동일 2/49 학습목표 To

39/49

배열의 복사

double[] newData = new double[2 * data.length];

배열의 크기 확장

① 보다 큰 배열을 새로 생성

② 모든 요소를 새로운 배열로 복사

③ 배열 변수에 새로운 배열에 대한 참조 저장

System.arraycopy(data, 0, newData, 0, data.length);

data = newData;

40/49

배열의 복사

배열의 크기 확장

Figure 8.11:Growing an Array

Page 21: 6. 배열과배열리스트 한동일vip.sejong.ac.kr/dihan/java/lec06_07.pdf · 2019. 10. 12. · JAVA 프로그래밍 6. 배열과배열리스트 한동일 2/49 학습목표 To

41/49

객체의 배열(Arrays of Object) 병렬 배열을 만들지 말라

각 요소를 객체로 구성하고 객체의 배열 이용

BankAccount[] = accounts;

// Don't do thisint[] accountNumbers;double[] balances;

42/49

첨부된 Average.java는 10개의 홀수(1~19)의 평균을구하는 코드이다.

에러를 바로잡고 원하는 결과가 나오는지 확인하라.

n개의 홀수의 평균을 구할 수 있게 코드를 수정하라.

[실습1] – Debug

Page 22: 6. 배열과배열리스트 한동일vip.sejong.ac.kr/dihan/java/lec06_07.pdf · 2019. 10. 12. · JAVA 프로그래밍 6. 배열과배열리스트 한동일 2/49 학습목표 To

43/49

[실습2] – 배열 리스트

첨부된 NamesTest.java를 보고 출력결과를 예상하라.

Main 메소드의 for문을 for each문으로 바꾸면서 for each문의 용법에 대해 이해한다.

44/49

강의 홈페이지의 Bank.java code의 다음 메소드 들을 이해하고 BankTester.java code를 이용하여 테스트하라.

getTotalBalance()

count()

getMaximum()

실행 결과를 확인하고 최대, 최소값의 탐색, 특정값의 탐색 방법 등을 파악하라.

getMaximum() 메소드에서 for each 루프를 사용하지 않은 이유는 무엇인가?

앞의 두 메소드에서 사용한 for each 루프를 for 루프로변환하여 결과를 재확인하라.

[실습3] – for each 루프

Page 23: 6. 배열과배열리스트 한동일vip.sejong.ac.kr/dihan/java/lec06_07.pdf · 2019. 10. 12. · JAVA 프로그래밍 6. 배열과배열리스트 한동일 2/49 학습목표 To

45/49

강의 홈페이지의 ArrayInsertRemove.java 파일을 이해하고 실행을 통하여 확인하라.

Array copy test 1 부분의 출력 결과를 예측하고 주석부분을 풀어서 예측결과가 맞는지 확인하라.

틀린 경우 이유를 파악하고 잘못 이해한 부분을 확인하라.

Array copy test 2 부분의 출력 결과를 예측하고 주석부분을 풀어서 예측결과가 맞는지 확인하라.

틀린 경우 이유를 파악하고 잘못 이해한 부분을 확인하라.

[실습4] – 배열의 복사

46/49

첨부된 Matrix는 행렬곱을 구하는 코드이다. 참고 :

행렬곱의 규칙을 찾아 반복문으로 수정하라. 3*3 행렬의 행렬곱을 구할 수 있게 수정하라.

같은 출력을 얻되 Matrix.java 코드에서 print 메소드를 없애라.

디버깅 시 아래의 곱셈 결과 예 참고.

[실습5] – 2-Dim Array

Page 24: 6. 배열과배열리스트 한동일vip.sejong.ac.kr/dihan/java/lec06_07.pdf · 2019. 10. 12. · JAVA 프로그래밍 6. 배열과배열리스트 한동일 2/49 학습목표 To

47/49

[실습6] – 이차원 배열

10행 10열의 이차원 배열을 사용하여 아래와 같은 출력결과를 나타내는 프로그램을 각각 작성하시오.

12 3

4 5 67 8 9 10

11 12 13 14 1516 17 18 19 20 21

22 23 24 25 26 27 2829 30 31 32 33 34 35 36

37 38 39 40 41 42 43 44 4546 47 48 49 50 51 52 53 54 55

1 2 4 7 11 16 22 29 37 463 5 8 12 17 23 30 38 47

6 9 13 18 24 31 39 4810 14 19 25 32 40 49

15 20 26 33 41 5021 27 34 42 51

28 35 43 5236 44 53

45 5455

출력결과 1) 출력결과 2)

48/49

[실습7] – 배열 실습

강의 홈페이지의 ArrayTest.java code를 수정하여 다음 문장이 실행된 후, data 배열에는 어떤 요소가 저장되는지 출력을 통해서 확인하라.

ArrayTest.java code를 수정하여 10개의 정수 배열을입력 받아 이를 배열에 저장한 후 이를 출력하는 프로그램을 작성하라.

ArrayTest.java code를 수정하여 0 ~ 100 사이의 정수를 랜덤하게 10개 발생시키고 이를 배열에 저장한후 출력하는 프로그램을 작성하라.

double[] data = new double[10];for (int i = 0; i < data.length; i++) data[i] = i * i;

Page 25: 6. 배열과배열리스트 한동일vip.sejong.ac.kr/dihan/java/lec06_07.pdf · 2019. 10. 12. · JAVA 프로그래밍 6. 배열과배열리스트 한동일 2/49 학습목표 To

49/49

[실습8] – 배열 데이터의 표현

[실습 7]에서 마지막으로 완성된 ArrayTest.java code와 도형 그리기 기능을 통합하여 랜덤하게 생성된 0 ~ 100 사이의 정수 10개를 아래 그림의 왼쪽과 같이 도표로 그리는 프로그램을 완성하라.

이를 수정하여 아래 그림의 오른쪽과 같이 좀 더 실제적인 도표로 완성하라.