2019년 7월 6일 토요일

[책]실무에서 바로 통하는 자바

실무에서 바로 하는 자바
책 정보
  • 출판사 : 한빛미디어
  • 출판년도 : 2017-07-01
  • 관련사이트 :
저자 정보
  • 원저 : 다케다 하루키 , 와타나베 유지 , 사토 다이치 , 다다 다케아키 , 가미카와 노부히코
  • 역자 : 김성훈

1.10 람다식 (Lambda, 흀)

Java8에서 새롭게 추가 된 기능. 간단하게 요약 하면 메소드를 간단히 기술하는 기법
구문 Lambda 식

(자료형 인수, ...) -> { ... 임의의 처리 ...}
구현할 인터페이스 코드

package project.lambda;
public interface InterfaceExample{
   
public abstract void exampleMethod(String name);
}
기본 람다 예제

package project.lambda;
/**
* 람다식 예제 입니다.
*/

public class LambdaExample{
 
   
public static void main(String...args){
     
// 처리를 람다식으로 구현 함.
       InterfaceExample lambda = (String name) -> {
           System.out.println(
"이것이 바로 람다("+name+")입니다");
       };
     
       
// 람다식을 실행 합니다.
       lambda.exampleMethod(
"Lambda ^^");
   }
}
이전에는 익명(anonymouse) 클래스로 처리 함

package project.lambda;

/**
* 람다식 이전에 람다식 처리를 대신 했던 익명클래스(anonymouse) 방식
* 의 예제 입니다.
*/

public class AnonymouseExample{
   
public static void main(String... args){
       
// 익명클래스를 이용해서 구현 함
       InterfaceExample anonymouse =
new InterfaceExample(){
           
public void exampleMethod(String name){
               System.out.println(
"이것이 바로 익명클래스("+name+") 입니다");
           }
       };
     
       
// 익명클래스 변수 실행
       anonymouse.exampleMethod(
"anonymouse");
   }
}
반환 값의 Lambda 예제들

package project.lambda;

/**
* 람다식 반환식 예제 입니다.
*/

public class LambdaReturnValueExample{
 
   
public static void main(String...args){
     
// 처리를 람다식으로 구현 함.
       InterfaceReturnValue lambda = (String name) -> {
           
return "("+name+")";
       };
     
       
// 람다식을 실행 합니다.
       System.out.println(
"이것이 바로 람다식"+
                          lambda.exampleMethod(
"Lambda ^^")+" 입니다");
     
       
// 파라미터 타입을 생략하기
       lambda = (name) -> {
return "<"+name+">";};
       System.out.println(
"이것이 바로 형생략 람다식"+
                          lambda.exampleMethod(
"Lambda ^^")+" 입니다");
     
       
// 파라미터가 한 개인 경우 괄호 생략하기
       lambda = name -> {
return "{"+name+"}";};
       System.out.println(
"이것이 바로 괄호생략 람다식"+
                          lambda.exampleMethod(
"Lambda ^^")+" 입니다");
     
       
// return 문만 있는 경우의 생략
       lambda = name ->
"["+name+"]";
       System.out.println(
"이것이 바로 return문 생략 람다식"+
                          lambda.exampleMethod(
"Lambda ^^")+" 입니다");
     
   }
}
/**
* 반환값을 갖는 인터페이스 임.
*/

interface InterfaceReturnValue{
   
public String exampleMethod(String name);
}

2.2.3 Date-Time API 기초 지식

java8에서 새롭게 추가 API 중. 시차 및 지역별 규칙을 다루기 편하도록 추가됨.
관련 패키지명은 java.time 패키지
주요 클래스에 대한 비교 설명

종류
연월일
시간
일시
시차정보
지역규칙
Local
LocalDate
LocalTime
LocalDateTime
X
X
Zoned
-
-
ZonedDateTime
O
O
Offset
-
OffsetTime
OffsetDateTime
O
X
시차를 다루 방식에 따라 클래스를 구분하는 방식
  • 시차를 다루지 않는 경우 Local 로 시작하는 클래스
  • 시차를 다루면 Offset으로 시작하는 클래스
  • 시차 과 지역규칙을 고려해야 한다면 ZonedDateTime 클래스
추가적인 변화
  • 이전과 다르게  Thread Safe가 됨.
  • mili second가 아니라 nano second 까지 다룰 수 있음.
기본 사용법

package project.time;

import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.Month;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;

/**
* Java8에서 새롭게 추가된 java.time 패키지 클래스
* 기본 예제
* 참고 : 실무에서 바로 통하는 자바
* 출력은 ISO-8601 형식으로 출력됨.
*/


public class LocalDateTimeExample{
   
public static void main(String...args){
       
//시차를 고려하지 않는 날짜와 시간 생성
       LocalDateTime localDateTime = LocalDateTime.now();
       System.out.println(
"LocalDateTime 바로 출력 : "+localDateTime);
     
       
//시차를 고려한 않은 날짜와 시간 생성 - 2019.07.04 12:15:30
       OffsetDateTime offsetDateTime = OffsetDateTime.of(
           
2019,       //2019
           Month.JULY.getValue(),
//7월 혹은 1 ~ 12
           
4,          //day of month , 날짜
           
12,         //24시간 (0 - 23)
           
17,         //분 (0 - 59)
           
31,         //초 (0 - 59)
           
90,         //nano 초
           
//ZoneOffset.of("+09:00")  // 우리나라 표준시와 차이 GMT +9:00
           ZoneOffset.ofHours(
9)
           );
       System.out.println(
"OffsetDateTime 바로 출력 : "+offsetDateTime);
     
       
//시차와 지역규칙을 반영한 날짜와 시간 생성
       ZonedDateTime zonedDateTime =              
            ZonedDateTime.parse("2019-07-04T13:38+09:00[Asia/Seoul]");
       System.out.println(
"ZonedDateTime 바로 출력 : "+zonedDateTime);
   }
}
기간 구하기(날짜, 시간 간격)
  • Period : 날짜 간격
  • Duration : 시간 간격
  • 예제 코드

package project.time;

import java.time.Duration;
import java.time.LocalDateTime;
import java.time.Period;

/**
* 기간 구하는 예제 (Duration , Period 클래스)
*/

public class DurationPeriodExample{
   
public static void main(String... args){
       LocalDateTime localDateTime1 =
           LocalDateTime.of(
2019, 6, 10, 10, 10, 10, 000000000);
       LocalDateTime localDateTime2 =
           LocalDateTime.of(
2020, 7, 11, 11, 11, 11, 100000001);
         
       Period period =
           Period.between(localDateTime1.toLocalDate(),
                          localDateTime2.toLocalDate());
     
       System.out.println(
"-------- period 특정항목의 차이 --------");
       System.out.println(
"년차 : "+period.getYears());
       System.out.println(
"월차 : "+period.getMonths());
       System.out.println(
"일차 : "+period.getDays());
     
       System.out.println(
"-------- period 누적 달수 --------");
       System.out.println(
"누적 월차 : "+period.toTotalMonths());
     
       Duration duration =
           Duration.between(localDateTime1, localDateTime2);
       System.out.println(
"-------- duration 특정항목의 차이 --------");
       System.out.println(
"나노초차 : "+ duration.getNano());
     
       System.out.println(
"-------- duration 누적 --------");
       System.out.println(
"누적 일차 : "+duration.toDays());
       System.out.println(
"누적 시간차 : "+duration.toHours());
       System.out.println(
"누적 분차 : "+duration.toMinutes());
       System.out.println(
"누적 초차 : "+duration.getSeconds());
       System.out.println(
"누적 밀리초차 : "+duration.toMillis());
       System.out.println(
"누적 나노초차 : "+duration.toNanos());
     
       
// 기간 차이 만큼 더 하기 (2021년 나올 것이다.)
       LocalDateTime localDateTime3 =
           localDateTime2.plus(period);
       System.out.println(
"-------- period 더하기 --------");
       System.out.println(
"기간 더하기 : "+localDateTime3);
   }
}

신 <-> 구 날짜 클래스 사이의 변환

Calendar, Date 클래스와 Date-Time API 변환 방향

java.util 클래스
변환 방향
java.time 의 클래스
Date
↔️
Instant
Calendar
Instant
Calendar, Date 클래스 변환 위한 메서드들
  • Date 클래스
  • toInstant() : 반환형 java.time.Instant
  • from(Instant instant) : 반환형 java.time.Date
  • Calendar 클래스
  • toInstant() : 반환형 java.time.Instant
예제코드

package project.time;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.util.Calendar;
import java.util.Date;

/**
* 기존 날짜,시간 클래스(Date, Calendar) 와
* 새로운 Date-Time(Instant) 변한하는 예제임
*/

public class ConvertTimeExample{
   
public static void main(String...args){
       LocalDateTime localDateTime1 =
           LocalDateTime.of(
2025,11,1,2,3,4,567890123);
     
       System.out.println(
"-------- 시작 시의 시간과 날짜 --------");
       System.out.println(localDateTime1);
     
       Instant instant1 =
           localDateTime1.toInstant(ZoneOffset.ofHours(
9));
     
       
// Instant에서 Date로 변환
       Date date = Date.from(instant1);
       System.out.println(
"-------- java.util.Date의 일시 --------");
       System.out.println(date);
     
       Calendar calendar = Calendar.getInstance();
       calendar.setTime(date);
       System.out.println(
"-------- java.util.Calendar의 일시 --------");
       System.out.println(calendar);
     
       
// Date -> Instant
       Instant instance2 = date.toInstant();
       LocalDateTime localDateTime2 =
           LocalDateTime.ofInstant(instance2, ZoneId.of(
"Asia/Seoul"));
       System.out.println(
"-------- Date -> LocalDateTime 변환의 일시 --------");
       System.out.println(localDateTime2);
     
       
// Calendar -> Instant
       Instant instance3 = calendar.toInstant();
       LocalDateTime localDateTime3 =
           LocalDateTime.ofInstant(instance3, ZoneId.of(
"Asia/Seoul"));
       System.out.println(
"-------- Calendar -> LocalDateTime 변환의 일시 --------");
       System.out.println(localDateTime3);
   }
}

5.3 Stream API의 병렬 처리

Java8부터 추가된 함수형 인터페이스
관련 패키지는 java.util.function
* 함수형 프로그램밍 이란 ~ SQL에 가까운 프로그래밍 스타일을 의미 함.
Stream API 처리 흐름
  • Stream 생성 -> 중간 조작 -> 종단 조작
Stream API에서 사용하는 주요 메소드
  • stream 생성 : Stream.of, Stream.generate, List.stream, List.parallelStream
  • 중간 조작 : filter , map , sorted , skip
  • 종단 조작 : forEach, forEachOrdered, toArray, min , max , count
예제코드

package project.stream;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

/**
* Stream API 예제#01
*/

public class StreamExampe01 {
   
public static void main(String...args){
       
// 상품 데이터 리스트를 작성한다.
       List<Product> productList =
new ArrayList<>();
       productList.add(
new Product("탁자", 30000));
       productList.add(
new Product("의자", 50000));
       productList.add(
new Product("전등", 15000));
     
       
// 리스트를 병렬 Stream 형태로 변경
       productList.parallelStream()
       
// 금액의 순서대로 정렬
           
//.sorted(Comparator.comparingInt(product->product.getPrice()))
           .sorted(Comparator.comparingInt(Product::getPrice).reversed())
       
// 정렬한 결과를 출력
           .forEachOrdered(System.out::println);
   }
}

/**
* 상품 클래스
*/

class Product {
   
/** 상품명 */
   
private String productName;
   
/** 금액 */
   
private int price;
 
   
public Product(String productName, int price){
       
this.productName = productName;
       
this.price = price;
   }
   
public String getProductName(){
       
return productName;
   }
   
public void setProductName(String productName){
       
this.productName = productName;
   }
   
public int getPrice(){
       
return price;
   }
   
public void setPrice(int price){
       
this.price = price;
   }
   
public String toString(){
       
return String.format("productName=[%s], price=[%d]",
                           productName,price);
   }
}
cosmoslight.huni@gmail.com님이 다음 문서를 첨부했습니다.

[책]실무에서 바로 통하는 자바
Google 문서: 온라인에서 문서를 만들고 수정해 보세요.
Google LLC, 1600 Amphitheatre Parkway, Mountain View, CA 94043, USA
다른 사용자가 Google 문서의 문서를 나와 공유하여 발송된 이메일입니다.
Google 문서 로고