1) 제네릭(generic)
- 클래스나 메소드에서 처리할 자료형을 미리 지정하지 않음
- 클래스의 객체를 생성할 때 자료형을 지정함
- 주로 컬렉션 클래스와 인터페이스 및 반복자 클래스에 사용됨
- 제네릭 사용의 장점
하나의 클래스를 자료형 지정을 통하여 해당 자료형 전용 클래스로 사용
객체 형 변환을 하지 않아도 되어 소스가 간결해짐- 제네릭 정의 방법
꺽쇠표(<,>) 기호를 사용하여 영문 대문자 하나의 글자로 지정
1) 확장for문
- 배열 또는 컬렉션을 위한 for 문
- 배열의 인덱스나 컬렉션의 반복자 없이도 반복 가능
2) 열거형(enumeration type)
- 상수들을 묶어서 정의한 자료형
- 열거형 변수는 정의된 상수들만 지정할 수 있음
- 열거형 사용
클래스가 아니므로 객체 생성을 할 수 없음
열거형 변수를 선언하여 사용
1) 멀티 스레드(multi-thread)의 예
- 채팅 프로그램(상대방의 채팅냉녁이 화면에 표시되면서 동시에 내가 입력한 채팅내역을 전송)
- 게임 프로그램(사용자의 동작도 수행하면서, 상대방의 동작도 동시에 수행)
2) Thread 클래스 상속 방법
- Thread 클래스를 상속
- run() 메소드 오버라이딩
- Thread를 상속받은 클래스의 객체 생성
- start() 메소드 호출
3) Runnable 인터페이스 구현 방법
- Runnable 인터페이스를 구현
- run() 메소드 오버라이딩
- Runnable 인터페이스를 구현한 클래스의 객체 생성
- Runnable 구현 클래스의 객체를 이용하여 Thread 클래스의 객체 생성
- start() 메소드 호출
4) 멀티 스레드 제어
- 스레드 우선순위 제어 : 우선순위에 따라 스레드가 실행될 수 있는 시간이 할당됨
- 데몬(deamon) 스레드 : 일반 스레드의 작업을 돕는 보조적인 스레드
- 스레드 지연 : sleep() 메소드, join() 메소드
- 스레드 양보 : Thread.yield() 메소드
1) 손님에게 주문을 받고 주문을 처리하는 프로그램을 작성하십시오
2) 주문 스레드와 주문 처리 스레드를 구현하고, 동기화를 하시오
3) 주문 내역은 문자열로 제네릭 클래스를 이용하시오
package order;
import java.util.*;
public class Order {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("[주문처리 프로그램]");
OrderList list = new OrderList();
Runnable r1 = new Adding(list);
Runnable r2 = new Getting(list);
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
}
}
class OrderList {
LinkedList list = new LinkedList();
synchronized void add(T data) {
list.offer(data);
notify();
System.out.println("[ADD]"+list.toString());
}
synchronized T get() {
T value = null;
if( list.isEmpty() ) {
try {
wait();
} catch(Exception e) {}
}
value = list.pop();
return value;
}
}
class Adding implements Runnable {
String[] menu = { "Kimchi", "Bulgogi", "Pizza", "Chiken", "Coke" };
OrderList list;
public Adding(OrderList list) {
this.list = list;
}
public void run() {
for(int i=0; i < 10; i++) {
try {
Thread.sleep(200);
} catch(Exception e) {}
String value = menu[(int)(Math.random() * 4)];
list.add(value);
}
}
}
class Getting implements Runnable {
OrderList list;
public Getting(OrderList list) {
this.list = list;
}
public void run() {
while(true){
try {
Thread.sleep(500);
} catch(Exception e) {}
String value = list.get();
System.out.println("Order Remove : "+value);
}
}
}
<Result>
[주문처리 프로그램]
[ADD][Kimchi]
[ADD][Kimchi, Bulgogi]
Order Remove : Kimchi
[ADD][Bulgogi, Chiken]
[ADD][Bulgogi, Chiken, Kimchi]
Order Remove : Bulgogi
[ADD][Chiken, Kimchi, Pizza]
[ADD][Chiken, Kimchi, Pizza, Chiken]
[ADD][Chiken, Kimchi, Pizza, Chiken, Kimchi]
Order Remove : Chiken
[ADD][Kimchi, Pizza, Chiken, Kimchi, Chiken]
[ADD][Kimchi, Pizza, Chiken, Kimchi, Chiken, Pizza]
Order Remove : Kimchi
[ADD][Pizza, Chiken, Kimchi, Chiken, Pizza, Bulgogi]
Order Remove : Pizza
Order Remove : Chiken
Order Remove : Kimchi
Order Remove : Chiken
Order Remove : Pizza
Order Remove : Bulgogi