확장 문법 이해하기

JongseokLee·2021년 7월 27일
0
post-thumbnail

확장 문법 이해하기

1. 제네릭 이해하기

1) 제네릭(generic)

  • 클래스나 메소드에서 처리할 자료형을 미리 지정하지 않음
  • 클래스의 객체를 생성할 때 자료형을 지정함
  • 주로 컬렉션 클래스와 인터페이스 및 반복자 클래스에 사용됨
  • 제네릭 사용의 장점

    하나의 클래스를 자료형 지정을 통하여 해당 자료형 전용 클래스로 사용
    객체 형 변환을 하지 않아도 되어 소스가 간결해짐

  • 제네릭 정의 방법

    꺽쇠표(<,>) 기호를 사용하여 영문 대문자 하나의 글자로 지정

2. 확장 for문 및 열거형 이해하기

1) 확장for문

  • 배열 또는 컬렉션을 위한 for 문
  • 배열의 인덱스나 컬렉션의 반복자 없이도 반복 가능

2) 열거형(enumeration type)

  • 상수들을 묶어서 정의한 자료형
  • 열거형 변수는 정의된 상수들만 지정할 수 있음
  • 열거형 사용

    클래스가 아니므로 객체 생성을 할 수 없음
    열거형 변수를 선언하여 사용

3. 멀티 스레드 이해하기

1) 멀티 스레드(multi-thread)의 예

  • 채팅 프로그램(상대방의 채팅냉녁이 화면에 표시되면서 동시에 내가 입력한 채팅내역을 전송)
  • 게임 프로그램(사용자의 동작도 수행하면서, 상대방의 동작도 동시에 수행)

2) Thread 클래스 상속 방법

  • Thread 클래스를 상속
  • run() 메소드 오버라이딩
  • Thread를 상속받은 클래스의 객체 생성
  • start() 메소드 호출

3) Runnable 인터페이스 구현 방법

  • Runnable 인터페이스를 구현
  • run() 메소드 오버라이딩
  • Runnable 인터페이스를 구현한 클래스의 객체 생성
  • Runnable 구현 클래스의 객체를 이용하여 Thread 클래스의 객체 생성
  • start() 메소드 호출

4) 멀티 스레드 제어

  • 스레드 우선순위 제어 : 우선순위에 따라 스레드가 실행될 수 있는 시간이 할당됨
  • 데몬(deamon) 스레드 : 일반 스레드의 작업을 돕는 보조적인 스레드
  • 스레드 지연 : sleep() 메소드, join() 메소드
  • 스레드 양보 : Thread.yield() 메소드

4. 실습

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
profile
DataEngineer Lee.

0개의 댓글