분류 전체보기

    자바의 synchronized 키워드 정복하기

    주로 해결하려는 문제: 동시성 문제에서의 경쟁 상태 멀티 스레드 프로그래밍에서의 경쟁 상태를 해결하기 위해서 필요하다. 경쟁 상태란 여러 스레드가 순서에 영향을 받는 작업을 병렬적으로 할 때, 의도치 않은 결과가 나오는 것을 말한다. 비동기 프로그래밍에서 각 동작의 시작과 끝이 보장되지 않으면 실행/출력 결과가 일정하지 않을 수 있고 의도와 다른 결과물을 보여줄 수 있으며 심각한 버그까지 초래할 수 있다. ex) object.method() 는 Thread1 완벽히 수행을 끝낸 이후에 Thread2 가 수행해야 한다. 행위에 대한 Atomic 함이 보장되어야 한다. 보통 자바 프로그래밍에서 멀티 스레드 프로그래밍 코드를 작성해 볼 일은 잘 없다고 생각하지만, 엔터프라이즈 서버 환경을 경험해볼 일은 매우 ..

    스프링부트 개발도구(spring-boot-devtools) 정리

    소개 스프링부트 개발을 더욱 쾌적하게 해주는 도구이다. 대표적인 기능으로는 다음과 같은 기능이 있다. 스프링 부트 Restart: 재시작 시간을 단축해준다. 자동 재시작: 클래스 패스에 있는 파일이 변경되었을 때, 자동으로 애플리케이션을 재시작한다. LiveReload: 리소스 변경사항을 브라우저에 즉각 반영해준다. 캐시 무효화: 디폴트 설정으로 동작하는 캐싱 기능들을 꺼준다. 공식 문서 Restart vs Reload 스프링부트는 재시작할 때 2개의 클래스 로더를 사용한다. base classloader 와 restart classloader 가 있다. 서드파티 라이브러리와 같은 변하지 않는 클래스는 base classloader 에 로드되고, 내가 현재 개발하는 클래스들은 restart classlo..

    자바에서 주석 다는 방법: Javadoc 이란 무엇일까? (Feat. 위키피디아)

    Javadoc 이란? 선 마이크로 시스템즈에서 개발한 문서 생성기이다. 자바 소스코드로 HTML 포맷의 API 문서를 생성한다. HTML 로 생성하는 이유는 하이퍼링크를 편하게 달기 위함이다. 컴파일 타임에는 모두 지워지니 성능 걱정은 할 필요 없다. 작성된 자바 코드를 잘 이해하고 유지보수 하기 위함이 목적이다. 역사 이전에는 소프트웨어에 대한 독립형 문서를 작성할 Technical writers 를 고용했는데, 문서와 소프트웨어의 싱크를 유지하는 것은 매우 어려운 일이었다. 그래서 문서 생성기인 Javadoc 이 쓰이게 되었다. 자바의 첫 릴리즈 이래로 Javadoc 은 계속 쓰였고, JDK의 새 릴리즈마다 업데이트 됐다. 다른 언어의 문서 시스템에서 @field 문법을 모방하였다. 기술적인 구조 J..

    이펙티브 자바, 쉽게 정리하기 - item 38. 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라

    이펙티브 자바, 쉽게 정리하기 - item 38. 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라 열거 타입의 확장 기본적으로 열거 타입의 확장이 지원되지는 않는다. 그러나 가끔 필요할 때, 인터페이스를 통해 확장하면 된다. public interface Operation { double apply(double x, double y); } public enum BasicOperation implements Operation { PLUS("+") { @Override public double apply(double x, double y) { return x+y; } }, MINUS("-") { @Override public double apply(double x, double y) { retur..

    이펙티브 자바, 쉽게 정리하기 - item 37. ordinal 인덱싱 대신 EnumMap을 사용하라

    이펙티브 자바, 쉽게 정리하기 - item 37. ordinal 인덱싱 대신 EnumMap을 사용하라 ordinal()을 배열 인덱스로 이용한 예제 static class Plant { enum LifeCycle { ANNUAL, PERENNIAL, BIENNIAL } final String name; final LifeCycle lifeCycle; Plant(String name, LifeCycle lifeCycle) { this.name = name; this.lifeCycle = lifeCycle; } @Override public String toString() { return "Plant{" + "name='" + name + '\'' + ", lifeCycle=" + lifeCycle + '}..

    이펙티브 자바, 쉽게 정리하기 - item 36. 비트 필드 대신 EnumSet을 사용하라

    이펙티브 자바, 쉽게 정리하기 - item 36. 비트 필드 대신 EnumSet을 사용하라 비트 필드 열거 상수 훑어보기 public static final int STYLE_BOLD = 1

    이펙티브 자바, 쉽게 정리하기 - item 35. ordinal 메서드 대신 인스턴스 필드를 사용하라

    이펙티브 자바, 쉽게 정리하기 - item 35. ordinal 메서드 대신 인스턴스 필드를 사용하라 잘못 사용한 예 enum Ensemble { SOLO, DUET, TRIO, QUARTET, QUINTET, SEXTET, SEPTET, OCTET, NONET, DECTET; public int numberOfMusicians() { return ordinal() + 1; } } @Test public void ensembleTest() { Ensemble solo = Ensemble.SOLO; System.out.println("solo = " + solo); System.out.println("solo.numberOfMusicians() = " + solo.numberOfMusicians()); }..

    이펙티브 자바, 쉽게 정리하기 - item 34. int 상수 대신 열거 타입을 사용하라

    이펙티브 자바, 쉽게 정리하기 - item 34. int 상수 대신 열거 타입을 사용하라 int 상수 패턴 (int enum pattern) public static final int APPLE_FUJI = 0; public static final int APPLE_PIPPIN = 1; public static final int APPLE_GRANNY_SMITH = 2; public static final int ORANGE_NAVEL = 0; public static final int ORANGE_TEMPLE = 1; public static final int ORANGE_BLOOD = 2; 경우의 수가 한정될 때 각 경우를 상수 값으로 치환하여 표현하는 것이다. int 상수 패턴의 단점 타입 안전을 ..

    이펙티브 자바, 쉽게 정리하기 - item 33. 타입 안전 이종 컨테이너를 고려하라

    이펙티브 자바, 쉽게 정리하기 - item 33. 타입 안전 이종 컨테이너를 고려하라 타입 안전 이종 컨테이너란? static class Favorites { private final Map, Object>에서는 와일드카드가 중첩되어 맵이 아니라 key가 와일드 타입임을 인지해야 한다. 그래서 모든 키가 서로 다른 매개변수화 타입일 수 있다는 의미가 된다. 흔히 제네릭 타입을 쓰는 클래스들은 매개변수화 대상을 컨테이너 자신으로 하는 반면, 타입 안전 이종 컨테이너는 매개변수화 대상을 키로 사용하는 Class에 둔다. 클라이언트 코드 작성해보기 @Test public void favoriteTest() { Favorites f = new Favorites(); f.putFavorite(String.clas..

    이펙티브 자바, 쉽게 정리하기 - item 32. 제네릭과 가변인수를 함께 쓸 때는 신중하라

    이펙티브 자바, 쉽게 정리하기 - item 32. 제네릭과 가변인수를 함께 쓸 때는 신중하라 가변인수 메서드의 허점 가변인수 메서드를 호출하면 가변인수를 담기 위한 배열이 자동으로 하나 만들어진다. 이 배열은 내부로 감춰져야 하는데, 클라이언트에 공개되면서 문제가 발생할 수 있다. 특히 varargs 변수에 제네릭이나 매개변수화 타입이 포함되면 알기 어려운 컴파일 경고가 발생한다. 실체화 불가 타입(제네릭)을 가변인수로 이용했을 때 @Test public void unableToReifyTest() { Assertions.assertThrows(ClassCastException.class, () -> { reifyExampleMethod(List.of("안","녕","하")); }); } public s..

    이펙티브 자바, 쉽게 정리하기 - item 31. 한정적 와일드카드를 사용해 API 유연성을 높이라

    이펙티브 자바, 쉽게 정리하기 - item 31. 한정적 와일드카드를 사용해 API 유연성을 높이라 와일드 카드 타입을 사용해야 하는 이유 제네릭은 불공변이다. 하위 혹은 상위 타입을 기본적으로는 포용하지 않게 되어있다. 필요하다면, extends 혹은 super를 이용하면 된다. static class StackWithGeneric { private E[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public StackWithGeneric() { elements = (E[]) new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(E e) {..

    이펙티브 자바, 쉽게 정리하기 - item 30. 이왕이면 제네릭 메서드로 만들라

    이펙티브 자바, 쉽게 정리하기 - item 30. 이왕이면 제네릭 메서드로 만들라 제네릭 메서드 작성법 public static Set union(Set s1, Set s2) { Set result = new HashSet(s1); result.addAll(s2); return result; } 순서대로 타입 매개변수 목록, 반환 타입, 파라미터 타입 3가지를 메서드 시그니처에 입력할 수 있다. 활용 예시 @Test public void unionTest() { Set guys = Set.of("톰", "딕", "헤리"); Set stooges = Set.of("래리", "모에", "컬리"); Set aflCio = union(guys, stooges); System.out.println("aflCio ..

반응형