Java15 [아이템 6] 불필요한 객체 생성을 피하라 똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 나을 때가 있다. 무거운 객체라면 매번 생성할 때마다 많은 자원이 들어갈 것이고, 인스턴스를 자주 생성하게 되면 GC가 동작하게 될 확률이 높아진다.(GC는 애플리케이션 성능을 저하시키는 요인 중 하나) String s = new String("hi"); String s = "hi"; String s = new String("hi"); 정확하진 않지만 "hi"라는 문자열은 리터럴 스트링 풀에 저장이 될 것이고, new String()을 호출할 때마다 heap 영역에 String 인스턴스가 저장이 된다. String s = "hi"; String pool에 "hi" 문자열이 저장이 되고, "hi"를 생성할 시 String pool에 있는.. 2021. 12. 21. [아이템 5] 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 SpellChecker라는 맞춤법을 검사하는 클래스가 있다. 이 클래스는 Lexicon이란 사전 클래스를 의존한다. 코드는 아래와 같다. class SpellChecker { private static final Lexicon dictionary = new KoreanDictionary(); public static boolean isValid(String word) { return true; } public static List suggestions(String typo) { return new ArrayList(); } } class KoreanDictionary implements Lexicon { } interface Lexicon { } 코드에선 KoreanDictionary를 직접 생성해서 사.. 2021. 12. 20. Junit과 mockito 조합으로 단위 테스트 해보기 테스트의 종류에는 통합 테스트와 단위 테스트가 있다. 이 글에는 단위 테스트를 이야기해보겠다. 단위 테스트의 특징은 다른 의존하는 객체가 있다면 의존성을 끊는게 중요한데 이를 고립이라고 표현한다. 예를 들어 Service의 비지니스 로직을 테스트하는데 클라이언트나 DB의 문제로 테스트가 진행되지 않는다면 고립이 되어있지 않은 것이다. 그런데 의존하는 객체를 어떻게 고립시킬 수 있을까? 바로 Mock 객체를 사용한다. Mock이란 아무 기능이 없는 가짜 객체를 의미한다. 하지만 의존하는 모든 객체에 대해 Mock을 만드는 건 쉬운 일이 아니다만 다행히 Mockito라는 Mock 객체를 쉽게 만들어주는 프레임워크가 있다. 자바 환경에서 junit과 mokito를 이용해서 테스트 코드를 작성한다. 간단한 예를.. 2021. 11. 21. 자바의 Optional 알아보기 자바는 참조변수에 기본적으로 null을 허용한다. 상황에 따라 null을 사용할 수 있다는 것이 편리는 하지만 참조 변수를 안전하게 사용하기 위해선 null 체크가 필수다. null 체크를 하지 않으면 runtime중에 NullPointException이 언제 던져질지 모른다. public void savePerson(Person person) { if(person == null) thorw new RuntimeException(); repository.save(person); } 보통 위와 같이 null 체크를 하게 되는데 코드를 지저분하게 만든다. 그래서 대체로 나온 것이 Optional이다. Optional은 Wrapper 클래스의 일종으로 값이 null일 수 있음을 알려준다. Optional 생성.. 2021. 11. 9. ThreadLocal 이란 ThreadLocal은 쓰레드별로 사용할 수 있는 변수 저장 공간이라고 생각하면 된다. 간단한 예시를 보자. @Slf4j public class NonThreadLocalTest { static String data; public static void main(String[] args) throws InterruptedException { data = "main data"; Thread thread1 = new Thread(() -> { data = "thread1 data"; log.info(" data={}", data); }); thread1.setName("thread1"); Thread thread2 = new Thread(() -> { data = "thread2 data"; log.info(.. 2021. 11. 1. [아이템 4] 인스턴스화를 막으려거든 private 생성자를 사용하라 정적 필드나 정적 메서드만 가지고 클래스를 구성한다면 인스턴스를 생성할 필요가 없는 클래스가 된다. 이런 경우 private 생성자를 통해 인스턴스화를 막으면 된다. class UtilityClass { private UtilityClass() { throw new AssertionError("인스턴스 생성 방지"); } } 2021. 9. 30. 이전 1 2 3 다음 728x90