Java (11) 썸네일형 리스트형 아이템 83: 지연 초기화는 신중히 사용하라 지연 초기화 public class FileUtil { private File oldfile = new File("oldfile"); ... } 여기 FileUtil 클래스가 있다. 이 클래스의 oldfile 필드가 프로그램이 100번 실행될 때 한 번 사용될 까 말까하는 필드라면 어떨까? 100번 실행되는 동안 사용하지도 않을 oldfile을 계속 불러와서 초기화 할 것이고 이는 명백한 리소스 낭비이다. 지연 초기화는 위와 같은 문제에 대한 해답이 될 수 있다. 자주 사용되지 않는 필드를 프로그램이 시작할 때가 아니라 비로소 사용될 때 초기화 하는 것이다. public class OldFileUtil { private File oldfile = null; ... public File getOldFile.. 아이템 82: 스레드 안정성 수준을 문서화하라 스레드 안정성 문서화 클래스를 개발할 때, 해당 클래스를 사용할 클라이언트들을 위하여 필요한 정보들을 주석으로 작성하여 문서화 해야한다. 아무런 설명이 없다면 클라이언트는 추측과 가정을 통해 그 클래스를 사용하게 된다. 특히 스레드 안정성에 대한 정보는 설명이 필요한 중요한 정보 중 하나이다. 스레드 안정성이 잘못되면 프로그램에 심각한 오류가 발생할 것이다. 스레드 안정성 수준 불변(immutable): 이 클래스의 인스턴스는 마치 상수와 같아서 외부 동기화가 필요없다. 무조건적 스레드 안전(unconditionally thread-safe): 이 클래스의 인스턴스는 수정될 수 있으나, 내부에서 충실히 동기화하여 별도의 외부 동기화 없이 동시에 사용해도 안전하다. 조건부 스레드 안전(conditional.. 아이템 81: 동시성 유틸리티를 애용하라 wait와 notify public class Main { public synchronized void waitMehod() throws InterruptedException { System.out.println(Thread.currentThread().getId() + " wait"); wait(); System.out.println(Thread.currentThread().getId() + " notified"); } public synchronized void notifyMethod() throws InterruptedException { System.out.println(Thread.currentThread().getId() + " notify all"); notifyAll(); } public .. Java 에러 java.io.FileNotFoundException: class path resource [temp.txt] cannot be resolved to absolute file path because it does not reside in the file system: // resources 폴더에 있는 temp.txt 파일을 읽어온다. File file = new ClassPathResource("temp.txt").getFile(); ... java.io.FileNotFoundException: class path resource [temp.txt] cannot be resolved to absolute file path because it does not reside in the file system: ... resources 폴더에 있는 파일을 읽어들이는 코드가 local에서는 잘 동작하는데, 개발계에서 자꾸 위와 같은 에러가 발생하였다. 구글링을 해보니 원인을 다음과 같았다. 1. local에서 코드를 실행시킬 때는 temp.txt 파일이 소스폴더에 독립적인 .. JAVA 에러 java.lang.IllegalArgumentException: URI is not hierarchical // resources 폴더에 있는 temp.txt 파일을 읽어온다. File file = new File(new ClassPathResource("temp.txt").getURI()); java.lang.IllegalArgumentException: URI is not hierarchical ... resources 폴더에 있는 파일을 읽어들이는 코드가 local에서는 잘 동작하는데, 개발계에서 자꾸 위와 같은 에러가 발생하였다. 구글링을 해보니 원인을 다음과 같았다. 1. local에서 코드를 실행시킬 때는 temp.txt 파일이 소스폴더에 독립적인 하나의 파일로 존재하기 때문에 정상적으로 실행된다. 2. 개발계에는 jar파일이 실행되기 때문에 temp.txt가 독립된 파일이 아니라 jar파일의 데이.. Java 8 ~ 11 버젼별 특징 1. Java 1.8 2014년 3월 발표. 일반 지원은 2019년 1월에 종료되었고, 연장 지원은 2030년 12월에 종료될 예정이다. 1) Interface static And default method 본래 Interface는 함수의 구현체 즉 body를 가질 수 없었다. 하지만 Java 1.8 부터는 인터페이스에 body를 가지는 static method와 default method가 추가되었다. // JavaInterface.java public interface JavaInterface { static public String interfaceStaticMethod() { return "interfaceStaticMethod"; } } // main 영역 public static void ma.. mvn clean package 에러: Failed to load ApplicationContext 요즘 작업중인 토이프로젝트가 있다. 해당 프로젝트의 소스수정, 개발계 배포 과정은 아래와 같다. 개발자가 local에서 소스를 수정하고, github에 올린다. jenkins를 통해 아래 순서대로 개발계 빌드를 수행한다 github에서 소스를 내려받는다. mvn clean package를 통해 새로 빌드된 jar 파일을 생성한다. 새로 빌드된 jar 파일을 사용하는 ubuntu server 서비스를 실행한다. 평소에 잘 되던 프로세스 였는데, 새로운 코드를 반영하고 2-2 과정에서 에러가 발생하였다. java.lang.IllegalStateException: Failed to load ApplicationContext 알아보니 mvn clean package 이후, default 환경에서 jar 파일이 .. 자바 Failed to instantiate [java.util.List]: Specified class is an interface 에러 자바 스프링기반으로 웹서비스를 개발하던 중, 다음과 같은 에러가 발생했다. @PostMapping("/mypath") public ResultView myPostMethod(List myList) { return new ResultView(myService.doSomething(myList)); } org.springframework.beans.BeanInstantiationException: Failed to instantiate [java.util.List]: Specified class is an interface 위에 보이는 /mypath API를 호출하면, List가 인터페이스 이기 때문에 이를 초기화 할수 없다는 에러가 발생한다. 에러 문구만 보고 List를 ArrayList로 변경해주면, 에.. 이전 1 2 다음