제네릭(Generic) 메소드

매개변수입과 리턴타입 으로 타입파라미터를 갖는 메소드를 말한다.


제네릭 메소드 선언방법

리턴 타입 앞에 "<>" 기호를 추가하고 타입파라미터를 기술한다.

타입 파라미터를 리턴타입과 매개변수에 사용한다.

public <타입파라미터,  ...> 리턴타입  메소드명(매개변수,... ){ ... }

puvlic<T> Box<T> boxing(T t) { ... }

제네릭 메소드를 호출하는 두가지 방법


1) 리턴타입 변수  = < 구체적 타입 > 메소드명(매개값);   //명시적으로 구체적 타입 지정

2) 리턴타입 변수 = 메소드명(매개값);                            // 매개값을 보고 구체적 타입을 추정 

주로 2번 사용

exam1 

public class GenericMethod {
static class Box<T> { //box 클래스
private T t;
public T getT() { return t; }
public void setT(T t) { this.t = t; }
}
static class Util { // 박스를 이용해 제네릭 메소드가 있는 Util클래스
public static <T> Box<T> boxing(T t) {
Box<T> box = new Box<T>();
box.setT(t);
return box;
}
}
public static void main(String[] args) {
//1번 구체적 타입 명시 <Integer>boxing(100) 구체적타입 Integer 명시
Box<Integer> box1 = Util.<Integer>boxing(100);
int intValue = box1.getT();
System.out.println(intValue);

//2번 매개값을 보고 구체적 타입 추정. 홍길동 = String 타입
Box<String> box2 = Util.boxing("홍길동");
String strValue = box2.getT();
System.out.println("strValue = " + strValue);

}
}









exam2



public class Pair<K, V> {
private K key;
private V value;

public Pair(K key, V value) {
this.key = key;
this.value = value;
}

public K getKey() { return key; }

public void setKey(K key) { this.key = key; }

public V getValue() { return value; }

public void setValue(V value) { this.value = value; }
}
public class Util {
//두개의 Pair객체를 받아서 페어 객체의 K,V값을 비교 K와 V가 같다면 true or false
public static <K,V> boolean compare(Pair<K,V> p1, Pair<K,V> p2) {
boolean keyCompare = p1.getKey().equals(p2.getKey());
boolean valueCompare = p1.getValue().equals(p2.getValue());

// keyCompare 그리고 valueCompare 가 같으면 true
return keyCompare && valueCompare;

}
}
public class CompareMethodExample {
public static void main(String[] args) {
//두개의 Pair객체 생성
Pair<Integer, String> p1 = new Pair<>(1, "사과");
Pair<Integer, String> p2 = new Pair<>(1, "사과");
// 구체적 타입 명시.. 두개의 페어 객체를 비교
Util.<Integer,String>compare(p1, p2);

//매개값을 보고 구체적 타입 추정, new Pair<>(1, "사과") 1 =Integer 타입 , "사과" = String 타입
boolean result1 = Util.compare(p1, p2);
if (result1) {
System.out.println("논리적으로 동등합니다.");
} else {
System.out.println("논리적으로 동등하지 않습니다.");
}
}
}


'JAVA > JAVA' 카테고리의 다른 글

제네릭(Generic) 타입의 상속과 구현  (0) 2018.06.09
제네릭(Generic) 와일드카드 타입  (0) 2018.06.09
제네릭(Generic)이란 ? 제네릭 타입이란?  (0) 2018.06.08
Thread 정리..??  (0) 2018.06.08
자바 기본 변수  (0) 2018.05.08

제네릭(Generic)이란?

타입을 파라미터화해서 컴파일시 구체적인 타입이 결정되도록 하는 것.
자바5부터 새로 추가된 기능이다.
컬렉션, 람다식(함수적 인터페이스), 스트림, NIO에서 널리 사용된다.
제네릭을 모르면 도큐먼트를 해석 할 수 없다.?

ClassArrayList<E>
default Biconsumer<T, U> andThen(biConsumer<? super T, ? super U> afger)

제네릭을 사용함으로서 얻는 이점

컴파일시 강한 타입 체크를 할 수 있다.
        실행시  타입 에러가 나는 것 보다는 컴파일시에 미리 타입을 강하게 체크해서 에러를 사전에 방지.

타입변환을 제거할 수 있다.

 List list = new ArrayList();

list.add("hello");                                                              ->

String str = (String)list.get(0)

 List<String> list = new ArrayList<String>();

list.add("hello");

String str = list.get(0);




제네릭 타입이란

  타입을 파라미터로 가지는 클래스와 인터페이스를 말한다.

선언시 클래스 또는 인터페이스 이름 뒤에 "<>" 부호가 붙는다.
"<>" 사이에는 타입 파라미터가 위치한다.

T = 타입

public class 클래스명<T>{...}
public interface 인터페이스명<T>{...}

타입 파라미터

일반적으로 대문자 알파벳 한문자로 표현한다.   T,  V등등

개발 코드에서는 타입 파라미터 자리에 구체적인 타입을 지정해야 한다.

제네릭 타입을 사용할 경우의 효과

 비제네릭
   Object타입을 사용하므로서 빈번한 타입 변환 발생  - > 성능 저하

public class testBox {
private Object object;
public Object getObject() { return object; }
public void setObject(Object object) { this.object = object; }

public static void main(String[] args) {
testBox box = new testBox();
box.setObject("hello"); //String 타입을 Object 타입으로 자동 타입 변환 후 저장
String str = (String) box.getObject();//Object 타입을 String 타입으로 강제 타입 변환 후 얻음
}
}


제네릭 적용    불필요한 타입변환이 필요 없어짐.         제네릭 타입을 사용할때( 제네릭타입의 객체를 만들때 ?)  T 부분을 원하는 타입을 주면 된다.

public class TestGenericBox<T> {
private T t;
public T getT() { return t; }
public void setT(T t) { this.t = t; }

public static void main(String[] args) {
TestGenericBox<String> stringGecericBox = new TestGenericBox<String>();
stringGecericBox.setT("hello");
String str = stringGecericBox.getT();
}
}


두 개 이상의 타입 파라미터를 사용해서 선언할 수 있다.

class<K, V, ...> {...}
interface<K, V, ...> {...}

public class 두개이상의타입파라미터<T, M> {
private T kind;
private M model;

public T getKind() { return kind; }
public void setKind(T kind) { this.kind = kind; }

public M getModel() { return model; }
public void setModel(M model) { this.model = model; }

}


중복된 타입 파라미터를 생략한 다이아몬드( <>) 연산자

두개이상의타입파라미터<Tv, String> 티비 = new 두개이상의타입파라미터<Tv, String>();

//다이아몬드연산자 적용
두개이상의타입파라미터<Tv, String> 티비 = new 두개이상의타입파라미터<>();


Exam

public static void main(String[] args) {
// 제네릭 을 사용사여 생성시 Tv 타입과 String 타입을 지정후 set, get 실행
두개이상의타입파라미터<Tv, String> product1 = new 두개이상의타입파라미터<>();
produck1.setKind(new Tv());
product1.setModel("스마트 TV");
Tv tv = product1.getKind();
String tvModel = product1.getModel();

// 제네릭 을 사용사여 생성시 Car 타입과 String 타입을 지정후 set, get 실행
두개이상의타입파라미터<Car, String> product2 = new 두개이상의타입파라미터<>();
product2.setKind(new Car());
product2.setModel("리어카");
Car car = product2.getKind();
String carModel = product2.getModel();


'JAVA > JAVA' 카테고리의 다른 글

제네릭(Generic) 타입의 상속과 구현  (0) 2018.06.09
제네릭(Generic) 와일드카드 타입  (0) 2018.06.09
제네릭(Generic) 메소드  (0) 2018.06.08
Thread 정리..??  (0) 2018.06.08
자바 기본 변수  (0) 2018.05.08



자바 애플리캐이션은     메인(main) 스레드가 main() 메소드를 실행시킨다.

작업 스레드 클래스는 Thread 클래스를 상속 해서 만들 수 있다.

Runnable 객체는 스레드가 실행해야할 코드를 가지고 있는 객체라고 볼 수 있다.


스레드를 만드는  방법,? 종류?

1. 클래스 extends Thread     스레드를 상속받고  run()메소드를 오버라이딩 


2. 클래스 implement Runnable            Runnable을 구현한 클래스를 

다른 곳에서 생성자로 호출     

Thread thread = new Thread(new 클래스 ) 호출



3.  익명객체로 Runnable 구현 (람다식 가능)?



스레드의 우선순위  

우선 순위가 높은 스레드가 실행 기회를 더 많이 가진다.

우선순위는 1~10까지가 있으며 5가 디폴드 값이다.

Thread클래스는 NORM_PRIORITY,  MIN_PRIORITY, MAX_PRIORITY 상수를 제공한다.

1이 가장 낮은 우선수위      10이 제일 높은 우선순위



동기화 메소드와  동기화 블록    synchronized


동기화 메소드와 블록은 단일스레드 환경에선 필요가 없다.

스레드가 동기화 메소드, 블록를 실행 할 때 다른 스레드는 다른 동기화 메소드를 호출할 수 없다.


스레드 일시 정지상태 

일시 정지 상태는  BLOCKED, WAITING, TIMED_WAITING 이있다.

스레드가 동기화 메소드를 실행 할 때  다른 스레드가 다른 동기화 메소드를 호출하게 되면 BLOCKED 상태가 된다.

동기화 메소드내에서 wait()를 호출하면 WAITING 일시정지 상태가 된다.

Sleep() 메소드를 실행 하면 TIMED_WAITING일시 정지 상태가 된다.


 스레드 상태 제어 메소드

yield() 메소드를 호출한 스레드는 동일한 우선 순위나 높은 우선수위의 스레드에게 실행 기회를 양보하고 자신은 실행 대기상태가 된다.

sleep() 메도드를 호출한 스레드는주어진 시간 동안 일시 정지 상태가 된다.

stop() 즉시 스레드를 중지시키기떄문에 스레드에 안정성에 좋지않다. 사용하지 않는게 좋다.

join() 메소드를 호출한 스레드는 일시정지상태가 된다.

interrupt() 를호출하면   일시정지상태    에서  InterruptedException을 발생 시킨다.  
**   (실행 대기 상태에서 호출되면  일시정지 상태가 될 때까지  InterruptedException은 발생하지 않는다.  )

InterruptedException 발생하지 않았다면 , interrupted(), isInterrupted() 메소드는 true를 리턴한다.


public class ThreadExample {
public static void main(String[] args) {

Thread thread = new MovieThread();
thread.start();

try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// interrupt() 실행 일정지가 되면 InterruptedException 발생
thread.interrupt();

}
}
public class MovieThread extends Thread {
@Override
public void run() {
while (true) {
System.out.println("동영상을 재생합니다.");
// 방법 1
// Thread.sleep(1000) 일지 정지 상태로 만듬.
// 일시정지가되면 InterruptedException 발생
// catch부분에서 break; 실행
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
break;
}

//방법 2
// this.isInterrupted()
if (Thread.interrupted()) {
break;
}

}
}
}

while  문으로 반복저인 작업을 하는 스레드를 종료 시키는 방법 !

조건식에 boolean 타입의 stop 플래그를 이용해서 while 문을 빠져나가게 한다.


스레드가 반복적으로 일시 정지 상태가 된다면 InterruptedException 발생시켜 예외처리 코드에서 break문으로 while 문을 빠져나가게 한다.


스레드가 일시 정지 상태로 가지 않는다면 islnterrupted()  interrupted() 메소드의 리턴값을 조사해서 true 경우 break 문으로 while 문을 빠져나가게 한다.



데몬 스레드

메인 스레드가 종료하면 데몬스레드도 종료

Thread thread = new MovieThread();
Thread.setDaeMon(true);

MovieThread는 데몬스레드가 된다.



스레드풀


 갑작스러운 작업의 증가로 스레드의 폭증을 막기위해 사용된다.


 ExecutorService 객체가 스레드풀이며 newFixedThreadPool0 메소드로 얻을 있다.


작업은 Runnable 또는 Callable 인터페이스를 구현해서 정의한다.


 Future   (지연완료객체, 지연객체)

 Future 스레드가 처리한 작업의 결과값을 얻어 내는  객체이다.


 submit 메소드를 호출하면 즉시 리턴되는 객체이다.


Future get 메소드는 스레드가 작업을 완료하기 전까지 블로킹된다.

 CompletionService 이용하면 작업 완료된 순으로 Future 얻을 있다.





'JAVA > JAVA' 카테고리의 다른 글

제네릭(Generic) 타입의 상속과 구현  (0) 2018.06.09
제네릭(Generic) 와일드카드 타입  (0) 2018.06.09
제네릭(Generic) 메소드  (0) 2018.06.08
제네릭(Generic)이란 ? 제네릭 타입이란?  (0) 2018.06.08
자바 기본 변수  (0) 2018.05.08

+ Recent posts