티끌모아 로키산맥 🏔
search

로ᄏl
배움에 끝은 없다... 개발 또한 그러하다.
Today
Yesterday
개발서적 (54)
제네릭은 Set, Map 같은 컬렉션과 ThreadLocal, AtomoicReference 등의 단일 원소 컨테이너에도 흔히 쓰인다. 이런 모든 쓰임에서 매개변수화되는 대상은 컨테이너 자신이다. 따라서 하나의 컨테이너에서 매개변수화할 수 있는 타입의 수가 제한된다. 컨테이너의 일반적인 용도에 맞게 설계된 것이니 문제될 건 없다. 하지만 더 유연한 수단이 필요할 때도 종종 있다. 예를들어 데이터베이스의 행은 임의 개수의 열을 가질 수 있는데, 모두 열을 타입 안전하게 이용할 수 있다면 좋을 것이다. 다행히 컨테이너 대신 키를 매개변수화한 다음, 컨테이너에 값을 넣거나 뺄 때 매개변수화한 키를 함께 제공하면 쉽게 해결된다. 이렇게 하면 제네릭 타입 시스템이 값의 타입이 키와 같음을 보장해줄 것이다. 이러한..
개발에 처음 입문할 때 원래는 안드로이드 개발(혹은 iOS 개발)자를 꿈꿨었다. 하지만 접근성이 쉬운 웹 백엔드, 프론트엔드 공부를 하다가 백엔드에 흥미를 느끼고 백엔드 개발자로 진로를 본격적으로 틀게되었다. 이전에 GDC에서 주최한 플러터 관련 컨퍼런스에 참가하면서 크로스 플랫폼의 개념을 접하게 되었고, 리뷰어 활동을 하면서 플러터 책을 2번 더 읽을 기회가 있었다. 플러터와 쌍벽을 이루는 크로스 플랫폼 언어로 React Native가 있다는 것 또한 플러터 책들을 읽으면서 알게 된 내용이다. 리액트 기술에도 관심이 있어서 어짜피 크로스 플랫폼을 공부해 볼 생각이라면 React Native를 공부해보고 싶다고 생각했었는데, 이번 기회에 RN에 입문해볼 수 있게 되었다. 먼저 목차부터 살펴보자! 목차 리..
자바 API는 복잡한 애플리케이션을 만드는 데 필요한 여러 가지 유용한 컴포넌트를 제공한다. 하지만 자바 API도 완벽하지는 않다. 대부분의 자바 개발자가 지금까지의 날짜와 시간 관련 기능에 만족하지 못했다. 지금까지의 날짜와 시간 문제를 개선하는 새로운 날짜와 시간 API를 제공한다. 자바 1.0에서는 java.util.Date 클래스 하나로 날짜와 시간 관련 기능을 제공했다. 날짜를 의미하는 Date라는 클래스의 이름과는 달리 Date클래스는 특정 시점을 날짜가 아닌 밀리초(ms) 단위로 표현한다. 게다가 1900년을 기준으로 하는 오프셋과 달이 0에서 시작하는 모호한 설계로 유용성이 떨어졌다. 또한 Date 클래스의 toString으로는 반환되는 문자열을 추가로 활용하기가 어렵다. 자바 1.0의 D..
람다 표현식을 이용해 가독성과 유연성을 높이려면 기존 코드를 어떻게 리팩터링해야 하는지 설명한다. 또한 람다 표현식으로 전략, 템플릿 메서드, 옵저버, 의무 체인, 팩토리 등의 객체지향 디자인 패턴을 어떻게 간소화할 수 있는지도 살펴본다. 마지막으로 람다 표현식과 스트림 API를 사용하는 코드를 테스트하고 디버깅하는 방법을 설명한다. 가독성과 유연성을 개선하는 리팩터링 람다 표현식을 이용한 코드는 다양한 요구사항 변화에 대응할 수 있도록 동작을 파라미터화한다. 코드의 가독성을 높이려면 코드의 무선화를 잘하고, 표준 코딩 규칙을 준수하는 등의 노력을 기울여야 한다. 자바 8의 새 기능을 이용해 코드의 가독성을 높일 수 있다. 코드를 간결하고 이해하기 쉽게 만들 수 있다. 또한 메서드 참조와 스트림 API를..
가변인수(varargs) 메서드와 제네릭은 자바 5때 함께 추가되었지만 서로 잘 어울러지지 못한다. 가변인수는 메서드에 넘기는 인수의 개수를 클라이언트가 조절할 수 있게 해주는데, 이 구현방식에 허점이 있다. 가변인수 메서드를 호출하면 가변인수를 담기 위한 배열이 자동으로 하나 만들어진다. 그런데 이 방식은 내부로 감춰야 했을 이 배열이 클라이언트에 노출되는 것이다. 그 결과 가변인수 매개변수에 제네릭이나 매개변수화 타입이 포함되면 알기 어려운 컴파일 경고가 발생한다. 우리는 이전 아이템들을 학습하면서 실체화 불가 타입은 런타임에는 컴파일타임보다 타입 관련 정보를 적게 담고 있음을 배웠다. 그리고 거의 모든 제네릭과 매개변수화 타입은 실체화되지 않는다. 메서드를 선언할 때 실체화 불가 타입으로 가변인수 ..
아이템 28에서 이야기했듯 매개변수화 타입은 불공변(invariant)이다. 예를들어 List은 List가 하는 일을 제대로 수행하지 못하니 하위 타입이 될 수없다(리스코프 치환 원칙에 어긋난다). 하지만 때론 불공변 방식보다 유연한 무언가가 필요하다. 아이템29에서 언급된 Stack 클래스를 떠올려보자. 아래에 Stack의 public API를 나열했다. publci class Stack public Stack(); public void push(E e); public E pop(); public boolean isEmpty(); } 여기에 일련의 원소를 스택에 넣는 메서드를 추가해야 한다고 해보자. public void pushAll(Iterable src) { for (E e : src) push(..