[Java] 람다 캡쳐와 Synthetic 람다 클래스
·
JVM/Java
개요HeapDump 파일에서 Class$$Lambda$2831+2938213123+0x00 과 같은 식이 나왔다.요녀석의 정체는 무엇일까? synthetic lambda class아래와 같이 단일 메소드를 갖는 인터페이스는 Lambda 표현식으로 호출이 가능하다.public class LambdaTest { interface Callback { void onComplete(String result); } static class Messanger { void test(String msg, Callback callback) { callback.onComplete(msg); } } @DisplayName("single method interface can be called ..
[Java] OutOfMemory 잡기
·
JVM/Java
🎯 GoalsOutOfMemory 발생 원인 파악 하는 법을 안다. 예제 코드JVM option 에 다음 설정을 추가한다.Intellij IDEA > Rum Configuration > Modify > Add VM Options-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError-Xms20m힙 최소 크기 20MB-Xmx20m힙 최대 크기 20MB 제한-XX:HeapDumpOnOutOfMemoryOOM 발생시 HeapDump 파일을 생성public class HeapOOM { static class OOMObject {} public static void main(String[] args) { List list = new ArrayList(); while (..
[Java] Thread 상속 대신 Runnable 을 사용하라.
·
JVM/Java
결론Thread 상속 대신 Runnable 구현을 택하라. (1) 상속보다 구현이 더 유연하다.Java는 다중 상속을 허용하지 않기 때문에 이미 다른 클래스를 상속중인 클래스에 Thread 추가 상속은 불가능하다.반면에, 인터페이스는 얼마든 구현할 수 있다.// FIXME: 다중상속은 허용되지 않는다.class MyService extends Service, Thread {} (2) Runnable 은 실행할 작업만 정의할 수 있다.쓰레드를 사용하는 개발자의 주 관심사는 보통 만들고자 하는 쓰레드가 '무슨 일'을 할 것인지다.Runnable 인터페이스를 구현함으로써 '무슨 일'을 할지만 정의하면된다.즉, 필요한 만큼의 역할만 갖는다.  class PrintRunnable implements Runnabl..
[Java] Guava - MultiMap , BiMap
·
JVM/Java
개요Guava 라이브러리에서 가장 자주 쓰이는 MultiMap과 BiMap 에 대해 알아본다. MultiMapkey 하나에 여러 value 를 매핑하려고 할 때 쓰이는 인터페이스다.Java 에서 제공하는 기본 Map 의 Value 타입을 리스트로 직접 선언하여 다룰 수 있지만 단점이 있다.문법이 장황해진다.같은 key 에 값을 쓰면, 마지막 value 로 덮어써진다. class ListMap { @DisplayName("prolix list map") @Test void prolixListMapTest() { // given Map> map = new HashMap(); // 매번 값을 쓸 때마다 List 객체 생성을 명시해야 한다. map.put("..
[Java] Generic vs WildCard
·
JVM/Java
🎯 Goals WildCard 가 왜 필요한지 안다. 언제 Generic 을 쓸지 안다. 언제 wildcard 를 쓸지 안다. Java 의 다양한 컬렉션을 사용하거나 라이브러리를 만들다보면 제네릭을 자주 사용하게 된다. 이 때 `?` 로 표현되는 와일드카드도 심심치 않게 보게 되는데, 이 두녀석의 역할과 용례를 알아보자. WildCard 예제: 와일드 카드는 왜 나왔나? class ShapeTest { void drawAll(List shapeList) { for (Shape shape : shapeList) { shape.draw(); } } @DisplayName("Could not print all shapes with collection type hierarchy") @Test void drawA..
[객체지향] 잘못된 DRY 원칙 적용
·
JVM/Java
거짓 중복 발생 사례 상품의 정가를 나타내는 Regular Price 를 정의해봅시다. public class RegularPrice { private static final int MIN_AMOUNT = 0; private final int value; RegularPrice(final int amount) { if (amount < MIN_AMOUNT) throw new IllegalArgumentException("가격은 0원 이상이어야 합니다."); this.value = amount; } } 일반 할인, 여름 할인을 책임지는 클래스를 정의해봅시다. @Getter public class RegularDiscountedPrice { private static final int MIN_AMOUNT =..