본문 바로가기

JAVA

(11)
자바8 - 8. 리팩토링, 테스팅, 디버깅 리팩토링, 테스팅, 디버깅 1. 가독성과 유연성을 개선하는 리팩토링 간결성, 유연성 1.1 코드 가독성 개선 가독성이 좋다 : 어떤 코드를 다른 사람도 쉽게 이해할 수 있다. 자바8에서 제공하는 코드 가독성에 도움을 주는 기능 * 코드의 장황함을 줄여서 쉽게 이해할 수 있는 코드를 구현할 수 있다. * 메서드 레퍼런스와 스트림 API를 이용해서 코드의 의도를 쉽게 표현할 수 있다. 1.2 익명 클래스를 람다 표현식으로 리팩토링하기 ex) 익명 클래스 사용하는 이전 코드 aidl Runnable r1 = new Runnable() { public void run() { System.out.println("Hello"); } }; ex) 람다 사용 aidl Runnable r2 = () -> System.o..
자바8 - 7. Stream - 4 병렬 데이터 처리와 성능 포크/조인 프레임워크 스트림을 이용하면 순차 스트림을 병렬 스트림으로 자연스럽게 바꿀 수 있음. 1. 병렬 스트림 컬렉션에 parallelStream을 호출하면 병렬 스트림이 생성 ex) 모든 숫자 합계 메서드 aidl public static long sequentialSum(long n) { return Stream.iterate(1L, i -> i + 1) .limit(n) .reduce(0L, Long::sum); } ex) 전통 자바 예시 aidl public static long iterativeSum(long n) { long result = 0; for( long i = 1L; i i +1) .limit(n) .parallel() .reduce(0L, Long::s..
자바8 - 6. Stream - 3 스트림으로 데이터 수집 ex) 통화별로 트랜잭션을 그룹화한 코드(명령형 버전) ```aidl Map transactionByCurrencies = new HashMap(); for (Transaction transaction : transactions) { Currency currency = transaction.getCurrency(); List transactionsForCurrency = transactionsByCurrencies.get(currency); if(transactionsForCurrency == null) { transactionsForCurrency = new ArrayList(); transactionByCurrencies.put(currency, transactionsForCu..
자바8 - 5. Stream - 2 스트림 활용 필터링 프레디케이트 필터링 > 프레디케이트를 인수로 받아 일치하는 모든 요소를 포함하는 스트림 반환. ex) 프레디케이트 필터링 예시 aidl List vegetarianMenu = menu.stream() .filter(Dish::isVegetarian) .collect(toList()); 고유요소 필터링 > 고유 요소로 이뤄진 스트림을 반환하는 distinct 메서드 지원. ex) distinct 필터링 예시 aidl // 중복 없이 짝수만 추출. List numbers = Arrays.asList(1,2,1,3,3,2,4); numbers.stream() .filter(i -> i % 2 == 0) .distinct() .forEach(System.out::println); 스트림 축소..
자바8 - 4. Stream - 1 Stream 멀티 스레드 코드를 구현하지 않아도 데이터를 투명하게 병렬로 처리할 수 있음. ex) 저 칼로리 요리 반환 후 칼로리 기준으로 요리 정렬 (기존 코드) ``` // 400칼로리보다 작은 요리 선택 List lowCaloricDishes = new ArrayList(); for(Dish d: menu) { if(d.getCalories() < 400) { lowCaloricDishes.add(d); } } // 익명 클래스로 요리 정렬 (칼로리 순) Collections.sort(lowCaloricDishes, new Comparator() { public int compare(Dish d1, Dish d2) { return Integer.compare(d1.getCalories(), d2.g..
자바8 - 3. 람다 Lambda 메서드로 전달할 수 있는 익명 함수를 단순화한 것. 특징 1. 익명 : 이름 없는 메서드 2. 함수 : 메서드처럼 특정 클래스에 종속되지 않음. 하지만 메서드처럼 파라미터 리스트, 바디, 반환 형식, 가능한 예외 리스트를 포함. 3. 전달 : 람다 표현식을 인수로 전달하거나 변수로 저장 4. 간결성 : 익명 클래스처럼 많은 자질구레한 코드를 구현할 필요X ex) 기존 코드 Comparator byWeight = new Comparator() { public int compare(Apple a1, Apple a2) { return a1.getWeight().compareTo(a2.getWeight()); } }; ex) 개선한 람다 코드 Comparator byWeight = (Apple a1..
자바8 - 2. 동적 파라미터화 @markdown ## Behavior Parameterization > 자주 바뀌는 요구사항에 효과적 대응 아직은 어떻게 실행할 것인지 결정하지 않은 코드 블록을 의미. ex) 어떤 기준으로 사과를 분류하는 메서드 (기존 방식) ```public static List filterApples (List inventory, String color, int weight, boolean flag) { List result = new ArrayList(); for(Apple apple : inventory) { if((flag && apple.getColor().equals(color)) || (!flag && apple.getWeight() > weight)) { result.add(apple); } } re..
HashMap vs HashTable vs ConcurrentHashMap 기본적으로 모두 형태의 자료구조이며, Key값의 중복을 허용하지 않고, Value의 중복을 허용한다. 1. HashMapJava 1.2부터 생겼으며 기존 HashTable의 Synchronized를 풀어 쓴 맵이다.동기화가 되어있지 않아 보통 단일 쓰레드에 사용되며, Java 1.8부터는 알고리즘을 개선하여 속도가 더 빨라졌다. 2. HashTableJava 1.0 ~ Java 1.1에 사용됐다.Synchronized가 되어있다. 3. SynchronizedMapMap을 Wrapping하여 HashTable처럼 동기화 시키는 방법이다.HashTable에 비해 속도가 빠르며, 보통 멀티 쓰레드 환경에서 사용한다. 4. ConcurrentHashMapJava 1.5 Concurrent 패키지가 생기면서 만들..