Runnable Runnable은 파라미터도 없고 리턴 값도 없는 함수형 인터페이스이다. -> run() Runnable을 구현하여 Thread의 생성자 파라미터로 사용한다. 동일 Runnable 인스턴스로 생성한 Thread들은 병렬적이지 않고 직렬적이다. >[main] t2: 0 [main] t2: 1 [main] t3: 0 [main] t3: 1 ...
Java GC Java는 JVM에서 GC가 자동으로 동작한다. GC를 실행하기 위해 JVM이 어플리케이션 실행을 멈추는 stop-the-world가 발생하고 GC를 실행하는 쓰레드를 제외한 나머지 쓰레드는 모두 작업을 멈춘다. GC 기법으로 세대 단위 쓰레기 수집 기법을 사용한다. 세대 단위 쓰레기 수집 기법이란, 새롭게 할당된 영역일수록 금방 해제될 확률...
Comparator의 comparing()을 사용하면 List의 원소들을 비교하여 정렬하는 것을 간단한 방식으로 구현할 수 있게 해준다. 우선 comparing()을 사용하지 않는 방법을 살펴보자. List를 정렬하는 방법들 예를 들어 appleList라는 List에 담긴 Apple을 무게순으로 정렬한다고 가정하자. 위와 같이 익명 클래스를 사용하여...
멀티 스레드 환경에서 여러 스레드가 동시에 데이터에 접근한다면 의도하지 않은 결과가 발생할 수 있다. 이러한 이유로 synchronized는 공유된 가변 데이터를 보호하기 위하여 사용된다. 보호하는 방법은 단순히 동기화처리하여 한 자원에 한 스레드만 동시에 접근할 수 있게 하는 것이다. synchronized를 사용하는 방법은 다음과 같다. 인스턴스 ...
default method Java 8은 인터페이스에 새로운 메소드를 추가할 수 있는 방법을 제시했다. 만약 Java 8 이전 버전에서 인터페이스에 새로운 메소드를 추가한다고 가정해보자. 자주 사용되는 Collection의 경우, Java 8 버전에는 Stream이 추가되었고 Collection의 stream()을 통하여 Collection -> St...
IntegerCache Java에서는 Integer 클래스에서 이너 클래스로 IntegerCache를 가지고 있다. IntegerCache의 주석을 살펴보면, -128 ~ 127 사이의 값을 캐싱한다고 적혀있다. IntegerCache를 살펴보기 전에, 위의 두 구문은 동일한 구문이다. 위의 1을 직접 할당해준 구문은 컴파일 시점에 자바 컴파일러가...
Java 8의 default GC는 Parallel GC로 Young Generation의 GC를 멀티 스레드로 수행하여 stop-the-world 시간을 단축 시켰다. Java 9+는 default GC로 G1(Garbage First) GC를 사용한다. 어떠한 방법으로 성능 개선이 이루어 졌는지, G1 GC를 탐구해보자 한다. G1 GC G1 G...
가짜 ArrayList? Arrays.asList()를 사용하면 간단한 리스트를 짧은 코드로 만들 수 있다. 그렇다면 두 코드의 결과는 같을까? Arrays를 뜯어 보자. Arrays.asList()는 varargs(가변인자)를 매개변수로 받아 새로운 ArrayList를 반환한다. 그렇다면 이 ArrayList는 우리가 알고있는 ArrayList일...
Java의 Generic API는 Java 5부터 사용 가능합니다. 제네릭 이전에는 컬렉션에서 객체를 꺼낼 때마다 형변환을 해야 했고, 따라서 런타임 시점에 ClassCastException이 발생할 수 있는 위험성이 존재했습니다. 우리는 Generic 덕분에 잘못
이전 시간에는 제네릭의 기본적인 unbounded type parameter, unbounded wildcard type, type erasure에 대해 알아보았습니다. 만약 제네릭에 unbounded type만 존재한다면, 다음과 같은 상황이 불편할 수 있습니다. > 나는 숫자에 관련된 클래스만 담을 수 있는 Box generic type을 만들고 싶...
이전 시간까지는 제네릭의 기본적인 사용에 대해 알아보았습니다. Generic 파트의 마지막으로, 이번 시간에는 조금 더 복잡한 제네릭의 사용 예시에 대해 살펴보겠습니다! Reculsive Type Bound reculsive type bound는 type para
다음과 같은 Box generic type이 존재할 때, String을 actual type parameter로 Box 배열을 생성하고자 합니다. 빨간 줄과 함께 IDE는 Generic array creation이라는 컴파일 에러를 알려줍니다. 왜 이러한 에러가 발생하는 것일까요? Generic array creation 에러 이유 우선, Java...
Lambda에서 final 혹은 effectively final이 아닌 외부 지역 변수는 사용할 수 없습니다. > effectively final은 Java 8부터 람다식을 사용할 때 변수의 사용 범위와 관련된 문제를 해결하기 위해 도입 초기화된 후에 변경되지 않은 변수를 의미 위와 같이 인텔리제이는 람다식에 final 혹은 effectively fin...