목록Java (10)
똑같은 삽질은 2번 하지 말자
NullPointException 개발을 하면서 이거때문에 이슈가 정말 많이 일어난다. 지금은 Vue + SpringBoot(Rest API)로 개발을 진행하고 있는데, 아무래도 javascript와 json으로 주고 받다보니 생각지도 못한 곳에 Null이 들어가곤 한다... 그럼 이걸 예방할 수 있는 방법이 있을까? 우선 객체를 비교할 때 String a = null String b = new String(); a.equals(b) // NullPointException 이렇게 equals를 쓰지 말고,(비교하는 주체 객체가 Null이면 equals method를 불러올 때 NullPointException 발생) String a = null; String b = new String(); Objects..
Annotation 이란? 근본적인 취급은 주석과 같은데 기능이 달려있는 주석이라고 생각하면 편할 것 같다. 자, 바로 기능 달린 주석을 만들어 보자. package annotation; public @interface MyAnnotation { } 간단하게 만들 수 있다. 그리고 바로 클래스에 달아보자. import annotation.MyAnnotation; @MyAnnotation public class OnlineClass { private Integer id; private String title; private boolean closed; public OnlineClass(Integer id, String title, boolean closed) { this.id = id; this.title..
Stream sequence of elements supporting sequential and parallel aggregate operations 데이터를 담고 있는 저장소 (컬렉션)이 아니다. Funtional in nature, 스트림이 처리하는 데이터 소스를 변경하지 않는다. 스트림으로 처리하는 데이터는 오직 한번만 처리한다. 무제한일 수도 있다. (Short Circuit 메소드를 사용해서 제한할 수 있다.) 중개 오퍼레이션은 근본적으로 lazy 하다.(종료 오퍼레이션 없으면 동작 안함) 손쉽게 병렬 처리할 수 있다.(parallelStream 덕분) 스트림 파이프라인 중개 오퍼레이션 (intermediate operation)과 한개의 종료 오퍼레이션 (terminal operation)으로..
한 인터페이스를 여러 클래스에서 구현을 하고 있다고 한다면, 인터페이스에 기능 추가를 위해 메소드를 선언하면 구현하고 있는 모든 클래스들도 구현을 해야한다. 그 말은 그 클래스들 중에 나는 이 기능이 필요없음에도 구현을 해야하는 불필요한 코드들이 추가해야 한다. 그럼 어떻게 해야 불필요한 코드들을 작성하지 않고 인터페이스에 기능추가를 할 수 있을까? 기본 메소드 (Default Methods) 인터페이스에 메소드 선언이 아니라 구현체를 제공하는 방법 해당 인터페이스를 구현한 클래스를 깨트리지 않고 새 기능을 추가할 수 있다. 기본 메소드는 구현체가 모르게 추가된 기능으로 그만큼 리스크가 있다. 컴파일 에러는 아니지만 구현체에 따라 런타임 에러가 발생할 수 있다. 반드시 문서화 할 것. (@implSpec..
@FunctionalInterface (함수형 인터페이스) 추상 메소드 한개만을 가지고 있는 인터페이스 SAM (Single Abstract Method) 인터페이스 @FuncationInterface 애노테이션을 가지고 있는 인터페이스 람다 표현식 (Lambda Expressions) 함수형 인터페이스의 인스턴스를 만드는 방법으로 쓰일 수 있다. 코드를 줄일 수 있다. 메소드 매개변수, 리턴 타입, 변수로 만들어 사용가능 @FunctionalInterface // 자바(standard)가 지원해주는 어노테이션 public interface RunSomething { /* 추상 메소드가 하나만 있으면 함수형 인터페이스 abstract는 생략 가능 (@FunctionalInterface가 있으면) */ a..
리플렉션 이란? 객체를 통해 클래스의 정보를 분석해 내는 프로그램 기법 자바의 리플렉션(Reflection)은 클래스, 인터페이스, 메소드들을 찾을 수 있고, 객체를 생성하거나 변수를 변경할 수 있고 메소드를 호출할 수도 있습니다. Reflection은 자바에서 기본적으로 제공하는 API입니다. 사용 방법만 알면 라이브러리를 추가할 필요 없이 사용할 수 있습니다. 리플렉션의 시작은 Class https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html Class에 접근하는 방법 모든 클래스를 로딩 한 다음 Class의 인스턴스가 생긴다. “타입.class”로 접근할 수 있다. 모든 인스턴스는 getClass() 메소드를 가지고 있다. “인스턴스.getC..
JIT (Just-In-Time) 컴파일러는 런타임시 Java 애플리케이션의 성능을 향상시키는 Java Runtime Environment의 구성 요소입니다. JVM의 어떤 것도 컴파일러보다 성능에 더 큰 영향을 미치지 않으며, 컴파일러를 선택하는 것은 Java 개발자이든 최종 사용자이든 Java 애플리케이션을 실행할 때 내린 첫 번째 결정 중 하나입니다. 자바 JIT 컴파일러 : 개요 자바 파워 "한 번 작성하면 어디에서나 실행"의 핵심은 bytecode. 바이트 코드가 애플리케이션에 대한 적절한 기본 명령어로 변환되는 방식은 애플리케이션의 속도에 큰 영향을 미칩니다. 이러한 바이트 코드는 해석되거나 원시 코드로 컴파일되거나 명령어 세트 아키텍처가 바이트 코드 사양 인 프로세서에서 직접 실행될 수 있습..
jacoco plugin추가 org.jacoco jacoco-maven-plugin 0.8.4 prepare-agent report prepare-package report Test작성 import org.junit.Assert; import org.junit.Test; import junit.framework.TestCase; /** * Unit test for simple App. */ public class AppTest extends TestCase { @Test public void testCase() { Product product = new Product(); product.num = 99; Assert.assertFalse(product.isMaxNumCheck()); } } 자신의 프로젝..
JVM(Java Virtual Machine) 자바 가상머신, 자바 바이트 코드(.class 파일)을 OS에 특화된 코드로 변환하는 역할 인터프리터와 JIT 컴파일러로 변환하고 실행한다. JVM 스펙 : docs.oracle.com/javase/specs/jvms/se11/html/ The Java® Virtual Machine Specification Tim Lindholm Frank Yellin Gilad Bracha Alex Buckley Daniel Smith docs.oracle.com JRE(Java Runtime Environment) JVM + 라이브러리 자바 애플리케이션을 실행할 수 있도록 구성된 배포판 JVM과 핵심 라이브러리 및 자바 런타임 환경에서 사용하는 프로퍼티 세팅이나 리소스 ..
가끔 문제를 풀 경우, Map을 정렬하는 경우가 많다! Key에 관한 정렬은 TreeMap을 사용한다면 별도의 구현없이 정렬이 가능하다. 단, String, Integer 와 같은 기본형에만 해당된다. 만약 객체를 특정 인스턴스 변수 기준으로 정렬하고 싶다면, Comparable 을 이용한 정렬이 필요하다. 해당 객체를 생성하는 클래스에서 Comparable 인터페이스를 implements 하거나, 혹은 아래와 같은 방식으로 익명객체, 람다식을 활용할 수 있다. 하지만, 이번 예제에서는 Map의 Value에 대한 정렬을 해볼려고 한다. 정렬하는 방법을 익명객체와 람다식을 활용해서 구현했다. public class ValueSortExample { public static void main(String[]..