개발서적읽기/Effective Java - temp
-
[이펙티브 자바] item 88 - readObject 메서드는 방어적으로 작성하라개발서적읽기/Effective Java - temp 2020. 10. 3. 00:05
■깨지기 쉬운 직렬화에서의 불변식 item 50에서는 불변인 날짜 범위 클래스를 만드는 데 가변 Date 필드를 이용했다. 그래서 불변식을 지키고 불변을 유지하기 위해 생성자와 접근자에서 Date 객체를 방어적으로 복사하느라 코드가 상당히 길어졌다. 아래가 바로 그 클래스다.public final class Period { private final Date start; private final Date end; public Period(Date start, Date end) { this.start = new Date(start.getTime()); this.end = new Date(end.getTime()); if (this.start.compareTo(this.end) > 0) throw new Il..
-
[이펙티브 자바] item 74 - 메서드가 던지는 모든 예외를 문서화하라개발서적읽기/Effective Java - temp 2020. 9. 18. 02:04
■검사 예외 문서화의 중요성 검사 예외는 항상 따로따로 선언하고, 각 예외가 발생하는 상황을 자바독의 @throws 태그를 사용하여 정확히 문서화하자. Exception, Throwable같은 공통 상위 예외로 퉁치지는 말자. 왜냐하면 메서드 사용자에게 각 예외에 대처할 수 있는 힌트를 주지 못한다. 또한 같은 맥락에서 발생할 여지가 있는 다른 예외들까지 포함시켜버릴 수 있어 API 사용성을 크게 떨어뜨린다. main 메서드는 이 규칙에 유일한 예외이다. main은 오직 JVM만이 호출하므로 Exception을 던지도록 선언해도 괜찮다. ■비검사 예외 문서화의 중요성 자바 언어가 요구하는 것은 아니지만 비검사 예외도 문서화해두면 좋다. 비검사 예외는 일반적으로 프로그래밍 오류를 뜻하는데 (item 79)..
-
[이펙티브 자바] item 66 - 네이티브 메서드는 신중히 사용하라개발서적읽기/Effective Java - temp 2020. 9. 11. 18:03
■자바 네이티브 인터페이스(Java Native Interface, JNI) 자바 네이티브 인터페이스(Java Native Interface, JNI)는 자바 프로그램이 네이티브 메서드를 호출하는 기술이다. 네이티브 메서드란 C나 C++ 같은 네이티브 프로그래밍 언어로 작성한 메서드를 말한다. 전통적으로 네이티브 메서드의 주요 쓰임은 다음 세 가지다. 1. 레지스트리 같은 플랫폼 특화 기능을 사용한다. 2. 네이티브 코드로 작성된 기존 라이브러리를 사용한다. (레거시 데이터를 사용하는 레거시 라이브러리가 그 예다) 3. 성능 개선을 목적으로 성능에 결정적인 영향을 주는 영역만 따로 네이티브 언어로 작성한다. ■진화하는 Java 플랫폼 특화 기능을 활용하려면 네이티브 메서드를 사용해야 한다. 하지만 자바가..
-
[이펙티브 자바] item 59 - 라이브러리를 익히고 사용하라개발서적읽기/Effective Java - temp 2020. 9. 3. 19:23
■표준 라이브러리의 장점 1 :: 수많은 프로그래머들의 경험이 녹아있다 다음은 무작위 정수 하나를 생성하는 코드이다.static Random rnd = new Random(); static int random(int n) { return Math.abs(rnd.nextInt()) % n; }이 코드는 세 가지 문제점을 가지고 있다. 1. n이 그리 크지 않은 2의 제곱수라면 얼마 지나지 않아 같은 수열이 반복된다. 2. n이 2의 제곱수가 아니라면 몇몇 숫자가 평균적으로 더 자주 반환된다. 3. 지정한 범위 바깥의 수가 종종 생성될 수 있다. 이렇게 직접 작성하는 것은 문제점을 가지고 있을 확률이 크다. 직접 작성하는 방법 대신 라이브러리를 사용하면 안전하게 원하는 기능을 구현할 수 있다. Random...
-
[이펙티브 자바] item 52 - 다중정의는 신중히 사용하라개발서적읽기/Effective Java - temp 2020. 8. 28. 21:54
■컴파일타임에 결정되는 다중정의 메서드 다음은 컬렉션을 집합, 리스트, 그 외로 구분하고자 만든 프로그램이다. public class CollectionClassifier { public static String classify(Set s) { return "집합"; } public static String classify(List lst) { return "리스트"; } public static String classify(Collection c) { return "그 외"; } public static void main(String[] args) { Collection[] collections = { new HashSet(), new ArrayList(), new HashMap().values() }..
-
[이펙티브 자바] item 45 - 스트림은 주의해서 사용하라개발서적읽기/Effective Java - temp 2020. 8. 21. 12:34
■스트림 API의 등장 스트림 API는 다량의 데이터 처리 작업(순차적 혹은 병렬적)을 효율적으로 처리하기 위해 자바 8에 추가되었다. 스트림 API의 핵심은 두가지다. 1. 스트림(stream)은 데이터 원소의 유한 혹은 무한 시퀀스를 뜻한다. 2. 스트림 파이프라인(stream pipeline)은 이 원소들로 수행하는 연산 단계를 표현하는 개념이다. 스트림의 원소들은 컬렉션, 배열, 파일, 정규표현식 패턴 매처, 난수 생성기, 다른 스트림 등 다양한 경로를 통해 존재할 수 있다. 스트림 안의 데이터 원소들은 객체 참조나 기본 타입 값이다. 기본 타입 값으로는 int, long, double 세가지를 지원한다.IntStream intStream = IntStream.range(1, 5); LongStr..
-
[이펙티브 자바] item 38 - 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라개발서적읽기/Effective Java - temp 2020. 8. 15. 03:10
■열거 타입 확장을 지양하자 열거 타입은 거의 모든 상황에서 타입 안전 열거 패턴보다 우수하다. 단, 예외가 있다. 타입 안전 열거 패턴은 확장할 수 있지만 열거 타입은 그럴 수 없다. 달리 말하면, 타입 안전 열거 패턴은 열거한 값들을 그대로 가져온 다음, 값을 더 추가하여 다른 목적으로 쓸 수 있지만 열거 타입은 그럴 수 없다. 실수로 이렇게 만들어진 것은 아니다! 사실 웬만하면 열거 타입을 확장을 지양해야 한다. 확장한 타입의 원소를 기반 타입의 원소로 취급한다면 그 반대도 성립해야 하는데, 열거 타입은 그렇지 않다. 따라서 기반 타입과 확장된 타입들의 원소 모두를 순회할 방법도 마땅치 않다. ■하지만 특별한 상황에선 열거 타입을 확장하자 그런데 확장할 수 있는 열거 타입이 어울리는 쓰임이 최소한 ..
-
[이펙티브 자바] item 32 - 제네릭과 가변인수를 함께 쓸 때는 신중하라개발서적읽기/Effective Java - temp 2020. 7. 27. 22:50
■가변인수란? 가변인수는 메서드에 넘기는 인수의 개수를 클라이언트가 조절할 수 있게 해주는 기법이다.static void test(List... param) { }가변인수 메서드는 제네릭과 함께 자바5에 추가되었다. 아쉽게도 이 둘은 서로 잘 어우러지지 않는다. ■가변인수의 허점 가변인수는 구현 방식에 허점이 있다. 가변인수 메서드를 호출하면 가변인수를 담기 위한 배열이 자동으로 하나 만들어진다. 그런데 내부로 감춰야 했을 이 배열이 클라이언트에 노출된다는 단점이 있다. 그 결과 varargs 매개변수에 제네릭이나 매개변수화 타입이 포함되면 알기 어려운 컴파일 경고가 발생한다.거의 모든 제네릭과 매개변수화 타입은 실체화되지 않는다. (item 28에서 실체화 불가 타입은 런타임에는 컴파일타임보다 타입 관..