Java/이펙티브 자바

    이펙티브 자바, 쉽게 정리하기 - item 48. 스트림 병렬화는 주의해서 적용하라

    이펙티브 자바, 쉽게 정리하기 - item 48. 스트림 병렬화는 주의해서 적용하라 자바 언어와 동시성 동시성 프로그래밍에서는 항상 앞서가있었다. 1996년부터 스레드, 동기화, wait/notify를 지원 자바 5부터 java.util.concurrent, Executor 등을 선도적으로 지원했다. 자바 7부터 fork/join 패키지를 추가 자바 8부터 병렬 스트림을 지원 스트림에서는 parallel()을 통해 손쉽게 동시성을 제공했다. 동시성 주의점 안전성(safety) 과 응답 가능(liveness) 메르센 소수 구하기 예제로 parallel() 문제 살펴보기 메르센 소수란 2의 n승 빼기 1로 표현되는 소수를 말한다. @Test public void mersenne() { primes() .ma..

    이펙티브 자바, 쉽게 정리하기 - item 47. 반환 타입으로는 스트림보다 컬렉션이 낫다

    이펙티브 자바, 쉽게 정리하기 - item 47. 반환 타입으로는 스트림보다 컬렉션이 낫다 Java8 이후 원소 시퀀스를 반환하는 방법 기존에는 Collection, Iterable 이라는 선택지가 존재했다. Java8 이후로는 Stream 이라는 선택지가 하나 더 늘었다. Stream 은 반환 타입으로 사용하기보다는 단순히 컬렉션 처리를 위해 사용하는 것이 좋다. 반환은 다시 컬렉션으로 변경해주는 것이 활용성이 좋다. someStream.collect(Collectors.toList()) 와 같은 함수를 이용하면 쉽다. Stream 이 Iterable 을 확장하지 않는데서 생기는 문제 기존에 Stream 의 forEach() 는 Consumer 인터페이스를 사용하는 만큼 값을 생산하기보다 소비하는데에 ..

    이펙티브 자바, 쉽게 정리하기 - item 46. 스트림에서는 부작용 없는 함수를 사용하라

    이펙티브 자바, 쉽게 정리하기 - item 46. 스트림에서는 부작용 없는 함수를 사용하라 스트림의 핵심 스트림은 사용법을 아는 것만으로 충분하지 않다. 패러다임을 받아들여야 한다. 패러다임의 핵심은 계산을 일련의 변환으로 재구성하는 부분이다. 변환 과정에 사용되는 함수는 순수함수여야 한다. 스트림을 이용한 코드의 진화 과정 단어 개수 세기 1: 사용법만 아는 단계 @Test public void wordFreq1Test() { List words = new ArrayList(); words.add("stop"); words.add("spot"); words.add("trim"); words.add("meet"); words.add("ball"); words.add("free"); words.add("t..

    이펙티브 자바, 쉽게 정리하기 - item 44. 표준 함수형 인터페이스를 사용하라

    이펙티브 자바, 쉽게 정리하기 - item 44. 표준 함수형 인터페이스를 사용하라 람다를 활용할 때 표준 함수형 인터페이스를 사용하자 자바에서는 람다에 활용하라고 미리 만들어둔 표준 함수형 인터페이스들이 존재한다. removeEldestEntry()의 예 protected boolean removeEldestEntry(Map.Entry eldest) { return size() > 100; } LinkedHashMap 내부 메서드이다. 맵의 키 밸류 조합이 100개가 넘을 때, true를 반환한다. 잘 보면 약간 이상한점이 있는데, eldest라는 맵의 Entry를 파라미터로 받아놓곤, size()를 활용한다. 이 파라미터가 있는 이유는 이 메서드를 오버라이드할 때를 대비해서이다. 람다 인터페이스를 사..

    이펙티브 자바, 쉽게 정리하기 - item 45. 스트림은 주의해서 사용하라

    이펙티브 자바, 쉽게 정리하기 - item 45. 스트림은 주의해서 사용하라 스트림의 특징 아래에서 사용하는 평가(evaluation) 란 용어를 사용한다. 이 용어에 대한 설명은 Java Stream API 에서 평가 (evaluation) 란? 포스팅을 참조하면 된다. 배열과 같은 시퀀스형 데이터를 처리하는데 특화되어 있다. 소스 스트림(source stream) -> 중간 연산(intermediate operation) -> 종단 연산(terminal operation) 순으로 진행된다. 각 중간 연산(intermediate operation) 은 스트림을 어떠한 방식으로 변환(transform) 한다. 스트림 파이프라인은 지연평가되며, 평가는 종단 연산(terminal operation) 이 호출..

    이펙티브 자바, 쉽게 정리하기 - item 43. 람다보다는 메서드 참조를 사용하라

    이펙티브 자바, 쉽게 정리하기 - item 43. 람다보다는 메서드 참조를 사용하라 메서드 참조 사용 예 메서드 참조 사용 전 @Test public void mapMergeTest() { Map scoreMap = new HashMap(); String[] names = {"John", "Jake", "Jack", "Ted", "Paul"}; scoreMap.put("Jake", 10); for (String name : names) { scoreMap.merge(name, 5, (o, n) -> o + n); // (*) 여기 } for (String name : scoreMap.keySet()) { System.out.println("name = " + name); System.out.println..

    이펙티브 자바, 쉽게 정리하기 - item 42. 익명 클래스보다는 람다를 사용하라

    이펙티브 자바, 쉽게 정리하기 - item 42. 익명 클래스보다는 람다를 사용하라 메서드 파라미터로 함수 객체를 받는 경우: 람다 미사용 @Test public void sortTest1() { System.out.println("beforeSort: " + words.toString()); Collections.sort(words, new Comparator() { @Override public int compare(String o1, String o2) { return Integer.compare(o1.length(), o2.length()); } }); System.out.println("afterSort: " + words.toString()); } 기존에는 위와 같이 익명 클래스를 이용해 처리..

    이펙티브 자바, 쉽게 정리하기 - item 41. 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라

    이펙티브 자바, 쉽게 정리하기 - item 41. 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라 마커 인터페이스의 정의 자신을 구현하는 클래스가 특정 속성을 가짐을 표시해주는 인터페이스 ex) Serializable 은 자신을 구현한 클래스의 인스턴스는 ObjectOutputStream 을 통해 쓸 수 있다(직렬화할 수 있다)고 알려준다. 마커 애너테이션 vs 마커 인터페이스 마커 인터페이스의 장점 마커 인터페이스는 이를 구현한 클래스의 인스턴스들을 구분하는 타입으로 사용할 수 있다. 마커 애너테이션은 타입으로 사용할 수는 없다. 타입으로 사용할 수 있기 때문에 런타임에야 발견할만한 오류를 컴파일 타임에 발견할 수도 있다. 마커 인터페이스는 적용 대상을 더 정밀하게 지정할 수 있다. ex) 특정 ..

    이펙티브 자바, 쉽게 정리하기 - item 40. @Override 애너테이션을 일관되게 사용하라

    이펙티브 자바, 쉽게 정리하기 - item 40. @Override 애너테이션을 일관되게 사용하라 @Override가 없을 때 하기 쉬운 실수 public class Item40Test { static class Bigram { private final char first; private final char second; public Bigram(char first, char second) { this.first = first; this.second = second; } public boolean equals(Bigram b) { return b.first == first && b.second == second; } public int hashCode() { return 31 * first + secon..

    이펙티브 자바, 쉽게 정리하기 - item 39. 명명 패턴보다 애너테이션을 사용하라

    이펙티브 자바, 쉽게 정리하기 - item 39. 명명 패턴보다 애너테이션을 사용하라 명명패턴이란? 메서드의 이름 앞을 test...로 짓는 등 이름에 패턴을 주어 Reflection 등으로 해당 패턴 검출 시 특정 작업을 수행하는 식의 코딩 형식이다. 명명패턴의 단점 오탈자의 위험 메서드, 파라미터, 클래스명 등 영역에 대한 설정이 불가능하다. 프로그램 요소를 매개변수로 전달할 마땅한 방법이 없다. ex) 특정 예외가 던져져야 올바르게 실행되는 메서드가 있다면? 예제 실행 샘플 1: @MethodTest, 일반 메서드 애너테이션 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MethodTest { } @..

    이펙티브 자바, 쉽게 정리하기 - item 38. 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라

    이펙티브 자바, 쉽게 정리하기 - item 38. 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라 열거 타입의 확장 기본적으로 열거 타입의 확장이 지원되지는 않는다. 그러나 가끔 필요할 때, 인터페이스를 통해 확장하면 된다. public interface Operation { double apply(double x, double y); } public enum BasicOperation implements Operation { PLUS("+") { @Override public double apply(double x, double y) { return x+y; } }, MINUS("-") { @Override public double apply(double x, double y) { retur..

    이펙티브 자바, 쉽게 정리하기 - item 37. ordinal 인덱싱 대신 EnumMap을 사용하라

    이펙티브 자바, 쉽게 정리하기 - item 37. ordinal 인덱싱 대신 EnumMap을 사용하라 ordinal()을 배열 인덱스로 이용한 예제 static class Plant { enum LifeCycle { ANNUAL, PERENNIAL, BIENNIAL } final String name; final LifeCycle lifeCycle; Plant(String name, LifeCycle lifeCycle) { this.name = name; this.lifeCycle = lifeCycle; } @Override public String toString() { return "Plant{" + "name='" + name + '\'' + ", lifeCycle=" + lifeCycle + '}..

반응형