본문 바로가기

전체 글

interrupt vs notify 공통점 : 둘다 wait 셋에 있는 쓰레드를 깨우는 역할을 한다. 차이점 notify : Object 클래스의 함수 interrupt : Thread 클래스의 함수 notify : wait 셋에 있는 쓰레드 중 하나를 랜덤하게 깨움 (waiting 상태의 쓰레드가 Runnable 상태로 바뀐다.) interrupt : 특정 쓰레드를 wait 셋에서 깨운다. 이 때, InterruptedException이 발생한다. (참고로, 오라클 문서에서는 interrupt를 쓰레드 취소 용도로만 사용할 것을 권장한다.) + 추가 notifyAll : wait 셋에 있는 쓰레드 모두를 깨운다. stackoverflow.com/questions/30471285/what-is-the-difference-between-wa.. 더보기
item 54) null이 아닌 빈 컬렉션이나 배열을 반환하라 비어있다고해서 특별히 취급할 이유는 없음. => 클라이언트는 이 null 상황을 처리하는 방어 코드를 추가로 작성해야 한다. ( 코드복잡도 + 널 익셉션 발생 가능성) => 객체가 0개일 가능성이 거의 없는 경우 몇 년후에 발견할수도있음 빈 컨테이너를 할당하는 비용이 있으니 Null보다 낫다? => 성능 저하의 주범이라고 확인되지 않는한 이정도 성능 차이는 신경 쓸 수준이 아님(빠른 프로그램보다 견고한 프로그램을 작성하라) => 빈 컬렉션, 배열은 굳이 새로 할당하지 않고도 반환할수 있음(빈 불변 객체 반환) => Collections.emptyList , Collections.emptySet, Collections.emptyMap 사용 public List getCheeses(){ return new .. 더보기
item 53) 가변인수는 신중히 사용하라 가변인수는 메서드의 인수 개수가 정해지지 않았을 때 아주 유용하게 사용 할수 있음 가변인수 메서드를 호출하면 가장 먼저 인수의 개수와 길이가 같은 배열을 만들고 인수들을 이 배열에 저장하여 가변인수 메서드에 건네줌 단점 : 인수가 1개이상이여야할 경우 인수가 0개만 받을 수 있게 설계하는 것은 좋지 않음 - 런타임 에러 발생 가능, 이를 체크하기 위한 로직으로 코드가 지저분해짐 - for- each 문 사용하기 힘들어짐 - 성능에 민감한 경우 문제 발생(호출마다 배열 생성) 해결책 : 매개변수를 2개 받도록 함 첫번째로 평범한 매개변수를 받고, 가변인수를 두번쨰로 받음 public class Varargs { static int min(int... args) { if (args.length == 0) t.. 더보기
by lazy vs lateinit 1. by lazy public actual fun lazy(initializer: () -> T): Lazy = SynchronizedLazyImpl(initializer) public actual fun lazy(mode: LazyThreadSafetyMode, initializer: () -> T): Lazy = when (mode) { LazyThreadSafetyMode.SYNCHRONIZED -> SynchronizedLazyImpl(initializer) LazyThreadSafetyMode.PUBLICATION -> SafePublicationLazyImpl(initializer) LazyThreadSafetyMode.NONE -> UnsafeLazyImpl(initializer) } pu.. 더보기
item 50) 적시에 방어적 복사본을 만들라 클라이언트가 악의적으로 불변식을 깨드리려 한다고 가정하고 방어적으로 프로그래밍 하라 - 악의를 가진 프로그래머 - 평범한 프로그래머의 실수로 인한 오작동 - 어떤 객체든 그 객체의 허락 없이 외부에서 내부를 수정하지 못하도록 하라. 기간을 나타내는 Period 객체를 만들어봤다. import java.util.Date; public final class Period { private final Date start; //Period의 멤버변수인 Date가 불변 객체가 아니므로 Period가 불변이 아니게 된다. private final Date end; public Period(Date start, Date end) { if (start.compareTo(end) > 0) throw new IllegalA.. 더보기
item 46) 스트림에서는 부작용 없는 함수를 사용하라 스트림 : 함수형 스타일 오퍼레이션을 지원하는 클래스 스트림의 특징 No storage : 저장을 위한 자료구조가 아니라 소스(자료구조, 배열, I/O 채널 등)로부터 자료를 받아서 계산을 위한 파이프라인 함수형 : 스트림의 연산(operation) 은 결과를 생산만 하지, 소스를 수정하지 않음 ex) 스트림을 필터링한다고 해서 기존 리스트의 원소를 제거 하지는 않음 Laziness-Seeking : 대부분의 스트림 연산(filter, map, 중복 제거 등) 은 lazy 하게 작동한다. (스트림 연산이 최종 연산이 호출되는 시점까지 지연됨) List strings = List.of(1,2,3,4,5); strings.stream() .map(x->{ System.out.println(x); return.. 더보기
JVM 언어 의 공변 1. 공변이란? 제네릭에서는 3가지 공변 성질을 제공한다. 공변(Variance) : A가 B의 하위 타입일 때, T 가 T의 하위 타입이면 T가 공변의 성질을 가지고 있다고 말한다. 반공변(Contravariance) : A가 B의 하위 타입일 떄, T가 T 의 하위 타입이면 T가 반공변의 성질을 가지고 있다고 말한다. 무공변(Invariance) A가 B의 하위 타입일 때, T와 T간의 아무 관계도 없다면 무공변이라고 말한다. 이러한 공변, 반공변, 무공변으로 메소드의 인자로 들어오는 파라미터의 타입에 제한을 걸수 있다. 공변의 경우 Java에서는 extends, Kotlin에서는 out이라는 키워드를 사용한다.(Producer패턴 : 해당 타입을 생산하는 패턴에 사용) 반공변의 경우 Java에서는 .. 더보기
코틀린 제네릭스 JVM 의 제네릭스는 보통 타입 소거를 사용해 구현한다. -> 타입 소거란 실행 시점(Run Time)에 타입 관련 정보가 소거되는 것을 의미한다. -> 이는 JAVA에서 처음부터 제네릭스를 지원하지 않았기 때문이다. (참고로 제네릭스는 2003년 발표된 JDK 1.5 버전부터 포함된 내용이다.) 하위호환성을 중요시 하는 자바인 만큼 JDK 1.5 전버전과의 호환성때문에 이렇게 만들것으로 추측된다. -> 런타임에 타입관련 정보가 없기 때문에 ClassCastException 등 타입으로 발생하는 비검사 예외가 발생할 여지가 있다. 코틀린에서는 실체화를 통해 타입 인자가 지워지지 않도록 하여 이러한 비검사 예외를 컴파일 시점에 체크할수 있도록 하는 장치가 있다. var intList = ArrayList .. 더보기