λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Language/Java

[Java] JAVA 8 νŠΉμ§•

by jaee_ 2021. 8. 18.

πŸ“κ΅μœ‘μ›μ„ λ‹€λ‹λ•Œ κ°•μ‚¬λ‹˜κ»˜μ„œ μ•Œλ €μ£Όμ‹  μžλ°”λ²„μ „μ΄ 8λ²„μ „μ΄μ—ˆλ‹€. μ™œμΈμ§€λŠ” λͺ°λžλ‹€. κ·Έ λ‹Ήμ‹œ 11도 λ‚˜μ™€μžˆμ—ˆμ§€λ§Œ, μ–΄λ– ν•œ μ΄μœ μ—μ„œ μžλ°” 8버전을 μ‚¬μš©ν•˜λΌκ³  ν•˜μ…¨κ³ , λ‚œ λ”±νžˆ κΆκΈˆμ¦μ„ ν’ˆμ§€μ•Šκ³  이게 μžλ°”8λ²„μ „μ΄κ΅¬λ‚˜~! ν•˜κ³  아무생각없이 μ‚¬μš©ν–ˆλ‹€,,, ν”„λ‘œμ νŠΈλ₯Ό 진행할 λ•Œλ„ λ‹Ήμ—°ν•˜λ“―μ΄ 8버전을 μ‚¬μš©ν–ˆλ‹€. 

 

그런데 λ©˜ν† λ‹˜κ»˜μ„œ Java 8λ²„μ „μ—μ„œ λ³€κ²½λœ 게 무엇이며, νŠΉμ§•μ€ λ¬΄μ—‡μΌκΉŒμš”~? 라고 μ§ˆλ¬Έμ„ 주셨을 λ•Œ λ‚˜ μžμ‹ μ„ λ°˜μ„±ν•˜κ²Œ λ˜μ—ˆλ‹€... 정말 아무것도 λͺ¨λ₯΄κ³  μ‚¬μš©ν•˜κ³  μžˆμ—ˆκ΅¬λ‚˜ μ‹Άμ—ˆλ‹€. 

 

λ‹€μ‹œ μœ„μ˜ μ§ˆλ¬Έμ„ λ°›μ•˜μ„ λ•Œ λ²™μ°Œμ§€ μ•Šκ²Œ μ˜€λŠ˜μ€ Java 8의 νŠΉμ§•μ„ μ•Œμ•„λ³΄λ„λ‘ ν•˜μž. 


Java 8 νŠΉμ§• 

1. λžŒλ‹€ ν‘œν˜„μ‹(lambda expression) : ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°

2. Method Reference : λ©”μ„œλ“œ μ •μ˜λ₯Ό ν™œμš©ν•˜μ—¬ λžŒλ‹€μ²˜λŸΌ μ‚¬μš© κ°€λŠ₯

3. 슀트림 API(Stream API) : λ°μ΄ν„°μ˜ 좔상화

4. Parallel Stream : 슀트림 λ³‘λ ¬μ²˜λ¦¬ 

5. java.time νŒ¨ν‚€μ§€ : Joda-Time을 μ΄μš©ν•œ μƒˆλ‘œμš΄ λ‚ μ§œμ™€ μ‹œκ°„ API(Calendarκ°€ 가지고 μžˆλŠ” 단점을 보완)

6. Default Method : μΈν„°νŽ˜μ΄μŠ€μ˜ κ΅¬ν˜„μ²΄λ₯Ό μΈν„°νŽ˜μ΄μŠ€ μžμ²΄μ—μ„œ 기본으둜 제곡 κ°€λŠ₯

7. λ‚˜μ¦ˆν˜Ό(Nashorn) : μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μƒˆλ‘œμš΄ 엔진

 

 


λžŒλ‹€ ν‘œν˜„μ‹(Lambda expression)

λžŒλ‹€ν‘œν˜„μ‹μ΄λž€? κ°„λ‹¨νžˆ λ§ν•΄μ„œ λ©”μ†Œλ“œλ₯Ό ν•˜λ‚˜μ˜ '식(expression)'으둜 ν‘œν˜„ν•œ 것이닀. λ©”μ†Œλ“œλ₯Ό λžŒλ‹€μ‹μœΌλ‘œ ν‘œν˜„ν•˜λ©΄ λ©”μ†Œλ“œμ˜ 이름과 λ°˜ν™˜κ°’μ΄ μ—†μ–΄μ§€λ―€λ‘œ λžŒλ‹€μ‹μ„ λ‹€λ₯Έλ§λ‘œ '읡λͺ…ν•¨μˆ˜(anonymous function)'이라고도 ν•œλ‹€. λžŒλ‹€μ‹μ€ λͺ…ν™•ν•˜λ©΄μ„œ κ°„λž΅ν•˜κ²Œ ν‘œν˜„ν•  수 있게 ν•΄μ€€λ‹€. 

 

말둜 μ„€λͺ…ν•˜λŠ” 것보닀 μ½”λ“œλ‘œ μ΄ν•΄ν•˜λŠ” 것이 더 λΉ λ₯Ό 것 κ°™λ‹€. μ•„λž˜μ˜ μ½”λ“œλ₯Ό μ°Έκ³ ν•˜μ—¬ λžŒλ‹€μ‹μ˜ κ°„λž΅ν•¨κ³Ό λͺ…λ£Œν•¨μ„ 직접 느껴보자.

// (1) 일반 λ©”μ†Œλ“œ
int max(int a, int b){
	return a < b ? a : b;
}

// (2) λžŒλ‹€ ν‘œν˜„μ‹
(a, b) -> a < b ? a : b

ν•œλˆˆμ— 보기에도 간결해진 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. 

 

λžŒλ‹€μ‹ μž‘μ„±λ°©λ²•μ€ μ•„λž˜μ™€ κ°™λ‹€.

 λ°˜ν™˜νƒ€μž… λ©”μ†Œλ“œμ΄λ¦„(λ§€κ°œλ³€μˆ˜) -> { λ©”μ†Œλ“œλ‚΄μš© }

λ°˜ν™˜νƒ€μž…κ³Ό λ©”μ†Œλ“œλͺ…을 μ œκ±°ν•˜κ³  λ§€κ°œλ³€μˆ˜ 선언뢀와 λ©”μ†Œλ“œλ‚΄μš© 사이에 '->'λ₯Ό μΆ”κ°€ν•œλ‹€. 

 

 

슀트림(Stream)

μžλ°”μ—μ„œ μˆ˜λ§Žμ€ 데이터λ₯Ό λ‹€λ£° λ•Œ μ»¬λ ‰μ…˜μ΄λ‚˜ 배열에 데이터λ₯Ό λ‹΄κ³  μ›ν•˜λŠ” κ²°κ³Όλ₯Ό μ–»κΈ° μœ„ν•΄ forλ¬Έκ³Ό iteratorλ₯Ό μ‚¬μš©ν•˜μ—¬ μ½”λ“œλ₯Ό μž‘μ„±ν–ˆλ‹€. 

 

이와같은 방식은 가독성이 λ–¨μ–΄μ§€λŠ” 것 뿐만 μ•„λ‹ˆλΌ μž¬μ‚¬μš©μ„±λ„ 떨어진닀. λ˜ν•œ, 데이터 μ†ŒμŠ€λ§ˆλ‹€ λ‹€λ₯Έ λ°©μ‹μœΌλ‘œ 닀뀄야 ν•œλ‹€λŠ” λΆˆνŽΈν•¨μ΄ μžˆλ‹€. 예λ₯Όλ“€μ–΄ Listλ₯Ό μ •λ ¬ν•  λ•ŒλŠ” Collection.sort();λ₯Ό 배열을 μ •λ ¬ν•  λ•ŒλŠ” Arrays.sort();λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. 

 

슀트림(Stream)은 이와같은 λ¬Έμ œμ λ“€μ„ ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œ λ§Œλ“  것이닀.

μŠ€νŠΈλ¦Όμ€ λ°μ΄ν„°μ†ŒμŠ€λ₯Ό μΆ”μƒν•˜μ—¬ λ°μ΄ν„° μ†ŒμŠ€(List,λ°°μ—΄,,,,)κ°€ λ‹€λ₯΄λ”라도 같은 λ°©μ‹μœΌλ‘œ μ²˜λ¦¬κ°€ κ°€λŠ₯ν•˜κ²Œ μž¬μ‚¬μš©μ„±μ„ λ†’μ˜€λ‹€. 

 

μ•„λž˜μ˜ μ½”λ“œλ₯Ό 보며 μ‚¬μš©λ°©λ²•μ„ μ΅ν˜€λ³΄μž.

public class StreamTest {
    public static void main(String[] args) {
        String[] arr = {"aaa","bbb","ccc"};  //(1)
        List<String> strArr = Arrays.asList(arr);  //(2)

	Stream<String> stream = strArr.stream();  //(3)
        Stream<String> stream2 = Arrays.stream(arr);  

        stream.sorted().forEach(System.out::println);  //(4)
        stream2.sorted().forEach(System.out::println);

    }
}

(1) 배열생성

(2) List 생성

(3) Stream 적용

(4) Stream을 μ μš©ν•œ λ³€μˆ˜μ— streamλ©”μ†Œλ“œμΈ sorted()λ₯Ό μ μš©ν•˜μ—¬ μ •λ ¬ ν›„ λ°˜λ³΅λ¬Έμ„ μ‚¬μš©ν•˜μ—¬ 좜λ ₯

 

λ‹€λ₯Έλ°μ΄ν„° μ†ŒμŠ€μž„μ—λ„ μŠ€νŠΈλ¦Όμ„ μ‚¬μš©ν•˜μ—¬ 같은 λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜λ‹€. 이λ₯Ό 톡해 μ½”λ“œκ°€ 간결해짐과 슀트림의 μž¬μ‚¬μš©μ„±μ΄ λ†’λ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€. 

 

Parallel Stream

μœ„μ˜ Stream을 λ³‘λ ¬λ‘œ μ²˜λ¦¬κ°€λŠ₯ν•˜λ„λ‘ ν•˜λŠ” κΈ°λŠ₯이닀. μ—¬λŸ¬ μŠ€λ ˆλ“œμ—μ„œ μ²˜λ¦¬ν•  수 μžˆλ„λ‘ λΆ„ν• ν•œ Stream이닀. 

 

java.time νŒ¨ν‚€μ§€

기쑴에 μžλ°”μ—μ„œ μ œκ³΅ν•˜λ˜ Date와 Calendarκ°€ 가지고 μžˆλŠ” 단점을 λ³΄μ™„ν•˜κΈ° μœ„ν•΄  java.timeνŒ¨ν‚€μ§€κ°€ μΆ”κ°€λ˜μ—ˆλ‹€. 

 

μ €λŠ” λ³„λ‘œ λΆˆνŽΈν•¨ 없이 μ‚¬μš©ν–ˆλŠ”λ°μš©? λΌλŠ” μ‚¬λžŒμ΄ μžˆμ„ 것 κ°™μœΌλ‹ˆ 기쑴에 μ–΄λ–€ 단점이 μžˆμ—ˆλŠ”μ§€ λ¨Όμ € μ„€λͺ…ν•˜κ² λ‹€.

1. Calendarν΄λž˜μŠ€λŠ” μ›”(month)λ₯Ό ν‘œν˜„ν•  λ•Œ 0λΆ€ν„° μ‹œμž‘ν•œλ‹€.  즉 1월은 0, 2월은 1... κ·Έλž˜μ„œ +1을 ν•΄μ€˜μ•Ό μ›ν•˜λŠ” 월을 얻을 수 μžˆλ‹€.

2. Calendarν΄λž˜μŠ€λŠ” λΆˆλ³€κ°μ²΄κ°€ μ•„λ‹ˆλ‹€. 이 말은 μˆ˜μ •μ΄ κ°€λŠ₯ν•˜μ—¬ λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ— λ…ΈμΆœλ˜μ—ˆμ„ λ•Œ μ•ˆμ „ν•˜μ§€ μ•Šλ‹€λŠ” 것이닀.

3. Calendarν΄λž˜μŠ€λŠ” μœ€μ΄ˆμ™€ 같은 νŠΉλ³„ν•œ 상황을 κ³ λ €ν•˜μ§€ μ•ŠλŠ”λ‹€.

 

이λ₯Ό λ³΄μ™„ν•˜μ—¬ λ‚˜μ˜¨ 것이 λ°”λ‘œ 'java.time' 이닀. λ‚ μ§œμ™€ μ‹œκ°„μ„ 같이 λ³΄μ—¬μ£Όλ˜ Calendar와 λ‹€λ₯΄κ²Œ java.timeμ—μ„œλŠ” λ³„λ„λ‘œ 클래슀λ₯Ό 뢄리해 λ†“μ•˜λ‹€. μ•„λž˜μ˜ 예제λ₯Ό 보고 ν™•μΈν•΄λ³΄μž.

public class timeTest {
    public static void main(String[] args) {
        LocalDate ld = LocalDate.now();
        System.out.println(ld);

        LocalTime lt = LocalTime.now();
        System.out.println(lt);

        LocalDateTime ldt = LocalDateTime.now();
        System.out.println(ldt);
    }
}

κ²°κ³ΌλŠ” μ•„λž˜μ™€ κ°™λ‹€.

2021-08-18
00:49:08.560
2021-08-18T00:49:08.560

μœ„μ˜ μ˜ˆμ œμ—μ„œ μ‚¬μš©ν•œ 클래슀 말고도 λ‹€μ–‘ν•œ ν•˜μœ„ ν΄λž˜μŠ€κ°€ μ‘΄μž¬ν•˜λ‹ˆ κΆκΈˆν•˜λ‹€λ©΄ 더 깊게 μ•Œμ•„λ³΄λ©΄ 쒋을 것 κ°™λ‹€. 

 

Default Method

  • μΈν„°νŽ˜μ΄μŠ€μ˜ κ΅¬ν˜„μ²΄λ₯Ό μΈν„°νŽ˜μ΄μŠ€ μžμ²΄μ—μ„œ 기본으둜 제곡 κ°€λŠ₯ν•˜λ‹€
  • κ΅¬ν˜„ ν΄λž˜μŠ€μ—μ„œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€
public interface test {
	int no();
 
	default boolean test() {  // Default Method
		return no() == 0;
	}
}

 

λ‚˜μ¦ˆν˜Ό(Nashorn)

μ§€κΈˆκΉŒμ§€ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κΈ°λ³Έ μ—”μ§„μœΌλ‘œλŠ” λͺ¨μ§ˆλΌμ˜ 리노(Rhino)κ°€ μ‚¬μš©λ˜μ–΄ μ™”λ‹€.

ν•˜μ§€λ§Œ μžλ°”μ˜ μ΅œμ‹  κ°œμ„  사항 등을 μ œλŒ€λ‘œ ν™œμš©ν•˜μ§€ λͺ»ν•˜λŠ” λ“± λ…Έν›„ν™”λœ λͺ¨μŠ΅μ„ λ³΄μ—¬μ£Όκ²Œ λœλ‹€.

 

λ”°λΌμ„œ 이번 Java SE 8 λ²„μ „λΆ€ν„°λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μƒˆλ‘œμš΄ μ—”μ§„μœΌλ‘œ 였라클의 λ‚˜μ¦ˆν˜Ό(Nashorn)을 λ„μž…ν•˜κ²Œ λ˜μ—ˆλ‹€. 

λ‚˜μ¦ˆν˜Ό(Nashorn)은 기쑴에 μ‚¬μš©λ˜μ–΄ 온 리노에 λΉ„ν•΄ μ„±λŠ₯κ³Ό λ©”λͺ¨λ¦¬ 관리 λ©΄μ—μ„œ 크게 κ°œμ„ λœ 슀크립트 엔진이라고 μ΄ν•΄ν•˜λ©΄ 될 것 κ°™λ‹€.

 


μžλ°” 버전별 νŠΉμ§•μ΄ κΆκΈˆν•˜λ‹€λ©΄ μ•„λž˜μ˜ 링크λ₯Ό μ°Έμ‘°ν•˜μž. (λ‚˜μ€‘μ— μ‹œκ°„μ΄ λœλ‹€λ©΄ ν‘œλ‘œ 정리해보겠닀..)

https://namu.wiki/w/Java

 


μ°Έκ³ ν•œ μ‚¬μ΄νŠΈ

μžλ°”μ˜ μ‹ 

μžλ°”μ˜ 정석

http://tcpschool.com/java/java_lambda_concept

λŒ“κΈ€