본문 바로가기

자바56

[Effective Java] 아이템55 옵셔널 반환은 신중히 하라 ■ 자바 8 이전 자바 8전에는 메서드가 특정 조건에서 값을 반환할 수 없을 때 두가지 선택지가 있었다. 1. Exception Throw 예외는 반드시 예외적인 상황에서만 사용해야 한다. 예외는 실행 스택을 추적 캡처하기 때문에 비용이 비싸다. 2. Null Return null을 리턴하는 경우에는 Null Pointer Exception을 항상 조심해야한다. ■ Optional 도입 자바 8에서 Optional가 도입되면서 선택지가 하나 늘었다. Optionl이란 null이 아닌 T타입 참조를 하나 담거나 아무것도 담지 않은 일종의 래퍼 클래스이다. Optional은 원소를 최대 1개 가질 수 있는 불변 Collection이다. 자바 8이전의 코드보다 null-safe한 로직을 처리할 수 있게 해준다.. 2021. 7. 12.
[Effective Java] 아이템53 가변인수는 신중히 사용하라 ■ 가변인수는 신중히 사용하라 가변인수 메서드는 명시한 타입의 인수를 0개 이상 받을 수 있다. 인수의 개수와 길이가 같은 배열을 만들고 인수들을 배열에 저장하여 가변인수 메서드에 건네준다. 아래 코드는 최솟값을 찾는 메서드인데 인수를 0개만 받을 수 있도록 설계하는건 좋지 않다. 왜냐하면 인수가 0개일 때 컴파일 타임이아닌 런타임 때 실패하기 때문이다. static int min(int... args) { if (args.length == 0) throw new IllegalArgumentException("인수가 1개 이상 필요합니다."); int min = args[0]; for (int i = 1; i < args.length; i++) if (args[i] < min) min = args[i];.. 2021. 7. 12.
[Effective Java] 아이템52 다중정의는 신중히 사용해라 ■ 다중정의와 호출 예제 다중정의(Overloading)는 어느 메서드가 호출될 지 컴파일 타임에 정해진다. 아래 코드를 실행해보면 직관과 어긋나느 결과를 볼 수 있다. import java.math.BigInteger; import java.util.*; 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) { Col.. 2021. 7. 4.
[Effective Java] 아이템51 메서드 시그니처를 신중히 설계하라 ■ 메서드 이름을 신중히 짓자 항상 표준 명명 규칙을 따라야하고, 같은 패키지에 속한 다른 이름들과 일관되게 짓는게 최우선 목표이다. 그 다음 목표는 개발자 커뮤니티에서 널리 받아들여지는 이름을 사용하는 것이다. ■ 편의 메서드를 너무 많이 만들지 말자 모든 메서드는 각각 자신의 소임을 다해야한다. 메서드가 너무 많은 클래스는 익히고, 사용하고, 문서화하고, 테스트하고 유지보수하기 어렵다. 메서드가 너무 많으면 이를 구현하는 사람과 사용하는 사람 모두를 고통스럽게한다. ■ 매개 변수 목록은 짧게 유지하자 4개 이하가 좋다. 특히 같은 타입의 매개변수가 연달아 여러개 나오는 경우가 특히 해롭다. 순서를 바꿔 입력해도 그대로 컴파일되고 실행된다. 첫번째로 여러 메서드로 쪼개서 매개변수를 줄이는 방법이있다. .. 2021. 7. 4.
[Effective Java] 아이템49 매개변수가 유효한지 검사하라 ■ 매개 변수가 유효한지 검사하라 메서드와 생성자 대부분은 입력 매개변수의 값이 특정 조건을 만족하기를 바란다. 이런 제약은 반드시 문서화해야 하며 메서드 몸체가 시작되기전에 검사해야 한다. 안그러면 실행되다가 예외가 발생할 수 있고, 더 나쁜 경우는 잘못된 값을 반환할 수 있다. public, protected 메서드는 매개변수 값이 잘못됐을 때 던지는 예외를 문서화 해야한다. /** * Returns a BigInteger whose value is {@code (this mod m}). This method * differs from {@code remainder} in that it always returns a * non-negative BigInteger. * * @param m the mod.. 2021. 7. 4.
[Effective Java] 아이템48 스트림 병렬화는 주의해서 적용하라 자바 8부터는 parallel 메서드만 한 번 호출해서 파이프라인을 병렬 실행할 수 있는 스트림을 지원한다. 다음은 메르센 소수를 생성하는 프로그램에서 속도를 높이기 위해서 스트림 파이프라인의 parallel()을 호출 해봤다고하자. import java.math.BigInteger; import java.util.stream.Stream; public class StreamPallelExample { public static void main(String[] args) { //20개의 메르센 소수 생성 primes().map(p -> (BigInteger.TWO).pow(p.intValueExact()).subtract(BigInteger.ONE)) .parallel() .filter(mersenne .. 2021. 6. 29.