검색결과 리스트
Java 정리에 해당되는 글 12건
- 2021.06.17 java 8 정리9
- 2021.06.02 java 8 정리8
- 2021.05.26 java 8 정리7
글
java 8 정리9
인프런 강의 11일차.
- 더 자바, Java 8 (백기선 강사님)
1. 애노테이션의 변화
- 애노테이션 관련 두가지 큰 변화
> 자바 8부터 애노테이션을 타입 선언부에도 사용할 수 있게 됨.
> 자바 8부터 애노테이션을 중복해서 사용할 수 있게 됨.
2. 타입 선언 부
- 제네릭 타입
- 변수 타입
- 매개변수 타입
- 예외 타입
- ...
3. 타입에 사용할 수 있으려면
- TYPE_PARAMETER : 타입 변수에만 사용할 수 있다.
- TYPE_USE : 타입 변수를 포함하여 모든 타입 선언부에 사용할 수 있다.
4. 중복 사용할 수 있는 애노테이션을 만들기
- 중복 사용할 애노테이션 만들기
- 중복 애노테이션 컨테이너 만들기
> 컨테이너 애노테이션은 중복 애노테이션과 @Retention 및 @Target 값이 같거나 더 넓어야 한다.
package me.whiteship.java8to11;
import java.util.Arrays;
import java.util.List;
@Chicken("양념")
@Chicken("마늘간장")
public class App {
public static <List> void main(String[] args) {
//Case 1. Type으로 가져오는 방법
//chiken type이 해당하는 것을 다 가져온다.
//즉, 양념, 마늘간장이 배열로 온다
Chicken[] chickens = App.class.getAnnotationsByType(Chicken.class);
Arrays.stream(chickens).forEach(c -> System.out.println(c.value()));
//Case 2. Container로 가져오는 방법
ChickenContainer chickenContainer = App.class.getAnnotation(ChickenContainer.class);
Arrays.stream((chickenContainer).value()).forEach(cc -> System.out.println(cc.value()));
// List<String> names = Arrays.asList("dhpark");
}
//특정 타입을 사용하는 제네릭 클래스 정의
//이 때 사용하는 T, R 등이 타입 파라미터를 의미한다.
//@Target 애노테이션은 해당 제네릭 타입에 사용할 수 있도록 선언하는 것
//static class FeelsLikeChicken<@Chicken T> //@Target(ElementType.TYPE_PARAMETER)가 선언되어있어야 사용 가능
/*
static class FeelsLikeChicken<@Chicken T> {
//TYPE_USE로 사용 시 타입을 사용하는 모든 곳에 사용 가능하다.
//public static <C> void print(@Chicken c)
public static <C> void print(C c) {
System.out.println(c);
}
}
*/
}
package me.whiteship.java8to11;
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
//TYPE_PARAMETER, TYPE_USE : java8에서 추가된 옵션
//@Target(ElementType.TYPE_PARAMETER) //해당 애노테이션을 사용할 곳
@Target(ElementType.TYPE_USE) //TYPE_PARAMETER를 포함한 TYPE을 쓰는 모든 곳에 사용 가능
@Repeatable(ChickenContainer.class) //Repeatable 파라미터로 들어가는 class보다 같거나 더 넓은 영역을 커버해야한다.(여러개의 애노테이션을 감싸고 있을 컨테이너 필요)
public @interface Chicken {
String value();
}
package me.whiteship.java8to11;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
public @interface ChickenContainer {
Chicken[] value(); //자기 자신이 감쌀 애노테이션의 변수를 가지고 있어야함.
}'Java 정리' 카테고리의 다른 글
| java 8 정리11 (0) | 2021.07.01 |
|---|---|
| java 8 정리10 (0) | 2021.06.30 |
| java 8 정리8 (0) | 2021.06.02 |
| java 8 정리7 (0) | 2021.05.26 |
| java 8 정리6 (0) | 2021.05.21 |
설정
트랙백
댓글
글
java 8 정리8
인프런 강의 10일차. (9일차에 이어서 같은 Callable 강의)
- 더 자바, Java 8 (백기선 강사님)
1. Date/Time 소개
- 자바 8에 새로운 날짜와 시간 API가 생긴 이유
- 그전까지 사용하던 java.util.Date 클래스는 mutable(상태를 바꿀 수 있다)하기 때문에 thread safe하지 않다.
- 클래스 이름이 명확하지 않다. (Date인데 시간까지 다룬다)
- 버그 발생할 여지가 많다. (타입 안정성이 없고, 월이 0부터 시작한다거나.. 등등)
- 날짜 시간 처리가 복잡한 애플리케이션에서는 보통 Joda Time을 쓰곤했다.
- setTime으로 시간 변경이 가능하기 때문에 mutable하다
2. 자바 8에서 제공하는 Date-Time API
- JSR-310 스팩의 구현체를 제공한다.
- 디자인 철학
> Clear
> Fluent
> Immutable
> Extensible
3. 주요 API
- 기계용 시간(machine time)과 인류용 시간(human time)으로 나눌 수 있다.
- 기계용 시간은 EPOCK (1970년 1월 1일 0시 0분 0초)부터 현재까지의 타임스탬프를 표현한다.
- 인류용 시간은 우리가 흔히 사용하는 연, 월, 일, 시, 분, 초 등을 표현한다.
- 타임스탬프는 Instant를 사용한다.
- 특정 날짜(LocalDate), 시간(LocalTime), 일시(LocalDateTime)을 사용할 수 있다.
- 기간을 표현할 때는 Duration(시간 기반)과 Period(날짜 기반)을 사용할 수 있다.
- DateTimeFormatter를 사용해서 일시를 특정한 문자열로 포매팅할 수 있다.
4. 현재 시간을 기계 시간으로 표현하는 방법
- instant.now() : 현재 UTC (GMT)를 리턴한다.
- Universal Time Coordinated == Greenwich Mean Time
Instant now = Instant.now();
System.out.println(now);
System.out.println(now.atZone(ZoneId.of("UTC")));
ZonedDateTime zonedDateTime = now.atZone(ZoneId.systemDefault());
System.out.println(zonedDateTime);
5. 인류용 일시를 표현하는 방법
- LocalDateTime.now() : 현재 시스템 Zone에 해당하는 로컬 일시를 리턴한다.
- LocalDateTime.of(int, Month, int, int, int, int) : 로컬의 특정 일시를 리턴한다.
- ZonedDateTime.of(int, Month, int, int, int, int, ZonedId) : 특정 Zone의 특정 일시를 리턴.
6. 기간을 표현하는 방법
- Period / Duratio . betwwen()
Period between = Period.between(today, birthDay); //Period : 휴먼시간을 비교
System.out.println(between.get(ChronoUnit.MONTHS)); //Duration : 기계시간을 비교
7. 파싱 또는 포맷팅
- 미리 정의해준 포맷 참고 : docs.oracle.com
- LocalDateTime.parse(String, DateTimeFormatter);
DateTimeFOrmatter fomatter = DateTimeFormatter.ofPattern("MM/d/yyyy");
LocalDate date = LocalDate.parse("07/15/1982", formatter);
System.out.println(date);
System.out.println(today.format(fomatter));
8. 레거시 API 지원
- GregorianCalendar와 Date 타입의 인스턴스를 Instant나 ZonedDateTime으로 변환 가능
- java.util.TimeZone에서 java.time.ZoneId로 상호 변환 가능
ZoneId newZoneAPI = TimeZone.getTimeZone("PST").toZoneId();
TimeZone legacyZoneAPI = Time.Zone.getTimeZone(newZoneAPI);
Instant newInstant = new Date().toInstant();
Date legacyInstant = Date.from(newInstant);
9. Date 연산
LocalDateTime now = LocalDateTime.now();
now.plus(10, ChronoUnit.DAYS); //날짜는 immutable 해야하기 때문에 return 받는 변수가 없으면 아무 일도 일어나지 않는다.
LocalDateTime plus10now = now.plus(10, ChronoUnit.DAYS); //오늘 + 10일을 한 날짜는 새로 변수에 할당
'Java 정리' 카테고리의 다른 글
| java 8 정리10 (0) | 2021.06.30 |
|---|---|
| java 8 정리9 (0) | 2021.06.17 |
| java 8 정리7 (0) | 2021.05.26 |
| java 8 정리6 (0) | 2021.05.21 |
| java 8 정리5 (0) | 2021.05.20 |
설정
트랙백
댓글
글
java 8 정리7
인프런 강의 9일차.
- 더 자바, Java 8 (백기선 강사님)
1. Callable
- Runnable과 유사하지만 작업의 결과를 받을 수 있다.
2. Future
- 비동기적인 작업의 현재 상태를 조회하거나 결과를 가져올 수 있다.
- 결과를 가져오기 get()
ExecutorService executorService = Executors.newSingleThreadExecutor();
Future<String> helloFuture = executorService.submit(() -> {
Thread.sleep(1000);
return "Callable";
});
System.out.println("Hello");
String result = helloFuture.get();
System.out.println(result);
executorService.shutdown();
- 블록킹 콜이다.
- 타임아웃(최대한 기다릴 시간)을 정할 수 있다.
3. 작업 상태 확인하기 isDone()
- 완료 했으면 true, 아니면 false를 리턴
4. 작업 취소하기 cancel()
- 취소 했으면 true, 못했으면 false를 리턴
- parameter로 true를 전달하면 현재 진행중인 쓰레드를 interrupt하고 그러지 않으면 현재 진행중인 작업이 끝날 때 까지 기다린다.
5. 여러 작업 동시에 실행하기 invokeAll()
- 동시에 실행한 작업 중에 제일 오래 걸리는 작업 만큼 시간이 걸린다.
6. 여러 작업 중에 하나라도 먼저 응답이 오면 끝내기 invokeAny()
- 동시에 실행한 작업 중에 제일 짧게 걸리는 작업 만큼 시간이 걸린다.
- 블록킹 콜이다.
package me.whiteship.java8to11;
import java.sql.SQLOutput;
import java.util.Arrays;
import java.util.concurrent.*;
public class App {
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService executorService = Executors.newSingleThreadExecutor();
Callable<String> hello = () -> {
Thread.sleep(2000L);
return "Hello";
};
Callable<String> java = () -> {
Thread.sleep(3000L);
return "Java";
};
Callable<String> dhpark = () -> {
Thread.sleep(1000L);
return "dhpark";
};
//3개의 Callable을 하나의 Collection으로 넘겨서 주면 Future의 List가 나오고, 그에 대해 3개의 Callable을 한번에 수행한다.
executorService.invokeAll(Arrays.asList(hello, java, dhpark));
Future<String> helloFuture = executorService.submit(hello);
System.out.println("Started!!!"); //get을 수행하기 전 까지는 코드가 쭉 실행이 된다,
helloFuture.cancel(false); //cancel을 하게 되면 isDone은 무조건 true가 된다!
//get을 만나는 순간 결과값을 가져올 때 까지 기다린다(=블록킹 콜)
//만약 cancel이 된 Future를 get하게 된다면 익셉션이 발생한다.
helloFuture.get();
String s = executorService.invokeAny(Arrays.asList(hello, java, dhpark));//any이므로 하나가 끝나면 바로 결과가 나온다
//가장 짧은 timeout인 dhpark이 호출된다.
//단 이 때 쓰레드의 타입 및 개수에 따라 다음과 같은 아웃풋이 나온다.
//SingleThread로 선언된 경우 첫 Callable이 끝날 때 가지 다음 Callable을 호출하지 못 하므로 첫번째 Callable인 Hello 호출
//fixedThread(2)로 선언 된 경우 dhpark은 들어갈 자리가 없으므로 앞의 2개의 Callable 중 먼저 끝나는 Hello가 출력
//fixedThread(4)로 선언 된 경우 가장 짧은 Callable인 dhpark이 출력
System.out.println(s);
System.out.println(helloFuture.isDone());
System.out.println("End!!!!");
executorService.shutdown();
}
}'Java 정리' 카테고리의 다른 글
| java 8 정리9 (0) | 2021.06.17 |
|---|---|
| java 8 정리8 (0) | 2021.06.02 |
| java 8 정리6 (0) | 2021.05.21 |
| java 8 정리5 (0) | 2021.05.20 |
| java 8 정리4 (0) | 2021.05.19 |