섹션 7. 그밖에
애노테이션의 변화
애노테이션 관련 두가지 큰 변화
- 자바 8부터 애노테이션을 타입 선언부에도 사용할 수 있게 됨.
- 자바 8부터 애노테이션을 중복해서 사용할 수 있게 됨.
타입 선언 부
- 제네릭 타입
- 변수 타입
- 매개변수 타입
- 예외 타입
- …
타입에 사용할 수 있으려면
- TYPE_PARAMETER: 타입 변수에만 사용할 수 있다.
- TYPE_USE: 타입 변수를 포함해서 모든 타입 선언부에 사용할 수 있다.
Chicken.java
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 Chicken {
}
Practice1.java
import java.util.Arrays;
import java.util.List;
public class Practice1 {
public static void main(String[] args) throws @Chicken RuntimeException{
List<@Chicken String> names = Arrays.asList("MELT");
}
static class FeelsLikeChicken<@Chicken T> {
//Generic Type은 return type과 접근자 사이
public static <@Chicken C> void print(@Chicken C c) {
System.out.println(c);
}
}
}
중복 사용할 수 있는 애노테이션을 만들기
- 중복 사용할 애노테이션 만들기
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
@Repeatable(ChickenContainer.class)
public @interface Chicken {
}
- 중복 애노테이션 컨테이너 만들기
- 컨테이너 애노테이션은 중복 애노테이션과
@Retention
및@Target
이 같거나 더 넓어야 한다.
- 컨테이너 애노테이션은 중복 애노테이션과
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();
}
예제
import java.util.Arrays;
@Chicken("양념")
@Chicken("후라이드")
public class Practice1 {
public static void main(String[] args){
ChickenContainer chickenContainer = Practice1.class.getAnnotation(ChickenContainer.class);
Arrays.stream(chickenContainer.value()).forEach(c -> {
System.out.println(c.value());
});
}
}
/*
양념
후라이드
*/
배열 병렬 정렬
Arrays.parallelSort()
Fork/Join 프레임워크를 사용해서 배열을 병렬로 정렬하는 기능을 제공한다.
병렬 정렬 알고리듬
- 배열을 둘로 계속 쪼갠다.
- 합치면서 정렬한다.
sort()와 parallelSort() 비교
import java.util.Arrays;
import java.util.Random;
import java.util.stream.IntStream;
public class Practice2 {
public static void main(String[] args) {
int size = 1500;
int[] numbers = new int[size];
Random random = new Random();
IntStream.range(0, size).forEach(i -> numbers[i] = random.nextInt());
long start = System.nanoTime();
Arrays.sort(numbers);
System.out.println("serial sorting took " + (System.nanoTime() - start));
IntStream.range(0, size).forEach(i -> numbers[i] = random.nextInt());
start = System.nanoTime();
Arrays.parallelSort(numbers);
System.out.println("parallel sorting took " + (System.nanoTime() - start));
}
}
/*
serial sorting took 1261500
parallel sorting took 269600
*/
- 알고리듬 효율성은 같다. 시간 $O(n log N)$ 공간 $O(n)$
Metaspace
JVM의 여러 메모리 영역 중에 PermGen 메모리 영역이 없어지고 Metaspace 영역이 생겼다.
PermGen
- permanent generation, 클래스 메타데이터를 담는 곳.
- Heap 영역에 속함. JVM이 관리하므로 기본값으로 제한된 크기를 가지고 있음.
- -XX:PermSize=N, PermGen 초기 사이즈 설정
- -XX:MaxPermSize=N, PermGen 최대 사이즈 설정
Metaspace
- 클래스 메타데이터를 담는 곳.
- Heap 영역이 아니라 OS가 자동으로 크기를 조절하는 Native 메모리 영역에 위치한다.
- 기본값으로 제한된 크기를 가지고 있지 않다. (필요한 만큼 계속 늘어난다.)
- 자바 8부터는 PermGen 관련 java 옵션은 무시한다.
- -XX:MetaspaceSize=N, Metaspace 초기 사이즈 설정.
- -XX:MaxMetaspaceSize=N, Metaspace 최대 사이즈 설정.