?를 보통 와일드카드라고 부른다.


제너릭타입에서는 구체적인 타입을 명시하는 대신 와일드카드를 이용할 수 있다.


제너릭 타입<?> : Unbounded WildCards  

제너릭 타입<? extends 상위클래스> : Upper Bounded WildCards - 상위타입이나 하위타입만

제너릭 타입<? super 하위클래스> : Lower Bounded WildCards - 하위타입이나 상위타입만


수강생을 예를 들어서 살펴보면

수강생들은 다음과 같은 상속관계를 가지고 있다. 



코드를 통해 와이드카드 타입 매개변수를 살펴보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.util.Arrays;
 
public class WildCardExample {
    public static void registerCourse(Course<?> course) { 
                                    //모든 수강생이 들을수 있는 과정
        System.out.println(course.getName() + "수강생: " + Arrays.toString(course.getStudents()));
    }
 
    public static void registerCourseStudents(Course<extends Student> course) { 
                                                //학생들만 들을 수 있는 과정(Student, HighStudent)
        System.out.println(course.getName() + "수강생: " + Arrays.toString(course.getStudents()));
    }
    
    public static void registerCourseWorker(Course<super Worker> course) { 
                                            //직장인과 일반인 들을 수 있는 과정(Worker, Person)
        System.out.println(course.getName() + "수강생: " + Arrays.toString(course.getStudents()));
    }
}
cs


'Java' 카테고리의 다른 글

[람다식] 람다식 기본  (0) 2017.02.24
[제너릭]제너릭 타입의 상속  (0) 2017.02.17
[제너릭]제너릭 메소드  (0) 2017.02.16
[제너릭] 제너릭과 비제너릭 비교  (0) 2017.02.15
Thread 상속으로 thread 생성  (0) 2017.01.27

제너릭 메소드


제너릭 메소드란?


매개타입과 리턴타입으로 타입 파리미터를 갖는 메소드



제너릭 메소드 호출 방법


이 제너릭 메소드를 호출하는 방법은 구체적 타입을 명시적으로 지정하는 방법과

컴파일러과 매개값을 보고 구체적인 타입을 추정하게 하는 방법이 있다.


이 방법들을 실제 코드를 통해 살펴보자.



제너릭 메서드 구현


1
2
3
4
5
6
7
8
public class Util {
    public static <T> Box<T> boxing(T t) {  //제너릭 메소드는 <T> 매개변수 타입과
                                            //Box<T> 리턴타입으로 타입 파라미터를 갖는 메서드
        Box<T> box = new Box<T>();
        box.set(t);
        return box;
    }
}
cs



제너릭 메서드 호출


1
2
3
4
5
6
7
8
9
public class BoxingMethodExample {
    public static void main(String[] args) {
        Box<Integer> box1 = Util.<Integer>boxing(100); //구체적 타입을 명시하여 호출
        int intValue = box1.get();
        
        Box<String> box2 = Util.boxing("북스터디"); //컴파일러가 추정하게 하여 호출
        String name = box2.get();
    }
}
cs


제너릭 사용 시 장점


1. 컴파일시 강한 타입체크

2. 타입변환을 제거



장점을 제너릭을 사용하지 않을 때와 제너릭을 사용했을 때

코드가 어떻게 달라지는지 직접 보면서 살펴보자.



제너릭을 사용하지 않고 클래스 정의


1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
public class NoGenericBox {
    
    /*
     * 제너릭을 사용하지 않은 클래스
     * Object는 최상위 클래스로 어떤 타입이라도 담을 수 있다.
     * 하지만 다른 타입의 변수에 담을려면 타입변환이 필요하다.
     */
    
    private Object object;
    public void set(Object object) { this.object = object; }
    public Object get() { return object; }
}
 
cs



제너릭을 사용하지 않은 객체에 String을 넣고 빼보기


1
2
3
4
5
6
7
8
9
10
11
12
public class NoGenericExample {
    public static void main(String[] args) {
        NoGenericBox box = new NoGenericBox();
        
        box.set("배"); 
        //object에 '배'가 담김 --> Object타입
        
        String fruit = (String)box.get(); 
        //'배'를 String으로 형변환이 필요
    }
}
 
cs



제너릭을 사용한 클래스 정의


1
2
3
4
5
6
7
8
9
10
11
public class GenericBox<T> {
    
    /*
     * 제너릭을 이용한 클래스 정의
     * 제너릭타입 T를 클래스 생성시 파라미터로 전달하여 형변환이 필요없다.
     */
    
    private T t;
    public T get() { return t; }
    public void set(T t) { this.t = t; }
}
cs




제너릭을 사용한 객체에 String 넣고 빼기


1
2
3
4
5
6
7
8
9
10
11
12
public class GenericBoxExample {
    public static void main(String[] args) {
        GenericBox<String> box1 = new GenericBox<String>();
        //제너릭을 이용한 객체 생성
        box1.set("수박");
        String fruit = box1.get();//제너릭으로 타입을 제한했기데 형변환이 필요없다.
        
        GenericBox<Integer> box2 = new GenericBox<Integer>();
        box2.set(5);
        int count = box2.get();
    }
}
cs


'Java' 카테고리의 다른 글

[제너릭]와일드카드 타입  (0) 2017.02.17
[제너릭]제너릭 메소드  (0) 2017.02.16
Thread 상속으로 thread 생성  (0) 2017.01.27
Runnable을 이용한 Thread 생성 방법들  (0) 2017.01.25
멀티 스레드 개념  (0) 2017.01.25

Thread 클래스를 상속받아 thread 생성


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class CreateThread2 {
    /*
      Thread클래스를 상속받은 하위 클래스를 통한 thread 생성
     */
    
    public static void main(String[] args) {
        //직접 클래스를 정의해 Thread 생성
        Thread thread = new SubThread();
        thread.start();
        
        //익명 클래스로 Thread 생성
        Thread thread2 = new Thread() {
            public void run() {
                System.out.println("Anonymous thread");
            }
        };
        
        thread2.start();
    }
    public static class SubThread extends Thread {
        public void run() {
            //thread 실행시 실행될 부분
            System.out.println("Thread 하위클래스로 생성");
        }
    }
}
cs


'Java' 카테고리의 다른 글

[제너릭]와일드카드 타입  (0) 2017.02.17
[제너릭]제너릭 메소드  (0) 2017.02.16
[제너릭] 제너릭과 비제너릭 비교  (0) 2017.02.15
Runnable을 이용한 Thread 생성 방법들  (0) 2017.01.25
멀티 스레드 개념  (0) 2017.01.25
Thread를 생성하는 방법 중에서도 Thread 클래스로 부터 직접 생성하는 방법


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class CreateThread {
    
    /*
        Thread 클래스로부터 Thread 직접 생성
    */
 
    // 기본적으로 thread를 생성하기 위해서는 Runnable 타입의 인자가 필요
    
 
    //thread 생성 방법1. Runnble 구현 클래스를 통한 thread 생성 
    static class Task implements Runnable {
        public void run() {
            System.out.println("hello thread");
        }
    }
 
    public static void main(String[] args) {
        Task task = new Task();
        Thread thread1 = new Thread(task);
        thread1.start();
        
        //thread 생성방법2. 익명 구현 객체를 통한 thread 생성
        Thread thread2 = new Thread(new Runnable() {
            public void run() {
                System.out.println("thread2 created by Anonymous class");
            }
        });
        thread2.start();
        
        //thread 생성방법3. 람다식을 이용한 thread 생성
        Thread thread3 = new Thread( () -> {
            System.out.println("thread3 created by lambda");
        });
        thread3.start();
    }
}
cs


'Java' 카테고리의 다른 글

[제너릭]와일드카드 타입  (0) 2017.02.17
[제너릭]제너릭 메소드  (0) 2017.02.16
[제너릭] 제너릭과 비제너릭 비교  (0) 2017.02.15
Thread 상속으로 thread 생성  (0) 2017.01.27
멀티 스레드 개념  (0) 2017.01.25

Thread란?


사전적 의미인 실한가닥에서 유래하여 한 가지 작업을 실행하기 위해 순차적으로 실행할 코드를 실처럼

이어 놓았다고 해서 유래된 이름


하나의 스레드에서는 하나의 코드 실행흐름

프로세스 내에서 스레드가 두개면 코드 실행흐름도 두개


*process란? 실행 중인 하나의 애플리케이션



Multi Thread란?


멀티 프로세스는 애플리케이션 단위의 멀티 태스킹

멀티 스레드는 애플리케이션 내부이 멀티 태스킹


멀티 프로세스는 각자 할당받은 메모리를 가지고 실행하기 때문에 각각의 프로세스는 다른 프로세스에게

영향을 주지 않는다.


멀티 스레드는 하나의 프로세스 안에 있기 때문에 하나의 스레드가 예외를 발생시키면 프로세스 자체가 종료될 수도 있음

(이 때문에 멀티 스레드에서는 예외처리가 중요)



멀티 스레드 vs 싱글 스레드


멀티 스레드

 싱글 스레드

 멀티 스레드어플리케이션은 메인 스레드가 

종료되더라도 실행중인 메소드가 하나라도 있으면

프로세스 종료 안된다.

 싱글 스레드 애플리케이션은 메인스레드가 

종료 되면 프로세스 종료


'Java' 카테고리의 다른 글

[제너릭]와일드카드 타입  (0) 2017.02.17
[제너릭]제너릭 메소드  (0) 2017.02.16
[제너릭] 제너릭과 비제너릭 비교  (0) 2017.02.15
Thread 상속으로 thread 생성  (0) 2017.01.27
Runnable을 이용한 Thread 생성 방법들  (0) 2017.01.25

+ Recent posts