본문 바로가기
반응형

분류 전체보기714

Optional을 제대로 사용하는 26가지 방법 ( 2 ) Item 14 : Optional을 생성자 매개변수에서 사용하지 말 것 // 잘못된 방법 public class Customer { private final String name; // null일 수 없다 private final Optional postcode; // optional이므로 null일 수 있다 public Customer(String name, Optional postcode) { this.name = Objects.requireNonNull(name, () -> "Name cannot be null"); this.postcode = postcode; } public Optional getPostcode() { return postcode; } ... } // 옳은 방법 public cl.. 2021. 2. 18.
Optional을 제대로 사용하는 26가지 방법 ( 1 ) Item 1 : null을 Optional 변수에 할당하지 말 것 //잘못된 방법 public Optional fetchChart() { Optional emptyCart = null; ... } //옳은 방법 public Optional fetchCart() { Optional emptyCart = Optional.empty(); ... } Optional을 초기화하고 싶다면, null이 아니라 Optional.empty()를 사용해야 합니다. Optional은 단지 컨테이너나 박스일 뿐이고, null로 초기화시키는 것은 무의미합니다. Item 2 : Optional.get()을 호출하기 이전에 Optional이 값을 가지도록 만들 것 //잘못된 방법 Optional cart = ... ; // car.. 2021. 2. 18.
orElse() vs orElseGet() Optional에서 추가적인 행동을 위해서 사용하는 orElse()와 orElseGet()은 굉장히 비슷한 모양과 역할을 하고 있습니다. 하지만 모든 문서에서는 두개의 메서드에 대한 차이점을 강조하면서 유의하라고 설명합니다. 그래서 어떤 점이 다른지 좀 더 자세히 살펴보고자 합니다. 위 사진의 오라클 문서에 따르면, 값이 존재한다면 값을 그대로 리턴하고 그렇지 않다면 other을 리턴한다고 나와있습니다. 단지 orElseGet()은 Supplier를 매개변수로 가지기 때문에 other을 호출하고 그 결과값을 리턴합니다. 이렇게 보면 크게 차이점이 없는 것이 실제로 맞고 비슷한 기능을 하고 있습니다. 하지만 아래의 예를 통해 차이점을 확인하겠습니다. Optional 내에 null을 가진 경우 String .. 2021. 2. 18.
Optional의 배경지식 Optional의 의도된 쓰임새는 이펙티브 자바 3판 [ 아이템 55 ] 옵셔널 반환은 신중히 하라에서 잘 나와있는데, stackoverflow의 Should Java 8 getters return optional type? 글에서 해당 기술의 개발자가 답글한 내용 중에 핵심 부분을 가져왔습니다. (다수 의역) Our intention was to provide a limited mechanism for library method return types where there needed to be a clear way to represent "no result", and using null for such was overwhelmingly likely to cause errors. For example,.. 2021. 2. 18.
[ 아이템 55 ] 옵셔널 반환은 신중히 하라 반환값이 없을 때 과거의 방법 1. 예외를 던진다. -> 예외는 진짜 예외적인 상황에서만 사용해야 한다(아이템 69). 예외를 생성할 때 스택 추적 전체를 캡처하므로 비용도 만만치 않다. 2. 반환 타입이 객체 참조라면 null을 반환한다. -> null이 반환될 일이 절대 없다고 확신하지 않는 한) 별도의 null 처리 코드를 추가해야 한다. null 처리를 무시하고 반환된 null은 언젠가 NullPointerException이 발생할 수 있다. 새로운 대안 : Optional Optional는 null이 아닌 T 타입 참조를 하나 담거나, 혹은 아무것도 담지 않을 수 있다. 아무것도 담지 않은 옵셔널은 '비었다'고 말한다. 반대로 값을 가지고 있다면 '비지 않았다'라고 표현한다. 옵셔널은 원소를 최.. 2021. 2. 11.
[ 아이템 54 ] null이 아닌, 빈 컬렉션이나 배열을 반환하라 일반적으로 null을 반환하는 경우는 다음과 같다. null을 반환하는 예( 금지 ) 컬렉션이 비어있으면 null을 반환한다. - 따라하지 말 것! private final List cheeseInStock = ...; /** * @return 매장 안의 모든 치즈 목록을 반환한다. * 단, 재고가 하나도 없다면 null을 반환한다. */ public List getCheeses() { return cheeseInStock.isEmpty() ? null : new ArrayList(cheeseInStock); } 재고가 없다고 해서 특별한 취급을 할 이유는 없다. 그럼에도 이 코드처럼 null을 반환해야 한다면, 이 null 상황을 처리하는 코드를 추가로 작성하도록 한다. List cheese = sho.. 2021. 2. 11.
[ 아이템 53 ] 가변인수는 신중히 사용하라 가변인수란? 가변인수(varargs) 메서드는 명시한 타입의 인수를 0개 이상 받을 수 있따. 가변인수 메서드를 호출하면, 가장 먼저 인수의 개수와 기링가 같은 배열을 만들고 인수들을 이 배열에 저장하여 가변인수 메서드에 건네준다. 간단한 가변인수 활용 예 static int snum(int... args) { int sum = 0; for (int arg : args) sum += arg; return sum; } 인수가 1개 이상이어야 할 때도 있다. 예를 들어 최솟값을 찾는 메서드인데 인수를 0개만 받을 수 있도록 설계한 것은 좋지 않다. 인수 개수는 런타임에 배열의 길이로 알 수 있다. 잘못된 가변 인수의 사용법 인수가 1개 이상이어야 하는 가변인수 메서드 - 잘못 구현한 예! static int.. 2021. 2. 11.
[ 아이템 52 ] 다중 정의는 신중히 사용하라 이해는 했는데 양이 너무너무 많잖아.... 천천히 2021. 2. 11.
[ 아이템 51 ] 메서드 시그니처를 신중히 설계하라 메서드 이름을 신중히 짓자 항상 표준 명명 규칙을 따라야 한다. 이해할 수 있고, 같은 패키지에 속한 다른 이름들과 일관되게 짓는 게 최우선 목표다. 그다음 목표는 개발자 커뮤니티에서 널리 받아들여지는 이름을 사용하는 것이다. 긴 이름은 피하자. 애매하면 자바 라이브러리 API 가이드를 참고하자 편의 메서드를 너무 많이 만들지 말자 모든 메서드는 자신의 소임을 다해야 한다. 메서드가 너무 많은 클래스는 익히고, 사용하고, 문서화하고, 테스트하고, 유지보수하기 어렵다. 인터페이스도 마찬가지다. 메서드가 너무 많으면 이를 구현하는 사람과 사용하는 사람 모두를 고통스럽게 한다. 확신이 서지 않으면 만들지 말자 매개변수 목록은 짧게 유지하자 4개 이하가 좋다. 4개가 넘어가면 매개변수를 전부 기억하기가 쉽지 않.. 2021. 2. 11.
반응형