슬라이드 1 - 경일대학교 컴퓨터공학과

Download Report

Transcript 슬라이드 1 - 경일대학교 컴퓨터공학과

1
일반적인 하나
의 코드로 다양
한 자료형을 처
리하는 기법을
살펴봅시다.
제 7 장 제네릭과 컬렉션
제네릭이란?

제네릭 프로그래밍(generic programming)


일반적인 코드를 작성하고 이 코드를 다양한 타입의 객체에 대하
여 재사용하는 프로그래밍 기법
제네릭은 컬렉션 라이브러리에 많이 사용
기존의 방법



일반적인 객체를 처리하려면 Object 참조 변수를 사용
Object 참조 변수는 어떤 객체이던지 참조할 수 있다.
예제로 하나의 데이터를 저장하는 Store 클래스를 살펴
보자.
기존의 방법(코드)
문제점
발생!!
제네릭을 이용한 버전
C++의 템플릿(template)과 유사

문자열을 저장하려면 다음과 같이 선언


Store<String> store = new Store<String>();
정수를 저장하려면 다음과 같이 선언

Store<Integer> store = new Store<Integer>();
제네릭 버전의 사용
// Casting 불필요
중간 점검 문제
1.
왜 데이터를 Object 참조형 변수에 저장하는 것이 위험할 수 있는가?
2. Store 객체에 Rectangle 객체를 저장하도록 제네릭을 이용하여 생성하여 보
라.
Store<Rectangle> store = new Store<Rectangle>();
3. 타입 매개 변수 T를 가지는 Point 클래스를 정의하여 보라. Point 클래스는 2
차원 공간에서 점을 나타낸다.
Class Point<T> {
T x;
T y;
…
}
제네릭 메소드(Generic Method)


메소드에서도 타입 매개 변수를 사용하여서 제네릭 메
소드를 정의할 수 있다.
타입 매개 변수의 범위가 메소드 내부로 제한된다.
반환형
매개변수
배열의 마지막
원소를 반환하
는 메소드
제네릭 메소드의 사용

String[]
language= { "C++", "C#", "JAVA" };

String last = Array.<String>getLast(language);// last는 “JAVA"

또는

String last = Array.getLast(language);
// last는 “JAVA"
컬렉션(collection)의 개념
10

컬렉션

컬렉션은 요소(element)라고 불리는 가변 개수의 객체들의 모음


컬렉션 클래스 사례



객체들의 컨테이너라고도 불림
Vector, ArrayList, Hashtable, LinkedList, HashMap, HashSet,
Stack
java.util 패키지에서 제공
다양한 객체들을 삽입, 삭제, 검색 등 관리하는데 사용됨
배열과 컬렉션의 개념 차이
11
컬렉션(Collection)
배열(Array)
0
1
• 고정
2
3
4
5
6
크기 이상의 객체를 관리
할 수 없다.
• 배열의 중간에 객체가 삭제되
면 응용프로그램에서 자리를 옮
겨야 한다.
• 가변
크기로서 객체의 개수를 염려
할 필요 없다.
• 배열의 중간에 객체가 삭제되면
컬렉션이 자동으로 자리를 옮겨즌
다.
컬렉션을 위한 인터페이스와 클래스
12
Collection
Set
List
Queue
Map
인터페이스
클래스
HashSet
ArrayList
Vector
LinkedList
Hashtable
Collection
Queue
Set
List
Map
HashSet
ArrayList
HashMap
TreeSet
LinkedList
TreeMap
Stack
HashTable
Vector
Properties
Interface
구현 클래스
콜렉션 인터페이스가 제공하는 메소드
List 인터페이스
 List 인터페이스
- 순서를 가지는 원소들의 모임
- 중복된 원소가 허용된다.
- 위치 인덱스를 사용하여 원소에 접근한다. (0부터 시작)
 구현한 클래스 종류
- ArrayList: 리스트를 배열로 구현
- LinkedList: 리스트를 연결리스트로 구현
- Vector: 멀티쓰레드 환경에서 동기화가 지원됨
Vector 클래스
Collection
List
16

Vector의 특성


java.util.Vector
여러 객체들을 삽입, 삭제, 검색하는 컨테이너(콜렉션) 클래스



배열의 길이 제한 단점 극복
원소의 개수가 넘쳐나면 자동으로 늘어나는 가변 길이
Vector에 삽입 가능한 것



객체만 가능
null도 삽입 가능
기본 데이터 타입은 불가능


Wrapper 객체로 만들어 삽입 가능
Vector에 객체 삽입



Vector
벡터의 맨 뒤에 객체 추가 : 공간이 모자라면 자동 늘림
벡터 중간에 객체 삽입 : 삽입된 뒤의 객체는 뒤로 하나씩 이동
Vector에서 객체 삭제

임의의 위치에 있는 객체 삭제 가능 : 객체 삭제 후 하나씩 앞으로 자
동 이동
Vector 객체의 내부 구성
17
add()를 이용하
여 요소를
삽입하고 get()을
이용하
여 요소를 검색
obj
합니다
"사과"
get(3)
?
Vector 객체
add(obj)
0
1
2
3
4
5
6
get(i)
"Hello"
4
String
Integer
"사과"
Person
String
Vector 클래스의 주요 메소드
18
메소드
설명
boolean add(E e)
벡터의 맨 뒤에 요소 추가
void add(int index, E element)
지정된 인덱스에 지정된 객체를 삽입
int capacity()
벡터의 현재 용량 반환
boolean addAll(Collection<? extends E> c)
c가 지정하는 컬렉션의 모든 요소를 벡터의 맨 뒤에 추가
void clear()
벡터의 모든 요소 삭제
boolean contains(Object o)
벡터가 지정된 객체를 포함하고 있으면 true 반환
E elementAt(int index)
지정된 인덱스의 요소 반환
E get(int index)
지정된 인덱스의 요소 반환
int indexOf(Object o)
지정된 객체와 같은 첫 번째 요소의 인덱스 반환. 없으면 -1 반환
boolean isEmpty()
벡터가 비어있으면 true 반환
E remove(int index)
지정된 인덱스의 요소 삭제
boolean remove(Object o)
지정된 객체와 같은 첫 번째 요소를 벡터에서 삭제
void removeAllElements()
벡터의 모든 요소를 삭제하고 크기를 0으로 만듬
int size()
벡터가 포함하는 요소의 개수 반환
Object[] toArray()
벡터의 모든 요소를 포함하는 배열을 반환
Vector 객체
v
Vector v = new Vector();
Vector 객체 생성
19
요소 객체 삽입v.add("Hello");
v
v.add(new Integer(4));
v.add(new Person());
요소객체개수 nint n = v.size(); // n은 3
벡터의 용량 c int c = v.capacity(); //c는 7
"Hello"
4
String
Integer
Person
n=3
c=7
v
요소 객체 중간v.add(2,
삽입 "Sahni");
v.add(5, "Sahni"); // v.size()인 3 보다 큰 곳에 삽입 불가능, 오류
obj
객체 얻어내기 Integer obj = (Integer)v.get (1);
int i = obj.intValue();
i=4
"Hello"
4
"Sahni"
String
Integer
String
Person
20
v
요소 객체 삭제v.remove(1);
v.remove(4); // 인덱스 4에 요소 객체가 없으므로 오류
"Hello"
"Sahni"
String
String
last
Person last = (Person)v.lastElement();
마지막 요소 객체
v
removeAllElements();
모든 요소 객체v.삭제
Person
컬렉션과 자동 박싱/언박싱
21

JDK 1.5 이전 버전

Wrapper 클래스를 이용하여 기본 타입을 객체로 만들어 사용
Vector v = new Vector();
v.add(new Integer(4));
v.add(new Character(’r’));
v.add(new Double(3.14));

컬렉션으로부터 요소를 얻어올 때도 해당 타입의 값을 얻어오는 메소드
를 호출
Integer n = (Integer)v.get(0);
int k = n.intValue(); // k = 4

JDK 1.5부터

자동 박싱/언박싱의 기능 추가
Vector v = new Vector();
v.add(4); // 4 → new Integer(4)로 자동 박싱
v.add(’r’); // ’r’ → new Character(’r’)로 자동 박싱
v.add(3.14); // 3.14 → new Double(3.14)로 자동 박싱
int k = v.get(0); // Integer 타입이 int 타입으로 자동 언
박싱, k = 4
예제 8-1 : 벡터 내의 모든 요소 객체 출력하기
22
다음 코드에 대한 결과는 무엇인가?
import java.util.Vector;
public class VectorEx {
public static void main(String[] args) {
Vector v = new Vector();
v.add("Hello");
v.add(new Integer(4));
v.add(new Double(3.14));
System.out.println("벡터내의 요소 객체
수 :"+v.size());
System.out.println("벡터의 현재 용량 :"+v.capacity());
for(int i=0; i<v.size(); i++) {
Object obj = v.get(i);
if(obj instanceof String) {
String str = (String)obj;
System.out.println(str);
}
else if(obj instanceof Integer) {
Integer x = (Integer)obj;
int n = x.intValue();
System.out.println(n);
}
else if(obj instanceof Double) {
Double y = (Double)obj;
double d = y.doubleValue();
System.out.println(d);
}
}
}
}
벡터내의 요소 객체
수 :3
벡터의 현재 용량 :10
Hello
4
3.14
예제 8-2 : 벡터에 있는 객체 중에서 정수 값만
모두 더하기
23
벡터에 있는 객체 중에서 정수 값만 모두 더하는 프로그램을 작성해보라
import java.util.Vector;
System.out.println("모든 정수의 합은 : " + sum);
}
public class VectorAddEx {
public static void main(String [] args) {
Vector v = new Vector();
v.add("Hello");
v.add(new Integer(4));
v.add(new Double(3.14));
v.add(new Integer(5));
int sum = 0;
for(int i=0; i<v.size(); i++) {
Object obj = v.get(i);
if(obj instanceof Integer) {
Integer x = (Integer)obj;
int n = x.intValue();
sum += n;
}
}
}
모든 정수의 합은 : 9
ArrayList 클래스
Collection
List
24

ArrayList의 특성



java.util.ArrayList
가변 크기 배열을 구현한 클래스
ArrayList에 삽입 가능한 것


객체만 가능
기본 데이타 타입은 불가능




ArrayList
Wrapper 객체로 만들어 삽입 가능

null도 삽입 가능


리스트의 맨 뒤에 객체 추가 : 공간이 모자라면 자동 늘림
리스트의 중간에 객체 삽입 : 삽입된 뒤의 객체는 뒤로 하나씩 이동

임의의 위치에 있는 객체 삭제 가능 : 객체 삭제 후 하나씩 앞으로 이동

다수의 스레드가 동시에 ArrayList에 접근할 때 ArrayList는 동기화시키
지 않음
ArrayList에 접근하는 곧에서 스레드 동기화를 수행하여야 함
ArrayList에 객체 삽입
ArrayList 에서 객체 삭제
벡터와 거의 유사하며 자동으로 스레드 동기화를 지원하지 않는 점
이 가장 큰 차이

ArrayList 객체의 내부 구성
25
add()를 이용하
여 요소를
삽입하고 get()을
이용하
여 요소를
obj 검색
합니다"사과"
add(obj)
get(3)
?
ArrayList 객체
0
1
2
3
4
5
6
get(i)
"Hello"
4
String
Integer
"사과"
Person
String
ArrayList 클래스의 주요 메소드
26
메소드
설명
boolean add(E e)
ArrayList의 맨 뒤에 요소 추가
void add(int index, E element)
지정된 인덱스에 지정된 객체를 삽입
boolean addAll(Collection<? extends E> c)
c가 지정하는 컬렉션의 모든 요소를 ArrayList의 맨 뒤에 추가
void clear()
ArrayList의 모든 요소 삭제
boolean contains(Object o)
ArrayList가 지정된 객체를 포함하고 있으면 true 반환
E elementAt(int index)
지정된 인덱스의 요소 반환
E get(int index)
지정된 인덱스의 요소 반환
int indexOf(Object o)
지정된 객체와 같은 첫 번째 요소의 인덱스 반환. 없으면 -1 반환
boolean isEmpty()
ArrayList가 비어있으면 true 반환
E remove(int index)
지정된 인덱스의 요소 삭제
boolean remove(Object o)
지정된 객체와 같은 첫 번째 요소를 ArrayList에서 삭제
int size()
ArrayList가 포함하는 요소의 개수 반환
Object[] toArray()
ArrayList의 모든 요소를 포함하는 배열을 반환
ArrayList 객체
a
ArrayList 생성 ArrayList a = new ArrayList ();
27
요소 객체 삽입a.add("Hello");
a
a.add(new Integer(4));
a.add(new Person());
요소객체개수 nint n = a.size(); // n은 3
int c = a.capacity(); //capacity() 메소드
용량
없음
"Hello"
4
String
Integer
Person
n=3
a
"Sahni");
요소 객체 중간a.add(2,
삽입
a.add(5, "Sahni"); // a.size()인 3 보다 큰 곳에 삽입 불가능, 오류
obj
객체 얻어내기 Integer obj = (Integer) a.get (1);
int i = obj.intValue();
i=4
"Hello"
4
"Sahni"
String
Integer
String
Person
28
a
요소 객체 삭제a.remove(1);
a.remove(4); // 오류
a
모든 객체 삭제a.clear();
"Hello"
"Sahni"
String
String
Person
예제 8-3 : ArrayList 내의 모든 요소 객체 출력하
기
29
다음 코드에 대한 결과는 무엇인가?
import java.util.ArrayList;
public class ArrayListEx {
public static void main(String[] args) {
ArrayList a = new ArrayList();
a.add("Hello");
a.add(new Integer(3));
a.add(new Double(3.14));
a.add(new Double(3.4));
a.remove(1);
for(int i=0; i<a.size(); i++) {
Object obj = a.get(i);
if(obj instanceof String) {
String str = (String)obj;
System.out.println(str);
}
else if(obj instanceof Integer) {
Integer x = (Integer)obj;
int n = x.intValue();
System.out.println(n);
}
else if(obj instanceof Double) {
Double y = (Double)obj;
double d = y.doubleValue();
System.out.println(d);
}
}
}
}
Hello
3.14
3.4
맵(Map)


사전과 같은 자료 구조
키(key)에 값(value)이 매핑된다.
맵(Map)
 Map 인터페이스의 개념
 사전과 같은 자료 구조
 키(key)에 값(value)이 매핑된다.
 중복된 키를 가질 수 없다.
 키가 제시되면 값을 돌려준다.
 예
 Key: 학생 객체의 학번, Value: 학생 객체
 Map을 구현한 클래스
 HashMap
 HashTable : 멀티 스레드 환경에서 동기화 지원 (cf. Vector)
 TreeMap
 트리구조에 데이터를 정렬
 만약 키들을 정렬된 순서로 돌려받을 필요가 있을 때 사용
 LinkedHashMap
Map : HashMap 클래스

Map 사용 방법

데이터 저장 방법




객체 추출 방법


32
Map<String, Student> freshman = new HashMap<String, Student>();
Student kim = new Student("20090001", "김준표", "서울 서초구");
Freshman.put("2009001", kim);
String s = "2009001";
st = freshman.get(s);
예제
Map

Map 사용 예제 2
WordFreq.java
import java.util.*;
public class WordFreq {
public static void main(String[] args) {
Map<String, Integer> m = new HashMap<String, Integer>();
String[] sample = { "to", "be", "or", "not", "to", "be", "is", "a", "problem" };
// 문자열에 포함된 단어의 빈도를 계산한다.
for (String a : sample) {
for (String a : sample) {
int freq = m.get(a);
Integer freq = m.get(a);
m.put(a, (freq == 0) ? 1 : freq + 1);
m.put(a, (freq == null) ? 1 : freq + 1);
}
}
Runtime 시 에러. Why?
System.out.println(m.size() + " 단어가 있습니다.");
System.out.println(m.containsKey("to"));
System.out.println(m.isEmpty());
System.out.println(m);
}
}
35
// 7
// true
// false
// {not=1, to=2, …}
Hashtable 클래스
Map
36

Hashtable의 특성



java.util.Hashtable
삽입 및 검색이 빠른 특징
키(key)와 값(value) 사용





Hashtable
동기화
Cf. HashMap
키와 값이 한쌍으로 삽입됨
키는 해쉬 테이블에 삽입되는 위치를 결정하는데 내부적으로 이용
값을 검색하기 위해서는 키를 반드시 이용함
키, 값 모두 객체만이 이용됨. 기본 데이터 타입은 사용할 수 없음
Hashtable에 삽입, 검색하는 예
Hashtable h = new Hashtable(); // Hashtable 객체 생성
h.put("apple", "사과"); // 키는 "apple"이며 값이 "사과"인 요소 삽입
String s = (String)h.get("apple"); // "apple" 키의 값을 검색. s는 "사과"
Hashtable의 내부 구성과 put(), get() 메소드
37
key 테이블
key
value
"apple"
"사과"
"love"
put(key,value)
key
"apple"
value
?
value 테이블
"사
랑"
"apple"
"사과
"
"baby"
"아
기"
get(key)
Hashtable 클래스의 주요 메소드
38
메소드
설명
void clear()
Hashtable의 모든 키 삭제
boolean contains(Object o)
Hashtable의 어떤 키가 지정된 객체에 매핑되면 true 반환
boolean containsKey(Object key)
Hashtable이 지정된 키를 포함하고 있으면 true 반환
boolean containsValue(Object value)
Enumeration<V> elements()
V get(Object key)
Hashtable이 하나 이상의 키를 지정된 값에 매핑시킬 수
있으면 true 반환
Hashtable의 모든 값의 enumeration 반환
지정된 키에 맵핑되는 값을 반환하거나 맵핑되는 값이
없으면 null을 반환
boolean isEmpty()
Hashtable에 키가 없으면 true 반환
Enumeration<K> keys()
Hashtable의 모든 키의 enumeration 반환
V put(K key, V value)
Hashtable에 key를 value에 매핑
V remove(Object key)
지정된 키와 이에 매핑된 모든 값들을 Hashtable에서 삭
제
해쉬테이블의 조작 사례
39
Hashtable 객체
h
Hashtable h = new Hashtable();
해쉬테이블 생성
h
(키, 값) 삽입 h.put("21", “홍길동”);
h.put("54", “황기태”);
40
h.put("76", “이소룡”);
h.put("123", “해리슨포
드”);
"76"
"이소
룡"
"21"
"홍길
동"
"해리슨
"123"
"54"
키로 값 읽기 String str = (String)h.get(“54”);
포드"
"황기
태"
str = "황기태"
h
h.remove(“54”);
키로 요소 삭제
"76"
"이소
룡"
"21"
"홍길
동"
"해리슨
"123"
포드"
키 개수
int n = h.size();
n=3
예제 8-4 : Hashtable 내의 모든 값 알아내기
41
다음 코드에 대한 결과는 무엇인가?
import java.util.*;
public class HashtableEx {
public static void main(String [] args) {
Hashtable h = new Hashtable(); // 디폴트 용량 11의 Hashtable
생성
h.put("21", "홍길동");
h.put("54", "황기태");
h.put("76", "이소룡");
h.put("123", "해리슨포드");
System.out.println("Hashtable의 키 개수 : "+h.size()); // 키의 개
수
Enumeration e = h.keys(); // Hashtable의 모든 키들을 얻어옴
while(e.hasMoreElements()) {
String key = (String)e.nextElement(); // 키
String value = (String)h.get(key); // 키에 매핑된 값
System.out.println(key + ":" + value);
}
}
}
Hashtable의 키 개수 :
4
76:이소룡
123:해리슨포드
21:홍길동
54:황기태
예제 8-5 : Hashtable 검색
42
Scanner 클래스를 이용하여 이름, 전화번호를 입력받아 이름을 키로 하여 해시
테이블에 저장하고 이름으로 전화번호를 검색하는 프로그램을 작성하라.
import java.util.*;
public class HashTableExample {
public static void main(String[] args) {
Hashtable members = new Hashtable();
Scanner sin = new Scanner(System.in);
System.out.println("공백으로 분리된 이름과 전화번호 5개를 입력하십시
오.");
for (int i = 0; i < 5; i++) {
System.out.print("이름, 전화번호 : ");
String name = sin.next(); // 이름 입력
String tel = sin.next(); // 전화번호 입력
members.put(name, tel); // 이름이 키, 전화번호를 값으로 Hashtable에
저장
}
System.out.println("전화번호를 검색할 이름을 입력하십시오.");
String key = sin.next(); // 키인 이름 입력
String val = (String)members.get(key); // 키로 매핑된 전화번호 검색
if (val != null)
System.out.println(key + "의 전화번호는 " + val + "입니다.");
else
System.out.println("입력하신 이름을 찾을 수 없습니다.");
}
}
LinkedList 클래스
Collection
List
43

LinkedList의 특성







LinkedList
Queue
java.util.LinkedList
List 인터페이스를 구현한 클래스
Vector, ArrayList 클래스와 매우 유사
요소 객체들은 양방향으로 연결되어 관리됨
요소 객체는 맨 앞, 맨 뒤에 추가 가능
요소 객체는 인덱스를 이용하여 중간에 삽입 가능
맨 앞이나 맨 뒤에 요소를 추가하거나 삭제할 수 있어 스택이나
큐로 사용 가능
LinkedList의 내부 구성과 add(), get() 메소드
44
LinkedList 객체
obj
"사과"
get(3)
?
head
add(obj)
tail
get(i)
"Hello"
4
String
Integer
"사과"
Person
String
연결리스트
Linked List
 이중 연결 리스트로 구현됨


각 원소들은 다음 원소와 이전 원소를 가리키는 링크(link)정
보를 지닌다.
ArrayList와 사용방법 거의 동일


거의 동일한 메소드가 정의되어 있으며 효과도 동일
LinkedList 에만 추가된 메소드



addFirst(), getFirst(), removeFirst(), removeLast(), addLast(), getLast()
ArrayList 를 생성할 시에는 initial capacity를 미리 지정할
수 있는 생성자가 존재하지만(default : 10) LinkedList에는
그러한 생성자가 없다.
그렇다면 ArrayList와 LinkedList 중 어느 것을 사용하는 것
이 좋은 것인가?
ArrayList vs. LinkedList

ArrayList vs. LinkedList

내부 구현 특징
ArrayList: 메모리에 데이터가 일렬로 붙어 있음
LinkedList: 메모리상 위치는 떨어져 있지만 포인터에 의해 연결
되어 있음

공간적인 측면
ArrayList는 10개의 공간을 initial capacity로 지닌 이후에 2배씩
늘림. 그러므로, 공간의 낭비가 어느 정도 있음
LinkedList는 실행 시 필요에 따라 새로운 원소를 위한 공간을 생
성하므로 공간이 절약됨

접근 속도 측면 (단순 읽기)

ArrayList는 인덱스와 함께 원소가 저장되는 구조이기 때문에 접근이
빠름

LinkedList는 어떤 원소에 접근하기 위하여 맨 처음부터 따라가서 찾
아야 하는 어려움이 있음
ArrayList vs. LinkedList

ArrayList vs. LinkedList

삭제와 삽입 측면

ArrayList는 삽입시에는 오른쪽 밀림(Shift Right) 연산이 일어나고
삭제시에는 왼쪽 밀림(Shift Left) 연산이 필요하므로 효율이 좋지 않
음
N
0 1 2 3 4 5
0 1 2 3 4 5
A B C D E
A B C D E
A B C D
A B C
A B
D E
C D E
A B N C D E

C
E
A B
D E
A B D
E
A B D E
LinkedList는 인접 노드의 포인터만 변경하면 되기 때문에 삭제와 삽
ArrayList vs. LinkedList

ArrayList vs. LinkedList

어떤 자료구조?
 검색위주이면 ArrayList가 유리
 삽입 삭제 위주라면 LinkedList가 유리
 최대 데이터 수가 예측 불가라면 LinkedList가 유리
예제
배열을 리스트로 변환하기

List를 일반 배열 자료로 변경하기

String[] stringArray = list.toArray(new String[list.size()]);


위에서 toArray의 파라미터로 String 타입의 비어있는 배열 객체를
넣어주어 toArray 메소드로 하여금 만들어야 할 배열의 정확한 타입
과 원소 개수를 알도록 해준다.
일반 배열 자료를 List로 변경하기
List<String> list = Arrays.asList(new String[size]);



일반적인 배열을 리스트로 변환한다.
String[] stringArray = {"AAA", "BBB", "CCC", "DDD"};
List<String> list = Arrays.asList(stringArray);
Iterator 활용
51

Iterator 인터페이스




Vector, ArrayList, LinkedList와 같은 리스트 자료구조에서 요소를
순차적으로 검색할 때 Iterator 인터페이스를 사용
iterator() 메소드를 호출하면 Iterator 객체를 반환
Iterator 객체는 검색한 위치를 기억하고 있어 인덱스 없이 순차
적 검색이 가능
Iterator 인터페이스 메소드
메소드
설명
boolean hasNext()
다음 반복에서 사용될 요소가 있으면 true 반환
E next()
다음 요소 반환
void remove()
마지막으로 반환된 요소를 제거
반복자(iterator)

반복자(iterator): 반복자는 컬렉션의 원소들을 하나씩 처
리하는데 사용  For-each 문이 더 편리함!
Iterator 객체 생성하는 방법
Iterator e = list.iterator();
Iterator 객체 e에 정의된 3 개의 메소드
반복자
 ListIterator
 List를 구현한 클래스인 ArrayList, LinkedList, Vector에만 사용
 컬렉션의 원소들을 하나씩 처리하는데 사용하지만, 앞으로 검색
이 가능하기도 하며 뒤로도 검색 가능
 컬렉션 객체의 원소를 지니고 있는 Iterator 객체 생성하는 방법
 ListIterator e2 = list.listIterator();
 ListIterator 객체 e2에 정의된 주요 메소드




hasNext()
next()
hasPrevious(): 이전의 원소가 있는지 판단
previous(): 이전의 원소를 돌려줌
예제 8-6 : Iterator를 이용하여 ArrayList 내의 모든
요소 객체 출력하기
54
다음 코드에 대한 결과는 무엇인가?
import java.util.*;
public class IteratorExample {
public static void main(String[] args) {
ArrayList a = new ArrayList(); // 빈 리스트 생성
a.add("Hello");
a.add(3); // 자동 박싱, JDK 1.5 이후에서만 실행됨
a.add(3.14); // 자동 박싱
a.add(2, 3.4); // 자동 박싱, 인덱스 2에 객체 삽입
Iterator i = a.iterator(); // Iterator 객체 반환
while (i.hasNext()) { // Iterator 객체에 요소가 있을
때 까지 반복
Object obj = i.next(); // 다음 요소 반환
if(obj instanceof String) { // String 객체의 경우
String str = (String)obj;
System.out.println(str);
}
else if(obj instanceof Integer) { // Integer 객체의
경우
int n = (Integer)obj; // 자동 언박싱
System.out.println(n);
}
else if(obj instanceof Double) { // Double 객체의
경우
double d = (Double)obj; // 자동 언박싱
System.out.println(d);
}
}
}
}
Hello
3
3.4
3.14
집합(Set )
Collection
Set

집합(Set)은 원소의 중복을 허용하지 않는다.
 순서에 상관없이 원소 저장
 중복을 허용하지 않음
 List 계열 보다는 호출 가능 메소드의 개수가 적음
Collection 인터페이스에 정의된 정도의 메소드
만 지원
대표적인 메소드
add(Object o)
contains(Object o)
isEmpty()
remove(Object o)
size()
iterator()
toArray(Object[] a)
HashSet
Set 인터페이스를 구현하는 방법

HashSet


TreeSet


HashSet은 해쉬 테이블에 원소를 저장하기 때문에 성능면에서
가장 우수하다. 하지만 원소들의 순서가 일정하지 않은 단점이
있다.
값에 따라서 순서가 결정되며 하지만 HashSet보다는 느리다.
LinkedHashSet

해쉬 테이블과 연결 리스트를 결합한 것으로 원소들의 순서는 삽
입되었던 순서와 같다.
예제
순서가 일정하지 않다!
대량 연산 메소드
위에서 addAll, retainAll, removeAll 메소드는 원집합인 s1
을 변경한다. 원집합의 변경을 원하지 않으면 다음과 같이
코딩한다.
Set<String> union = new HashSet<String>(s1);
union.addAll(s2);
예제
Collections 클래스 활용
61

Collections 클래스



java.util 패키지에 포함
컬렉션에 대해 연산을 수행하고 결과로 컬렉션을 반환
주요 메소드






컬렉션에 포함된 요소들을 소팅하는 sort() 메소드
Collections.sort(List list)
요소의 순서를 반대로 하는 reverse() 메소드
Collections.reverse(List list)
요소들의 최대, 최소값을 찾아내는 max(), min() 메소드
특정 값을 검색하는 binarySearch() 메소드
Collections.binarySearch(List list, Object key)
자료 썪기 shuffle() 메소드
Collections.shuffle(List list, Random rnd)
모두 static 메소드
예제 8-7 : Collections 클래스의 활용
62
Collections를 사용한 다음 코드에 대한 결과는 무엇인가?
import java.util.*;
public class CollectionsExample {
환
// 리스트의 요소를 모두 출력하는 메소드
static void printList(LinkedList l) {
Iterator iterator = l.iterator(); // Iterator 객체 반
반환
while (iterator.hasNext()) {
// Iterator 객체에 요소가 있을 때 까지 반복
String e = (String)iterator.next(); // 다음 요소
public static void main(String[] args) {
LinkedList myList = new LinkedList(); // 빈 리스트 생
성
myList.add("트랜스포머");
myList.add("스타워즈");
myList.add("매트릭스");
myList.add(0,"터미네이터");
myList.add(2,"아바타");
Collections.sort(myList); // 요소 정렬
printList(myList); // 정렬된 요소 출력
Collections.reverse(myList); // 요소의 순서를 반대로
printList(myList); // 요소 출력
String separator;
if (iterator.hasNext())
separator = "->"; // 마지막 요소가 아니면
// "아바타" 요소의 인덱스 검색
-> 출력
int index = Collections.binarySearch(myList, "아바타
else
“)+1;
separator = "\n"; // 마지막 요소이면 줄바
System.out.println("아바타는 " + index + "번째 요소
꿈
입니다.");
소팅된
순서대로
출력
System.out.print(e+separator);
}
매트릭스->스타워즈->아바타->터미네이
}
}터->트랜스포머
거꾸로
출력
}
트랜스포머->터미네이터->아바타->스타
워즈->매트릭스
Collection 클래스
Collections 클래스 사용 정렬 예제 1
import java.util.*;

Sort.java
public class Sort {
public static void main(String[] args) {
String[] sample = { "i", "walk", "the", "line" };
List<String> list = Arrays.asList(sample); // 배열을 리스트로 변경
Collections.sort(list);
System.out.println(list);
역순정렬:
}
Collections.sort(list,Colle
ctions.reverseOrder())
}
[i, line, the, walk]
63
Collection 클래스

Collections 클래스 사용 정렬 예제 2-1
SortTest.java
import java.util.*;
class Student implements Comparable<Student> {
int number;
String name;
}
public Student(int number, String name) {
this.number = number;
this.name = name;
public interface Comparable<T> {
}
public int compareTo(T o);
public String toString() {
}
return name;
}
public int compareTo(Student s) {
public int compareTo(Student s) {
return number - s.number;
return name.compareTo(s.name);
}
}
64
이름으로 정렬
Collection 클래스

Collections 클래스 사용 예제 2-2
public class SortTest {
public static void main(String[] args) {
Student array[] = { new Student(20090002, "이철수"),
new Student(20090001, "김철수"),
new Student(20090003, "박철수") };
List<Student> list = Arrays.asList(array);
Collections.sort(list);
System.out.println(list);
}
}
[김철수, 이철수 , 박철수]
65
// 번호순
이름으로!!!!
SortTest.java
Collection 클래스
Shuffle.java

Collections 클래스 사용 섞기 예제 3
import java.util.*;
public class Shuffle {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
for (int i = 1; i <= 10; i++)
list.add(i);
Collections.shuffle(list, new Random(System.currentTimeMillis()));
System.out.println(list);
}
}
66
Collection 클래스
java.util.*; 클래스 사용 탐색 예제 4
Collections
 import
public class Search {
public static void main(String[] args) {
int key = 50;
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < 100; i++)
list.add(i);
int index = Collections.binarySearch(list, key);
System.out.println("탐색의 반환값 =" + index);
}
}
탐색의 반환값 =50
67
Search.java
Collection 클래스

Collections 클래스의 다른 메소드

Object min(Collection coll), Object max(Collection coll)


void reverse(List list)


src리스트의 원소들을 dest 리스트에 복사한다.
void swap(List list, int i, int j)

68
list에 지정된 obj로 원소를 채운다.
void copy(List dest, List src)


list 원소들의 순서를 반대로 바꾼다.
void fill(List list, Object obj)


컬렉션에서 최대값과 최소값을 찾는다.
list의 지정된 두 위치의 원소를 바꾼다.
JDK 1.5 이전 자바의 컬렉션 문제점
69

삽입되는 원소 객체는 사실 모두 Object 타입이어야 함


int, double 등의 기본 타입 데이타는 직접 삽입될 수 없음
객체를 컬렉션에서 꺼내올 때 다운 캐스팅 필요

Object 타입에서 실제 클래스 타입으로의 다운 캐스팅 불편
public class VectorEx {
public static void main(String [] args) {
Vector v = new Vector();
v.add("Hello");
v.add(new Integer(3));
v.add(new Person());
int n = v.size(); // n은 3
for(int i=0; i<n; i++) {
if(v.get(i) instanceof string)
String s = (String)v.get(i);
else if(v.get(i) instanceof Integer)
int n = ((Integer)v.get(i)).intValue();
else if(v.get(i) instanceof person)
Person p = (Person)v.get(i);
}
}
}
String s = v.get(i); // 컴파일 오류
Vector에 들어
있는 요소의 실
제 타입으로 다
운 캐스팅을 해
야 하는 문제
JDK 1.5 이전 버전의 Vector 클래스의 예
70

JDK 1.5 이전 버전의 Vector 클래스 예제

http://download.oracle.com/javase/1.4.2/docs/api/java/util/Vector
.html참조
1: Vector myVector = new Vector();
2: myVector.add(new Integer(0));
3: Integer x = (Integer) myVector.elementAt(0);

제네릭 도입 이전에는 Object 클래스를 이용하여 모든 객체들을 참조
JDK 1.5이전 Vector는 Object를 요소로 받아 들임
3번 행의 다운 캐스팅이 반드시 필요하며 이 부분이 문제를 발생시킨
다.
컴파일러는 elementAt이 Object 타입을 반환할 것이라는 밖에는 알지
못하므로 프로그래머가 명시적으로 타입을 지정하여야 한다.
규모가 큰 프로그램의 작성 시 프로그래머가 타입을 실수로 잘못 지정
하는 경우에는 런타임에 ClassCastException이 발생
제네릭을 이용하면 컴파일러가 요소의 타입을 알 수 있어 타입 불일치
를 방지





제네릭의 기본 개념
71

제네릭



디자인 패턴의 매개 변수화된 타입과 메소드(parameterized type
and method)를 의미
JDK 1.5부터 도입
컬렉션은 다양한 타입의 객체들을 하나로 모아서 관리하므로 제
네릭으로 정의되어 있음
제네릭 Vector를 설명하는 자바 API
72
제네릭 컬렉션 사용하기
73

제네릭 Vector 클래스


벡터는 일반 배열과는 달리 크기가 가변적인 객체의 배열을 구현
배열의 원소는 객체만 허용



기본 데이터 타입은 원소가 될 수 없음
add, remove, indexOf, size, Iterator 등 메소드 이용하여 관리
제네릭 Vector 사용하기
Vector<Integer> myVector = new Vector<Integer>();

제네릭 Vector의 생성
제네릭 벡터에 요소 삽입

제네릭 벡터에서 요소 얻기
Integer n = myVector.get(0);
Integer m = myVector.get(1);
Integer k = myVector.get(2);

생성할 때 지정한 타입이
아닌 타입은 삽입 불가
myVector.add("hello"); // 컴파일 오류
myVector.add(new Double(3.5)); // 컴파일
오류
myVector.add(new Person()); // 컴파일 오류

myVector.add(new Integer(5));
myVector.add(new Integer(55));
myVector.add(new Integer(23));
예제 8-8 : 제네릭 Vector 사용하기
74
다음 코드에 대한 결과는 무엇인가?
import java.util.Collections;
import java.util.Vector;
public class VectorExample {
public static void main(String[] args) {
Vector<Integer> v = new Vector<Integer>(3);
System.out.println("벡터의 초기 크기는 " + v.capacity());
v.add(new Integer(1));
v.add(new Integer(22));
v.add(new Integer(51));
v.add(new Integer(10));
System.out.println("벡터의 크기는 " + v.capacity());
Collections.sort(v);
for (int i=0;i<v.size();i++) { // 벡터에 있는 모든 요소에
대해 반복
Integer n = v.elementAt(i); // 요소 객체 알아내기
System.out.println(n.toString());
}
}
}
벡터의 초기 크기는 3
벡터의 크기는 6
1
10
22
51
예제 8-9 : 제네릭 타입을 두 개 가진 제네릭
Hashtable 사용하기
75
다음 코드에 대한 결과는 무엇인가?
import java.util.Enumeration;
import java.util.Hashtable;
public class HashtableEx {
public static void main(String [] args) {
Hashtable<String, String> h = new Hashtable<String, String>();
h.put("21", "홍길동");
h.put("54", "황기태");
h.put("76", "이소룡");
h.put("123", "해리슨포드");
System.out.println("해쉬에 담긴 정보 수 : "+h.size());
Enumeration<String> e = h.keys();
while(e.hasMoreElements()) {
String key = e.nextElement();
String value = h.get(key);
System.out.println(key + ":" + value);
}
}
}
Hashtable의 키 개수 : 4
76:이소룡
123:해리슨포드
21:홍길동
54:황기태
제네릭 클래스와 인터페이스 선언
76

제네릭 클래스 작성 예

일반화된 타입(generic type) 매개 변수 T를 가진 MyClass
public class MyClass<T> {
T val;
void set(T a) {
val = a;
}
T get() {
return val;
}
}

작성된 MyClass 타입 객체 생성 예
MyClass<String> s = new MyClass<String>();
s.set("hello");
System.out.println(s.get()); // "hello" 출력
MyClass<Integer> n = new MyClass<Integer>();
n.set(new Integer(5));
System.out.println(n.get()); // 숫자 5 출력
타입 매개 변수
77

타입 매개 변수



‘<‘과 ‘>’사이의 문자로 표현
하나의 대문자를 타입 매개 변수로 사용
많이 사용하는 타입 매개 변수 문자





타입 매개변수가 나타내는 타입의 객체 생성 불가



E : Element를 의미하며 컬렉션에서 요소를 표시할 때 많이 사용한
다.
T : Type을 의미한다.
V : Value를 의미한다.
K : Key를 의미
ex) T a = new T();
타입 매개 변수는 나중에 실제 타입으로 대체 된다.
어떤 문자도 매개 변수로 사용될 수 있다.
제네릭 클래스, 인터페이스 사용
78

변수 선언

제네릭 클래스 또는 인터페이스 타입 변수를 선언할 때는 타입
매개 변수에 실제 타입을 기입
List<Integer> li;
Vector<String> vs;

객체 생성

제네릭 클래스 객체를 생성할 때도 타입 매개 변수에 실제 타입
을 기입
Vector<String> vs = new Vector<String>();
예제 8-10 : 스택
79
스택 자료 구조를 제네릭 클래스로 선언하고, String과 Integer형 스택을 사용
하는 예를 보여라.
class GStack<T> {
int tos; // 스택에 저장된 요소의 개
수
Object [] stck;
public GStack() {
tos = 0;
stck = new Object [10];
}
public void push(T item) {
if(tos == 10)
return;
stck[tos] = item;
tos++;
}
public T pop() {
if(tos == 0)
return null;
tos--;
return (T)stck[tos];
}
}
public class MyStack {
public static void main(String[] args) {
// String 타입의 GStack 생성
GStack<String> g = new GStack<String>();
g.push("seoul");
g.push("busan");
g.push("LA");
System.out.println(g.pop());
System.out.println(g.pop());
System.out.println(g.pop());
// Integer 타입의 GStack 생성
GStack<Integer> i = new GStack<Integer>();
i.push(new Integer(1));
i.push(new Integer(3));
i.push(new Integer(5));
System.out.println(i.pop());
System.out.println(i.pop());
System.out.println(i.pop());
}
}
LA
busan
seoul
5
3
1
제네릭과 배열
80

제네릭에서 배열의 제한

제네릭 클래스 또는 인터페이스의 배열을 허용하지 않음
GStack<Integer>[] gs = new GStack<Integer>[10];

타입 매개 변수가 나타내는 타입의 배열을 생성하는 것도 허용되
지 않음
T[] a = new T[10];
앞
예제에서는 Object 타입으로 배열 생성 후 실제 사용할 때 타입 캐
스팅
return (T)stck[tos]; // 타입 매개 변수 T타입
으로 캐스팅

타입 매개변수가 나타내는 타입의 배열 선언은 허용
public void myArray(T[] a) {....}
제네릭 메소드
81

제네릭 메소드 정의

메소드에서도 타입 매개 변수를 이용하여 제네릭 메소드 정의 가
능
class GenericMethodEx {
static <T> void toStack(T[] a, GStack<T> gs) {
for (int i = 0; i < a.length; i++) {
gs.push(a[i]);
}
}
}

제네릭 메소드를 호출할 때는 컴파일러가 메소드의 인자를 통해
이미 타입을 알고 있으므로 타입을 명시하지 않아도 됨
String[] sa = new String[100];
GStack<String> gss = new GStack<String>();
GenericMethodEx.toStack(sa, gss);

sa는 String[], gss는 GStack<String> 타입이므로 T를 String으로
유추
예제 8-11 : 스택의 내용을 반대로 만드는 제네
릭 메소드 만들기
82
예제 8-10의 GStack을 이용하여 주어진 스택의 내용을 반대로 만드는 제네
릭 메소드 reverse()를 작성하라.
public class GenericMethodExample {
// T가 타입 매개 변수인 제네릭 메소드
public static <T> GStack<T> reverse(GStack<T> a) {
// T타입의 GStack 생성
GStack<T> s = new GStack<T>();
while (true) {
T tmp;
tmp = a.pop(); // 원래 스택에서 요소 하나를
꺼냄
if (tmp==null) // 스택이 비었음
break;
else
s.push(tmp); // 새 스택에 요소를 삽입
}
return s; // 새 스택을 반환
}
public static void main(String[] args) {
// Double 타입의 GStack 생성
GStack<Double> gs =
new GStack<Double>();
// 5개의 요소를 스택에 push
for (int i=0; i<5; i++) {
gs.push(new Double(i));
}
gs = reverse(gs);
for (int i=0; i<5; i++) {
System.out.println(gs.pop());
}
}
}
0.0
1.0
2.0
3.0
4.0
제네릭의 장점
83






컬렉션과 같은 컨테이너 클래스에 유연성을 해치지 않
으며 type-awareness를 첨가
메소드에 type-awareness 첨가
컴파일 시에 타입이 결정되어 보다 안전한 프로그래밍
가능
개발 시 다운캐스팅(타입 캐스팅) 절차 불필요
런타임 타입 충돌 문제 방지
ClassCastException 방지
LAB. #1
1. 카드 게임 프로그램을 컬렉션 라이브리를 이용하여 작성하라.
(1)카드를 나타내는 Card 클래스를 작성한다. 하나의 카드는 무늬(suit)와 숫
자(number)를 가진다. 생성자, ToString 메소드 정의하라.
(2)카드 데크를 나타내는 CardDeck 클래스를 작성하라. CardDeck은 총
52 개의 Card 객체를 저장하여야 한다. ArrayList를 사용하여 카드들을 저
장하라. 생성자에서 모든 카드를 생성하라.
(3) CardDeck 클래스에 카드를 섞는 메소드 shuffle()을 콜렉션 클래스의 정
적메소드 shuffle()을 이용하여 정의하라.
(4) CardDeck 클래스에 Deck의 처음에서 카드를 제거하여서 반환하는 메소
드인 deal()을 작성하라.
(5) 카드 경기자를 나타내는 Player 클래스를 구현하라. Player 클래스도 카드
의 리스트를 가져야 한다.(ArrayList 사용할 것)
(6) Player는 카드를 얻어서 자신의 리스트에 추가하는 메소드 getCard()를
정의하라. 또한 자신의 카드를 보여주는 showCards() 메소드를 작성하라.
(7) main() 함수를 가지는 클래스 CardGame을 작성하라. CardDeck 클래스
의 객체를 생성하고, Deck의 카드를 섞은 다음 Player 객체를 두 명 생성한다.
카드를 7장 씩 분배하고 각자의 카드를 화면에 표시하라.
1. 카드를 나타내는 Card 클래스를 작성한다. 하나의 카드는 무늬(suit)와
숫자(number)를 가진다. 생성자, ToString 메소드 정의하라.
class Card {
String suit;
String number;
// 무늬
// 숫자
public Card(String suit, String number) {
________ = suit;
________ = number;
}
public String toString() {
return _______________;
}
}
85
// 생성자
2. 카드 데크를 나타내는 CardDeck 클래스를 작성하라. CardDeck은 총
52 개의 Card 객체를 저장하여야 한다. ArrayList를 사용하여 카드들을 저
장하라. 생성자에서 모든 카드를 생성하라.
class CardDeck {
ArrayList<Card> deck = new ___________;
public CardDeck() {
String[] suit = {"Clubs", "Diamond", "Hearts", "Spades"};
String[] number = {"2", "3", "4", "5", "6", "7",
"8", "9", "10", "Jack", "Queen", "King", "Ace"};
for (int i = 0; i < suit.length; i++)
for (int j = 0; j <number.length; j++)
________________________;
}
// 52장의 카드를 deck ArrayList에 add
86
3. CardDeck 클래스에 카드를 섞는 메소드 shuffle()을 콜렉션 클래스의
정적메소드 shuffle()을 이용하여 정의하라.
4. CardDeck 클래스에 Deck의 처음에서 카드를 제거하여서 반환하는
메소드인 deal()을 작성하라.
public void shuffle () {
Collections._______________;
}
public Card deal() {
return __________________;
}
87
5. 카드 경기자를 나타내는 Player 클래스를 구현하라. Player 클래스도
카드의 리스트를 가져야 한다.(ArrayList 사용할 것)
6. Player는 카드를 얻어서 자신의 리스트에 추가하는 메소드 getCard()
를 정의하라. 또한 자신의 카드를 보여주는 showCards() 메소드를
작성하라.
class Player {
_________________________;
// Card의 리스트 변수 list생성
public void getCard(Card card) {
list._____(card);
}
public void showCards() { // list 출력
_________________;
}
}
88
7. main() 함수를 가지는 클래스 CardGame을 작성하라. CardDeck 클
래스의 객체를 생성하고, Deck의 카드를 섞은 다음 Player 객체를 두 명
생성한다. 카드를 7장 씩 분배하고 각자의 카드를 화면에 표시하라.
public class CardGame {
public static void main(String[] args) {
CardDeck deck = new CardDeck();
___________;
// deck 카드 섞기 호출
Player p1 = new Player();
Player p2 = new Player();
for (int i = 0; i < 7; i++) {
_________________; // p1에게 카드 돌리기
_________________; // p1에게 카드 돌리기
}
p1.showCards();
p2.showCards();
}
}
[Clubs : 9, Clubs : 6, Clubs : Queen, Diamond : 6, Hearts :
Queen, Spades : King, Spades : 3]
[Diamond : 2, Clubs : 2, Hearts : Jack, Hearts : King, Spades : 6,
Clubs : 7, Hearts : Ace]
89
private static String getHandValue(Player hand){
if(hand.isRoyalFlush() == true)
return "Royal Flush";
if(hand.isStraightFlush() == true)
return "Straight Flush";
if(hand.isFourOfAKind() == true)
return "Four of a Kind";
if(hand.isFullHouse() == true)
return "Full House";
if(hand.isFlush() == true)
return "Flush";
if(hand.isStraight() == true)
return "Straight";
if(hand.isThreeOfAKind() == true)
return "Three of a Kind";
if(hand.isTwoPair() == true)
return "Two Pair";
if(hand.isPair() == true)
return "Pair";
return "Nothing";
}
LAB. 2 : BankAccount 확장
ArrayList<BankAccount> accounts = new
ArrayList<BankAccount>();
import java.util.ArrayList;
import java.util.ArrayList;
/**
This bank contains a collection of bank accounts.
*/
public class Bank
{
/**
Constructs a bank with no bank accounts.
*/
public Bank()
{
accounts = new ArrayList<BankAccount>();
}
/**
Adds an account to this bank.
@param a the account to add
*/
public void addAccount(BankAccount a)
{
accounts.add(a);
}
Bank.java
Big Java by Cay Horstmann
Bank.java
/**
Gets the sum of the balances of all accounts in this bank.
@return the total balance
*/
public double getTotalBalance()
{
double total = 0;
for (BankAccount a : accounts)
{
total = total + a.getBalance();
}
return total;
}
Big Java by Cay Horstmann
Bank.java
/**
Counts the number of bank account whose balance is at
least a given value.
@param atLeast the balance required to count an account
@return the number of accounts having least the given balance
*/
public int count(double atLeast)
{
int matches = 0;
for (BankAccount a : accounts)
{
if (a.getBalance() >= atLeast) matches++; // found a match
}
return matches;
}
Big Java by Cay Horstmann
Bank.java
/**
Finds a bank account with a given number.
@param accountNumber the number to find
@return the account with the given number, or null if there
is no such account
*/
public BankAccount find(int accountNumber)
{
for (BankAccount a : accounts)
{
if (a.getAccountNumber() == accountNumber) // found a match
return a;
}
return null; // no match in the entire array list
}
Big Java by Cay Horstmann
Bank.java
/**
Gets the bank account with the largest balance.
@return the account with the largest balance, or null if the
bank has no accounts
*/
public BankAccount getMaximum()
{
if (accounts.size() == 0) return null;
BankAccount largestYet = accounts.get(0);
for (int i = 1; i < accounts.size(); i++)
{
BankAccount a = accounts.get(i);
if (a.getBalance() > largestYet.getBalance())
largestYet = a;
}
return largestYet;
}
Big Java by Cay Horstmann
Bank.java
/**
Add an account to the bank.
@param accountNumber the account number of this account
@param initialBalance the initial balance of this account
*/
public void addAccount(int accountNumber, double initialBalance)
{
. . .// account에 add 메소드 이용하여 새 bankAccount 객체추가
}
/**
Deposit money into an account.
@param accountNumber the account number
@param amount the amount to be deposited
*/
public void deposit(int accountNumber, double amount)
{
. . . // find 메소드 이용하여 BankAccount 객체 찾은 다음 deposit 호출
}
/**
Withdraw money from an account.
@param accountNumber the account number
@param amount the amount to be withrawn
Bank.java
*/
public void withdraw(int accountNumber, double amount)
{
. . . // find 메소드 이용하여 BankAccount 객체 찾은 다음 withdraw 호출
}
/**
Get an account balance
@param accountNumber the account number
@return the account balance
*/
public double getBalance(int accountNumber)
{
. . . // find 메소드 이용하여 BankAccount 객체 찾은 다음 getBalance 호출
}
private ArrayList<BankAccount> accounts;
}
BankAccount.java
/**
A bank account has a balance that can be changed by
deposits and withdrawals.
*/
public class BankAccount
{
/**
Constructs a bank account with a zero balance.
@param anAccountNumber the account number for this account
*/
public BankAccount(int anAccountNumber)
{
accountNumber = anAccountNumber;
balance = 0;
}
Big Java by Cay Horstmann
BankAccount.java
101
/**
Constructs a bank account with a given balance.
@param anAccountNumber the account number for this account
@param initialBalance the initial balance
*/
public BankAccount(int anAccountNumber, double initialBalance)
{
accountNumber = anAccountNumber;
balance = initialBalance;
}
/**
Gets the account number of this bank account.
@return the account number
*/
public int getAccountNumber()
{
return accountNumber;
}
BankAccount.java
/**
Deposits money into the bank account.
@param amount the amount to deposit
*/
public void deposit(double amount)
{
double newBalance = balance + amount;
balance = newBalance;
}
/**
Withdraws money from the bank account.
@param amount the amount to withdraw
*/
public void withdraw(double amount)
{
double newBalance = balance - amount;
balance = newBalance;
}
Big Java by Cay Horstmann
BankAccount.java
103
/**
Gets the current balance of the bank account.
@return the current balance
*/
public double getBalance()
{
return balance;
}
private int accountNumber;
private double balance;
}
/**
This program tests the Bank class.
*/
public class BankTester
{
public static void main(String[] args)
{
Bank bank = new Bank();
int
int
int
int
dannysAccount = 0;
sallysAccount = 1;
harrysAccount = 2;
jerrysAccount = 3;
bank.addAccount(dannysAccount, 1000);
bank.addAccount(sallysAccount, 2000);
bank.addAccount(harrysAccount, 3000);
bank.addAccount( jerrysAccount, 10000);
BankTester.java
bank.deposit(dannysAccount, 200);
bank.withdraw(sallysAccount, 500);
bank.deposit(harrysAccount, 1000);
bank.withdraw( jerrysAccount, 7000);
System.out.println(
"Danny's Account Balance: " + bank.getBalance(dannysAccount));
System.out.println("Expected: 1200");
System.out.println(
"Sally's Account Balance: " + bank.getBalance(sallysAccount));
System.out.println("Expected: 1500");
System.out.println(
"Harry's Account Balance: " + bank.getBalance(harrysAccount));
System.out.println("Expected: 4000");
System.out.println(
"Jerry's Account Balance: " + bank.getBalance( jerrysAccount));
System.out.println("Expected: 3000");
}
}
Q&A