Java 길찾기/이것이 자바다 썸네일형 리스트형 [Java] 제한된 타입 파라미터(<T extends 최상위타입>) 타입 파라미터에 지정되는 구체적인 타입을 제한할 필요가 종종 있다. 예를 들어 숫자를 연산하는 제네릭 메소드는 매개값으로 Number 타입 또는 하위 클래스 타입(Btye, Short, Integer, Long, Double)의 인스턴스만 가져야 한다. 이것이 제한된 타입 파라미터(bounded type parameter)가 필요한 이유이다. 제한된 타입 파라미터를 선언하려면 타입 파라미터 뒤에 extends 키워드를 붙이고 상위 타입을 명시하면 된다. 상위 타입은 클래스뿐만 아니라 인터페이스도 가능하다. 인터페이스라고 하지만 implements를 사용하지는 않는다. public 리턴타입 메소드(매개ㅂ녀수, ...) { ... } 타입 파라미터에 지정되는 구체적인 타입은 상위 타입이거나 상위 타입의 하위.. 더보기 [Java] 제네릭 메소드(<T, R> R method(T t)) 제네릭 메소드는 매개 타입과 리턴 타입으로 타입 파라미터를 갖는 메소드를 말한다. 제네릭 메소드를 선언하는 방법은 리턴 타입 앞에 기호를 추가하고 타입 파라미터를 기술한 다음, 리턴 타입과 매개 타입으로 타입 파라미터를 사용하면 된다. public 리턴타입 메소드명(매개변수, ...) { ... } 다음 boxing() 제네릭 메소드는 기호 안에 타입 파라미터 T를 기술한 뒤, 매개 변수 타입으로 T를 사용했고, 리턴 타입으로 제네릭 타입 Box를 사용했다. public Box boxing(T t) { ... } 제네릭 메소드는 두 가지 방식으로 호출할 수 있다. 코드에서 타입 파라미터의 구체적인 타입을 명시적으로 지정해도 되고, 컴파일러가 매개값의 타입을 보고 구체적인 타입을 추정하도록 할 수도 있다... 더보기 [Java] 멀티 타입 파라미터(class<K,V,...>, interface<K,V,...>) 제네릭 타입은 두 개 이상의 멀티 타입 파라미터를 사용할 수 있는데, 이 경우 각 타입 파라미터를 콤마로 구분한다. 다음 예제는 Product 제네릭 타입을 정의하고 ProductExample 클래스에서 Product 객체와 Product 객체를 생성한다. 그리고 Getter와 Setter를 호출하는 방법을 보여준다. // Product.java -- 제네릭 클래스 public class Product { private T kind; private M model; public T getKind() { return this.kind; } public M getModel() { return this.model; } public void setKind(T kind) { this.kind = kind; } pu.. 더보기 [Java] 제네릭 타입(class<T>, interface<T>) 제네릭 타입은 타입을 파라미터로 가지는 클래스와 인터페이스를 말한다. 제네릭 타입은 클래스 또는 인터페이스 이름 뒤에 ""부호가 붙고, 사이에 타입 파라미터가 위치한다. 아래 코드에서 타입 파라미터의 이름은 T이다. public class 클래스명 { ... } public interface 인터페이스명 { ... } 타입 파라미터는 변수명과 동일한 규칙에 따라 작성할 수 있지만, 일반적으로 대문자 알파벳 한 글자로 표현한다. 제네릭 타입을 실제 코드에서 이용하려면 타입 파라미터에 구체적인 타입을 저장해야 한다. 그렇다면 왜 이런 타입 파라미터를 사용해야 할까? 그 이유를 알기 위해 다음 Box 클래스를 살펴보자. public class Box { private Object object; public v.. 더보기 [Java] 왜 제네릭을 사용해야 하는가? java 5부터 제네릭(Generic) 타입이 새로 추가되었는데, 제네릭 타입을 이용함으로써 잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거할 수 있게 되었다. 제네릭은 컬렉션, 람다식, 스트림, NIO에서 널리 사용되므로 확실히 이해해 두어야 한다. API 도큐먼트를 보면 제네릭 표현이 많기 때문에 제네릭을 이해하지 못하면 API 도큐먼트를 정확히 이해할 수 없다. 제네릭은 클래스와 인터페이스, 그리고 메소드를 정의할 때 타입을 파라미터로 사용할 수 있도록 한다. 타입 파아미터는 코드 작성 시 구체적인 타입으로 대체되어 다양한 코드를 생성하도록 해준다. 제네릭을 사용하는 코드는 비제네릭 코드에 비해 다음과 같은 이점을 가지고 있다. 컴파일 시 강한 타입 체크를 할 수 있다. 자바 컴파일러는 .. 더보기 [Java] 스레드풀 - 콜백 방식의 작업 완료 통보 이번에는 콜백(callback) 방식을 이용해서 작업 완료 통보를 받는 방법에 대해서 알아보자. 콜백이란 애플리케이션이 스레드에게 작업 처리를 요청한 후, 스레드가 작업을 완료하면 특정 메소드를 자동 실행하는 기법을 말한다. 이때 자동 실행되는 메소드를 콜백 메소드라고 한다. 다음은 블로킹 방식과 콜백 방식을 비교한 그림이다. 블로킹 방식은 작업 처리를 요청한 후 작업이 완료될 때까지 블로킹되지만, 콜백 방식은 작업 처리를 요청한 후 결과를 기다릴 필요 없이 다른 기능을 수행할 수 있다. 그 이유는 작업 처리가 완료되면 자동적으로 콜백 메소드가 실행되어 결과를 알 수 있기 때문이다. 아쉽게도 ExecutorService는 콜백을 위한 별도의 기능을 제공하지 않는다. 하지만 Runnable 구현 클래스를 .. 더보기 [Java] 스레드풀 - 블로킹 방식의 작업 완료 통보 블로킹 방식의 작업 완료 통보 ExecutorService의 submit() 메소드는 매개값으로 준 Runnable 또는 Callable 작업을 스레드풀의 작업 큐에 저장하고 즉시 Future 객체를 리턴한다. 리턴 타입 메소드명(매개 변수) 설명 Future submit(Runnable task) - Runnable 또는 Callable을 작업 큐에 저장 - 리턴된 Future를 통해 작업 처리 결과를 얻음 Future submit(Runnable task, V result) Future submit(Callable task) Future 객체는 작업 결과가 아니라 작업이 완료될 때까지 기다렸다가(지연했다가 = 블로킹 되었다가) 최종 결과를 얻는데 사용된다. 그래서 Future를 지연 완료(pendin.. 더보기 [Java] 스레드풀 - 생성, 종료, 작업생성, 처리요청 병렬 작업 처리가 많아지면 스레드 개수가 증가되고 그에 따른 스레드 생성과 스케줄링으로 인해 CPU가 바빠져 메모리 사용량이 늘어난다. 따라서 애플리케이션의 성능이 저하된다. 갑작스런 병렬 작업의 폭증으로 인한 스레드의 폭즉을 막으려면 스레드풀(ThreadPool)을 사용해야 한다. 스레드풀은 작업 처리에 사용되는 스레드를 제한된 개수만큼 정해놓고 작업 큐(Queue)에 들어오는 작업들을 하나씩 스레드가 맡아 처리한다. 작업 처리가 끝난 스레드는 다시 작업 큐에서 새로운 작업을 가져와 처리한다. 그렇기 때문에 작업 처리 요청이 폭증되어도 스레드의 전체 개수가 늘어나지 않으므로 애플리케이션의 성능이 급격히 저하되지 않는다. 자바는 스레드풀을 생성하고 사용할 수 있도록 java.util.concurrent .. 더보기 이전 1 2 3 4 5 6 ··· 12 다음