Junbread Dev Blog

개발&새발💻

이펙티브 자바 10장 정리

아이템 69: 예외는 진짜 예외 상황에만 사용하라 예외는 오직 예외 상황에서만 쓰여야 하며, 일상적인 제어 흐름용으로 사용되어서는 안 된다. 예외 코드를 사용하면 JVM에서 최적화할 수 있는 여지가 적어진다. try { int i = 0; while(true) range[i++].climb(); } catch (ArrayIndexOutOfBoundsException e) {} // don't for (Mountain m : range) m.climb(); // do 잘 설계된 API라면 클라이언트가 정상적인 제어 흐름에서 예외를 사용할 일이 없어야 한다. 특정 상태에서만 호출할 수 있는 상태 의존적 메서드를 제공한다면, 상태 검사 메서드도 함께 제공해야 한다....

August 16, 2021 · 3 min

이펙티브 자바 11장 정리

아이템 78: 공유 중인 가변 데이터는 동기화해 사용하라 여러 스레드가 하나의 가변 데이터를 사용할 때에 입출력 시 동기화에 신경쓰지 않는다면 잘못된 동작을 유발할 수 있다. // 코드 78-1 잘못된 코드 - 이 프로그램은 얼마나 오래 실행될까? (415쪽) public class StopThread { private static boolean stopRequested; public static void main(String[] args) throws InterruptedException { Thread backgroundThread = new Thread(() -> { int i = 0; while (!stopRequested) i++; }); backgroundThread.start(); TimeUnit.SECONDS.sleep(1); stopRequested = true; } } 여러 스레드가 공유하는 가변 데이터를 동기화하지 않을 경우 다른 스레드에서 변경한 값을 언제 보게 될 지 알 수 없다....

August 16, 2021 · 6 min

이펙티브 자바 12장 정리

아이템 85: 자바 직렬화의 대안을 찾으라 자바 직렬화에는 공격의 소지가 매우 많고, 점점 더 많아지고 있기 때문에 가급적 사용하지 말아야 한다. 자바 직렬화를 사용하는 방법 아무것도 역직렬화하지 않는다. 레거시 등으로 어쩔 수 없이 사용하더라도, 신뢰할 수 없는 데이터는 절대 역직렬화하지 않는다. 아이템 86: Serializable을 구현할지는 신중히 결정하라 Serializable 구현의 단점들 Serializable을 구현하면 릴리즈한 뒤에는 수정하기 어렵다. → 직렬화 형태 또한 공개 API가 되기 때문 버그와 보안 구멍이 생길 가능성이 높아진다....

August 16, 2021 · 4 min

이펙티브 자바 8장 정리

아이템 49: 매개변수가 유효한지 검사하라 메서드나 생성자를 작성할 때에는 매개변수에 어떤 제약이 있을지 생각해야 한다. 제약사항을 문서화하고 메서드 시작 부분에 명시적으로 검사하자. 유효성 검사를 제대로 하지 않는 경우에는 중간에 모호한 오류가 발생하거나, 잘못된 결과를 반환하거나, 실패 원자성이 깨지는 결과를 낳을 수 있다. public과 protected 메서드는 매개변수 값이 잘못됐을 때 던지는 예외를 문서화해야 한다. /** * (현재 값 mod m) 값을 반환한다. 이 메서드는 * 항상 음이 아닌 BigInteger를 반환한다는 점에서 remainder 메서드와 다르다....

August 16, 2021 · 5 min

이펙티브 자바 9장 정리

아이템 57: 지역변수의 범위를 최소화하라 자바는 문장을 선언할 수 있는 곳이면 어디든 변수를 선언할 수 있기 때문에 가장 처음 쓰일 때 선언하는 것이 좋으며, 스코프가 오염되는 것을 방지할 수 있다. 지역변수 초기화 시점 거의 모든 지역변수는 선언과 동시에 초기화해야 한다. 예외적으로 try-catch를 사용할 때는 try 블록 안에서 초기화해야 한다. 반복문은 while 문보다는 for 문을 사용하자 → while 문을 사용할 때는 반복문 블록 밖에 불필요한 변수가 존재하기 때문에 잠재적인 오류 가능성이 있다....

August 16, 2021 · 4 min

이펙티브 자바 7장 정리

아이템 42: 익명 클래스보다는 람다를 사용하라 예전에는 함수 타입을 표현할 때 추상 메서드가 하나만 있는 인터페이스를 익명 클래스로 구현하는 방식을 사용했다. Collections.sort(words, new Comparator<String>() { public int compare(String s1, String s2) { return Integer.compare(s1.length(), s2.length()); } }); 람다가 도입되면서 간결한 방식으로 함수 객체를 표현할 수 있게 되었다. Collections.sort(words, (s1, s2) -> Integer.compare(s1.length(), s2.length())); // 코드 42-4 함수 객체(람다)를 인스턴스 필드에 저장해 상수별 동작을 구현한 열거 타입 (256-257쪽) public enum Operation { PLUS ("+", (x, y) -> x + y), MINUS ("-", (x, y) -> x - y), TIMES ("*", (x, y) -> x * y), DIVIDE("/", (x, y) -> x / y); private final String symbol; private final DoubleBinaryOperator op; Operation(String symbol, DoubleBinaryOperator op) { this....

May 22, 2021 · 5 min

이펙티브 자바 6장 정리

아이템 34: int 상수 대신 열거 타입을 사용하라 Java 1.5 Enum 등장 전 사용되던 int enum 패턴 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; 타입 안전을 보장할 방법이 없다. 표현 방식이 까다롭다. toString(), 디버거 등에서는 그냥 아무 의미 없는 상수로 보인다....

April 15, 2021 · 11 min

이펙티브 자바 5장 정리

제네릭은 취급할 수 있는 타입을 컴파일러에게 알려줌으로써, 컴파일 타임에 올바른 타입을 사용했는지 검사할 수 있게 해 더 안전하고 명확한 프로그램을 만들 수 있게 한다. 아이템 26: 로 타입은 사용하지 말라 로 타입이란 제네릭에서 타입 매개변수를 전혀 사용하지 않은 경우를 말한다. → 컴파일 타임 오류 검사를 사용할 수 없기 때문에 제네릭의 안전성과 표현력을 전혀 활용할 수 없다. public class Raw { public static void main(String[] args) { List<String> strings = new ArrayList<>(); unsafeAdd(strings, Integer....

April 12, 2021 · 9 min

이펙티브 자바 4장 정리

아이템 15: 클래스와 멤버의 접근 권한을 최소화하라 정보 은닉은 시스템을 구성하는 컴포넌트를 서로 독립시켜 준다. 정보 은닉의 장점 시스템 개발 속도를 높인다. 여러 컴포넌트를 병렬로 개발할 수 있다. 시스템 관리 비용을 낮춘다. 각 컴포넌트를 더 빨리 파악하고, 교체하는 데 부담이 줄어든다. 성능 최적화에 도움을 준다. 각 컴포넌트가 독립되어 있기 때문에 특정 컴포넌트만 최적화가 가능하다. 소프트웨어 재사용성을 높인다. 외부 의존 없이 동작하는 컴포넌트는 다른 환경에서도 사용이 쉽다. 대형 시스템 제작 난이도를 낮춘다....

April 5, 2021 · 10 min

이펙티브 자바 3장 정리

아이템 10: equals는 일반 규약을 지켜 재정의하라 equals는 언제 재정의해야 할까? 클래스가 다음과 같은 상황에 있다면 재정의하지 않는 것이 좋다. 각 인스턴스가 본질적으로 고유하다 인스턴스의 논리적 동치성을 검사할 일이 없다 상위 클래스에서 재정의한 equals가 하위 클래스에도 들어맞는다 클래스가 private이거나 package-private이고 equals 메서드를 호출할 일이 없다 equals가 만족시켜야 하는 조건 equals는 다음 다섯 가지 조건을 만족해야 한다. 반사성: A.equals(A)가 참이다 대칭성: A.equals(B)가 참이라면 B.equals(A)이다 public class Point { @Override boolean equals(Object o) { if (!...

March 23, 2021 · 4 min