🌈 [Section1] 17. Java 심화1

ν˜„μ£ΌΒ·2022λ…„ 9μ›” 18일
0

bootcamp

λͺ©λ‘ 보기
17/71

πŸ“• 였늘 배운 λ‚΄μš©!

  • μ• λ„ˆν…Œμ΄μ…˜ (Annotation)
  • λžŒλ‹€μ‹
  • 슀트림 (Stream)

✏️ μ• λ„ˆν…Œμ΄μ…˜ (Annotation)

  • νŠΉμ • ν”„λ‘œκ·Έλž¨μ—κ²Œ μ–΄λ– ν•œ 정보λ₯Ό μ œκ³΅ν•˜κΈ° μœ„ν•œ 것

πŸ’‘ Comment와 Annotation (λ‘˜ λ‹€ 주석)

  • 정보λ₯Ό μ „λ‹¬ν•˜λŠ” λŒ€μƒμ— 차이가 있음
  • CommentλŠ” κ°œλ°œμžκ°€ κ°œλ°œν•˜λ©΄μ„œ μ°Έκ³ ν•˜κΈ° μœ„ν•΄ (μ½”λ”©ν•  λ•Œ 주둜 μ‚¬μš©ν•˜λŠ” 주석)
    ( μ½”λ“œ 싀행에 영ν–₯ X )

✏️ μ• λ„ˆν…Œμ΄μ…˜μ˜ μ’…λ₯˜

βœ” ν‘œμ€€ μ• λ„ˆν…Œμ΄μ…˜

  • @Override
    μƒμœ„ν΄λž˜μŠ€μ˜ λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”© ν•œ ν•˜μœ„ λ©”μ„œλ“œμ—μ„œ 이름이 같지 μ•Šκ±°λ‚˜ λŸ°νƒ€μž„μ—λŸ¬κ°€ λ°œμƒν•  λ•Œ λΉ¨κ°„μ€„λ‘œ μ—λŸ¬λ₯Ό λ°œμƒμ‹œμΌœμ€Œ
    (μ˜€λ²„λΌμ΄λ”©ν•  λ©”μ„œλ“œ μ•žμ—λ§Œ 뢙일 수 있음)
    (μ•ˆλΆ™μ—¬λ„ λ¬΄κ΄€ν•˜μ§€λ§Œ κ·Έλƒ₯ 정보 μ£ΌλŠ” 것)

  • @Deprecated
    μƒˆλ‘œμš΄ 버전이 μžˆμ–΄ λŒ€μ²΄λ˜μ—ˆμœΌλ‹ˆ 이 기쑴의 것을 μ‚¬μš©ν•˜μ§€ 마라

  • @FunctionalInterface
    ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ μ„ μ–Έ μ‹œμ— 이 선언이 λ°”λ₯΄κ²Œ λ˜μ—ˆλŠ”μ§€ ν™•μΈν•˜κ³  μ•„λ‹Œ 경우 μ—λŸ¬ λ°œμƒμ‹œμΌœμ€Œ
    ( μ½”λ“œ μž‘μ„±μ‹œ μ‹€μˆ˜ 방지λ₯Ό μœ„ν•œ ν™•μΈμš© μ• λ„ˆν…Œμ΄μ…˜ )

  • @SuppressWarning
    컴파일 κ²½κ³  메세지가 λ‚˜νƒ€λ‚˜μ§€ μ•Šκ²Œ 해라
    ( 뒀에 κ΄„ν˜Έλ₯Ό λΆ™μ—¬ κ·Έ μ•ˆμ— μ–΄λ–€ κ²½κ³ λ₯Ό μ–΅μ œν•  지 μ“Έ 수 있음 )

βœ” 메타 μ• λ„ˆν…Œμ΄μ…˜

νŠΉμ • μ• λ„ˆν…Œμ΄μ…˜μ˜ 적용 λŒ€μƒ μœ μ§€ κΈ°κ°„ 등을 λ‹€μ‹œ κ΄€λ¦¬ν•˜κΈ° μœ„ν•œ μ• λ„ˆν…Œμ΄μ…˜

  • @Target({})
    μ€‘κ΄„ν˜Έ μ•ˆμ— μ• λ„ˆν…Œμ΄μ…˜ 적용 λŒ€μƒ 지정

  • @Documented
    μ• λ„ˆν…Œμ΄μ…˜ 정보λ₯Ό javadoc λ¬Έμ„œμ— ν¬ν•¨λ˜λ„λ‘ 함
    (@Overfide, @SuppressWarning λΉΌκ³  λͺ¨λ‘ 이 μ• λ„ˆν…Œμ΄μ…˜μ΄ μ μš©λ˜μ–΄ 있음)

  • @Inherited
    ν•΄λ‹Ή 클래슀의 ν•˜μœ„ν΄λž˜μŠ€μ—λ„ μ• λ„ˆν…Œμ΄μ…˜ 상속받도둝함

  • @Retention
    νŠΉμ • μ• λ„ˆν…Œμ΄μ…˜μ˜ 지속 μ‹œκ°„ κ²°μ •
    -> μ–Όλ§ˆλ‚˜ μœ μ§€λ μ§€ < SOURCE (μ†ŒμŠ€νŒŒμΌμ— 쑴재) / CLASS (κΈ°λ³Έκ°’) / RUNTIME (μ‹€ν–‰μ‹œ μ‚¬μš©) > 둜 κ²°μ •

  • @Repeatable
    μ• λ„ˆν…Œμ΄μ…˜ μ—¬λŸ¬λ²ˆ 뢙일 수 μžˆλ„λ‘ ν—ˆμš©
    (μ—¬λŸ¬κ°œ 적힌 μ• λ„ˆν…Œμ΄μ…˜λ“€μ„ ν•˜λ‚˜λ‘œ λ¬Άμ–΄μ£ΌλŠ” μ• λ„ˆν…Œμ΄μ…˜λ„ λ³„λ„λ‘œ μž‘μ„±ν•΄μ•Όν•¨)

βœ” μ‚¬μš©μž μ •μ˜ μ• λ„ˆν…Œμ΄μ…˜

μ‚¬μš©μžκ°€ 직접 μ• λ„ˆν…Œμ΄μ…˜ μ •μ˜ ν›„ μ‚¬μš©ν•˜λŠ” 것

@interface μ• λ„ˆν…Œμ΄μ…˜ λͺ… { //μ• λ„ˆν…Œμ΄μ…˜ μ •μ˜
	νƒ€μž… μš”μ†Œλͺ…(); //μ• λ„ˆν…Œμ΄μ…˜ μš”μ†Œ μ„ μ–Έ
}

✏️ λžŒλ‹€μ‹

  • λ©”μ„œλ“œλ₯Ό κ°„λž΅ν•˜κ²Œ ν‘œν˜„ν•˜κΈ° μœ„ν•œ 문법 μš”μ†Œ ( 더 λ˜‘λ˜‘ν•˜κ³  더 κ°„νŽΈν•œ μ½”λ“œλ₯Ό μœ„ν•΄!! )
    ( λ©”μ†Œλ“œλ₯Ό μ°Έμ‘°ν•΄μ„œ 맀개 λ³€μˆ˜μ˜ 정보 및 리턴 νƒ€μž…μ„ μ•Œμ•„λ‚΄μ–΄, λžŒλ‹€μ‹μ—μ„œ λΆˆν•„μš”ν•œ 맀개 λ³€μˆ˜λ₯Ό 제거 )

  • Stream μ‚¬μš©μ— ν™œμš©

  • 읡λͺ…객체(읡λͺ…ν΄λž˜μŠ€) πŸ‘‰ λ°˜ν™˜νƒ€μž… / 이름 μƒλž΅ κ°€λŠ₯

    πŸ’‘ 읡λͺ…ν΄λž˜μŠ€λž€?

    • 객체의 μ„ μ–Έκ³Ό 생성을 λ™μ‹œμ— ν•˜μ—¬ 였직 ν•˜λ‚˜μ˜ 객체λ₯Ό μƒμ„±ν•˜κ³ , 단 ν•œλ²ˆλ§Œ μ‚¬μš©λ˜λŠ” 일회용 클래슀
  • λ°˜ν™˜κ°’μ΄ μžˆλŠ” λ©”μ„œλ“œμ˜ 경우 πŸ‘‰ returnλ¬Έ / μ„Έλ―Έμ½œλ‘ (;) 도 μƒλž΅ κ°€λŠ₯

  • λ§€κ°œλ³€μˆ˜ νƒ€μž…μ„ μ‰½κ²Œ μœ μΆ”ν•  수 μžˆλŠ” 경우 πŸ‘‰ λ§€κ°œλ³€μˆ˜ νƒ€μž…λ„ μƒλž΅ κ°€λŠ₯

Ex. ⬇️ λžŒλ‹€μ‹ μ‚¬μš©

// κΈ°μ‘΄ 방식
void example (String str) {
	System.out.println(str);
}
----------------------------------------------------------------------------------
// λžŒλ‹€μ‹
(String str) -> { System.out.println(str);}

Ex. ⬇️ νŠΉμ • 쑰건을 μΆ©μ‘±ν•œ 경우

//κΈ°μ‘΄ 방식
int sum(int num1, int num2) { //λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž… μ‰½κ²Œ μœ μΆ” κ°€λŠ₯
	return num1 + num2; //λ°˜ν™˜νƒ€μž…μ΄ 있음
}
----------------------------------------------------------------------------------
// λžŒλ‹€μ‹
(num1, num2) -> num1 + num2 //μ‹€ν–‰λ¬Έ ν•˜λ‚˜λ§Œ μ‘΄μž¬ν•΄ {}μƒλž΅

βœ” ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ (Functional Interface)

  • λžŒλ‹€μ‹μ„ 객체처럼 닀루기 μœ„ν•΄ μ‚¬μš©ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€
    ( 기쑴의 μΈν„°νŽ˜μ΄μŠ€ 문법을 ν™œμš©ν•˜μ—¬ λžŒλ‹€μ‹μ„ λ‹€λ£¨λŠ” 것 )

  • ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ—λŠ” 단 ν•˜λ‚˜μ˜ μΆ”μƒλ©”μ„œλ“œλ§Œ μ„ μ–Έ
    ( λžŒλ‹€μ‹κ³Ό μΈν„°νŽ˜μ΄μŠ€μ˜ λ©”μ„œλ“œλŠ” 1:1둜 맀칭되기 λ•Œλ¬Έ )

πŸ‘‰ 1. λ§€κ°œλ³€μˆ˜μ™€ 리턴값이 μ—†λŠ” λžŒλ‹€μ‹ (λ§€κ°œλ³€μˆ˜, 리턴값이 μ—†λŠ” μΆ”μƒλ©”μ„œλ“œλ₯Ό 가진 ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€)

//κΈ°μ‘΄ 방식
public interface Example {
	public void accept();
}
----------------------------------------------------------------------------------
//λžŒλ‹€μ‹
Example ex1 = () -> { ... } //싀행문이 ν•˜λ‚˜λ©΄ {} μƒλž΅ κ°€λŠ₯

ex1.accept(); λ©”μ„œλ“œ 호좜 ➜ { ... } 의 λ‚΄μš©μ΄ 좜λ ₯됨

πŸ‘‰ 2. λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” λžŒλ‹€μ‹ (맀개 λ³€μˆ˜κ°€ 있고 리턴값이 μ—†λŠ” 좔상 λ©”μ„œλ“œλ₯Ό 가진 ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€)

//κΈ°μ‘΄ 방식
public interface Example {
	public void accept(int x);
}
----------------------------------------------------------------------------------
//λžŒλ‹€μ‹
Example ex1 = (x) -> { ... } //싀행문이 ν•˜λ‚˜λ©΄ {} μƒλž΅ κ°€λŠ₯

ex1.accept(x에 λŒ€μž…λ  수); λ©”μ„œλ“œ 호좜 ➜ { ... } 의 λ‚΄μš©μ΄ 좜λ ₯됨

πŸ‘‰ 3. 리턴값이 μžˆλŠ” λžŒλ‹€μ‹ (맀개 λ³€μˆ˜μ™€ 리턴값을 κ°€μ§€λŠ” 좔상 λ©”μ„œλ“œλ₯Ό ν¬ν•¨ν•˜λŠ” ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€)

//κΈ°μ‘΄ 방식
public interface Example {
	public int accept(int x, int y); //voidκ°€ μ•„λ‹Œ int -> 리턴값 O
}
----------------------------------------------------------------------------------
//λžŒλ‹€μ‹
Example ex1 = (x) -> { ... }
//return κ°’ μžˆμ–΄μ•Όν•¨ //싀행문이 ν•˜λ‚˜μΌ 경우 {}, returnκ°’ μƒλž΅ κ°€λŠ₯

ex1.accept(x, y에 λŒ€μž…λ  수); λ©”μ„œλ“œ 호좜 ➜ { ... } 의 λ‚΄μš©μ΄ 좜λ ₯됨

βœ” λ©”μ„œλ“œ μ°Έμ‘° (Method Reference)

  • λžŒλ‹€μ‹ 보닀 더 κ°„λ‹¨ν•˜κ²Œ ν•˜κ³ μ‹Άμ„ λ•Œ μΈμŠ€ν„΄μŠ€μ˜ λ©”μ„œλ“œλ₯Ό μ°Έμ‘°ν•˜κΈ° μœ„ν•΄ μ‚¬μš©
    (ν΄λž˜μŠ€λ“€μ„ λͺ¨λ‘ μž‘μ„± ν›„ Main λ©”μ„œλ“œμ—μ„œ μ‚¬μš©)
//λžŒλ‹€μ‹
String name =
memberList.stream().map(element -> element.getName()).collect(Collectors.toList());
--------------------------------------------------------------------------
//λ©”μ„œλ“œ μ°Έμ‘° ν‘œν˜„μ‹
String name =
memberList.stream().map(Member::getName()).collect(Collectors.toList());

➜ λžŒλ‹€μ‹μ˜ μΈμŠ€ν„΄μŠ€ -> μΈμŠ€ν„΄μŠ€.λ©”μ„œλ“œλͺ…을 λ©”μ„œλ“œ μ°Έμ‘° ν‘œν˜„μœΌλ‘œ
μΈμŠ€ν„΄μŠ€μ˜ 클래슀λͺ…::λ©”μ„œλ“œλͺ… 으둜 λ³€κ²½

  • κΈ°λ³Έ λ©”μ„œλ“œ μ°Έμ‘° ➜ 클래슀λͺ… :: λ©”μ„œλ“œλͺ… ( 클래슀λͺ….λ©”μ„œλ“œλͺ… κ³Ό 같은 λ§₯락 )

  • μ •μ λ©”μ„œλ“œ μ°Έμ‘° ➜ 클래슀λͺ… :: 정적 λ©”μ„œλ“œλͺ… ( 클래슀λͺ….μ •μ λ©”μ„œλ“œλͺ… κ³Ό 같은 λ§₯락 )

  • μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ μ°Έμ‘° ➜ (μƒμ„±ν•œ μΈμŠ€ν„΄μŠ€μ˜)μ°Έμ‘° λ³€μˆ˜λͺ… :: μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλͺ…

βœ” μƒμ„±μž μ°Έμ‘° (Constructor Reference)

  • μƒμ„±μžλ₯Ό μ°Έμ‘°ν•œλ‹€ = 객체 생성 ➜ 클래슀λͺ… :: new ( 객체 μƒμ„±ν–ˆμ„ λ•Œ 였λ₯Έμͺ½ μƒμ„±μž )

  • μƒμ„±μžκ°€ μ˜€λ²„λ‘œλ”©λ˜μ–΄ μ—¬λŸ¬κ°œ μžˆμ„ 경우 ➜ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ˜ μΆ”μƒλ©”μ„œλ“œμ™€ λ™μΌν•œ λ§€κ°œλ³€μˆ˜ νƒ€μž…κ³Ό 개수 가지고 μžˆλŠ” μƒμ„±μž μ°Ύμ•„ μ‹€ν–‰

//λžŒλ‹€μ‹
List<Member> memberList =
memberNameList.stream().map(name -> new Member(name)).collect(Collectors.toList());
-----------------------------------------------------------------------------------
//λ©”μ„œλ“œ μ°Έμ‘° ν‘œν˜„μ‹
List<Member> memberList =
memberNameList.stream().map(Member::new).collect(Collectors.toList());

➜ λžŒλ‹€μ‹μ˜ (리슀트의 인자둜 λ“€μ–΄κ°ˆ 객체 -> new 클래슀λͺ…(인자둜 λ“€μ–΄κ°ˆ 객체))λ₯Ό
λ©”μ„œλ“œ μ°Έμ‘° ν‘œν˜„μœΌλ‘œ (클래슀λͺ…::new) 으둜 λ³€κ²½


✏️ 슀트림 (Stream)

  • λ‹€μ–‘ν•œ 데이터 μ†ŒμŠ€(μ»¬λž™μ…˜/λ°°μ—΄)λ₯Ό ν‘œμ€€ν™”ν•˜μ—¬ ν†΅ν•©λœ λ°©μ‹μœΌλ‘œ λ‹€λ£¨λŠ” μ„ μ–Έν˜• ν”„λ‘œκ·Έλž˜λ° 방식

  • Collection μΈν„°νŽ˜μ΄μŠ€ μ•ˆμ— μ •μ˜λ˜μ–΄μžˆκΈ° λ•Œλ¬Έμ— κ΅¬ν˜„ 객체듀(List, Set, Map) λͺ¨λ‘ 슀트림 μ‚¬μš© κ°€λŠ₯ (배열도 μ‚¬μš© κ°€λŠ₯)

  • 데이터 μ†ŒμŠ€λ‘œλΆ€ν„° 데이터λ₯Ό 읽기만 ν•  뿐 λ³€κ²½ X ( Read-only )
    ( 원본을 λ³€κ²½ν•˜μ§€ μ•Šμ•„ 원본에 영ν–₯ X )

  • μŠ€νŠΈλ¦Όμ€ 일회용 (one-time only)
    ( ν•œ 번 μ‚¬μš©ν•˜λ©΄ λ‹«νž˜ ➜ ν•„μš”ν•˜λ‹€λ©΄ μƒˆλ‘œμš΄ μŠ€νŠΈλ¦Όμ„ λ§Œλ“€μ–΄μ•Όν•¨ )

  • < 슀트림 생성 / 쀑간 μ—°μ‚° / μ΅œμ’… μ—°μ‚° > 이 μ„Έ λ‹¨κ³„λ‘œ ꡬ성

πŸ’‘ μ»¬λ ‰μ…˜ vs 슀트림

  • 곡톡점
    ➜ μ—°μ†λœ μš”μ†Œν˜•μ‹μ˜ 값을 μ €μž₯ν•˜λŠ” 자료ꡬ쑰 μΈν„°νŽ˜μ΄μŠ€λ₯Ό 제곡
    ➜ λ‘˜λ‹€ 순차적으둜 μš”μ†Œμ— μ ‘κ·Ό
    β €
  • 차이점
    • μ»¬λ ‰μ…˜
      ➜ 각 계산식을 λ§Œλ‚  λ•Œλ§ˆλ‹€ 데이터가 계산
      ➜ λ°μ΄ν„°μ˜ μ ‘κ·Ό, 읽기, λ³€κ²½, μ €μž₯이 μ£Όμš” λͺ©μ 
      ➜ 데이터에 μ ‘κ·Όν•˜λŠ” 방법을 직접 μž‘μ„±
      ➜ Iterator둜 λͺ¨λ“ μš”μ†Œλ₯Ό μˆœν™˜
      ➜ λ©”λͺ¨λ¦¬μ— λͺ¨λ“  μš”μ†Œκ°€ μ˜¬λΌκ°€ μžˆλŠ” μƒνƒœμ—μ„œ μš”μ†Œλ“€μ„ λˆ„μ μ‹œν‚€λ©° κ²°κ³Όλ₯Ό 계산
      ➜ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ λŠ˜μ–΄λ‚¨
      β €
      πŸ‘‰ 물을 ν•œλ²ˆμ— λ§ˆμ‹œλŠ” 건 μ»¬λ ‰μ…˜
      β €
    • 슀트림
      ➜ μ΅œμ’… 연산이 μ‹€ν–‰ 될 λ•Œμ— 데이터가 계산
      ➜ 계산식(λžŒλ‹€)을 ν‘œν˜„ν•˜λŠ” 것이 μ£Όμš” λͺ©μ 
      ➜ 데이터에 μ ‘κ·Όν•˜λŠ” 방법이 μΆ”μƒν™”λ˜μ–΄μžˆμŒ
      ➜ 계산식을 미리 적어두고 κ³„μ‚°μ‹œμ— λžŒλ‹€μ‹μœΌλ‘œ JVM에 λ„˜κΉ€
      ➜ λ‚΄λΆ€μ—μ„œ μš”μ†Œλ“€μ„ μ–΄λ–»κ²Œ λ©”λͺ¨λ¦¬μ— μ˜¬λ¦¬λŠ” μ§€λŠ” 상관 X
      ➜ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ 쀄어듦
      ➜ λŒ€μš©λŸ‰ λ°μ΄ν„°μ˜ κ°€κ³΅μ²˜λ¦¬ κ°€λŠ₯
      ( λ§Žμ€ 데이터λ₯Ό λ³‘λ ¬λ‘œ μͺΌκ°œμ„œ λ™μ‹œμ— ν•œλ²ˆμ— μ²˜λ¦¬ν•˜κΈ° λ•Œλ¬Έμ— )
      β €β €
      πŸ‘‰ 물을 κΏ€κΊ½κΏ€κΊ½ 단계에 맞좰 λ§ˆμ‹œλŠ” 건 슀트림

βœ” 슀트림의 νŠΉμ§•

  • μ„ μ–Έν˜•μœΌλ‘œ 데이터 μ†ŒμŠ€ 처리
    (λ‚΄λΆ€λ™μž‘ 원리λ₯Ό λͺ°λΌλ„ μ„ μ–Έλ˜μ–΄μžˆλŠ” μ½”λ“œλ₯Ό 보고 μ½”λ“œκ°€ 무슨 일 ν•˜λŠ”μ§€ 이해 κ°€λŠ₯)

  • λžŒλ‹€μ‹μœΌλ‘œ μš”μ†Œ 처리 μ½”λ“œ 제곡

  • λ‚΄λΆ€ 반볡자λ₯Ό μ‚¬μš©ν•˜μ—¬ λ³‘λ ¬μ²˜λ¦¬κ°€ 쉬움 (병렬 슀트림 - parallel()λ©”μ„œλ“œ μ‚¬μš© )

  • 쀑간 μ—°μ‚°κ³Ό μ΅œμ’… 연산을 ν•  수 있음

πŸ’‘ 반볡자 μ’…λ₯˜
β €
1. μ™ΈλΆ€ 반볡자 (external iterator)

  • κ°œλ°œμžκ°€ μ½”λ“œλ‘œ 직접 μ»¬λ ‰μ…˜μ˜ μš”μ†Œλ₯Ό λ°˜λ³΅ν•΄μ„œ κ°€μ Έμ˜€λŠ” μ½”λ“œ νŒ¨ν„΄
    (μ»¬λ ‰μ…˜μ—μ„œ μ‚¬μš©ν•˜λ˜ iterator)
  1. λ‚΄λΆ€ 반볡자 (internal iterator)
  • μ»¬λ ‰μ…˜ λ‚΄λΆ€μ—μ„œ μš”μ†Œλ“€μ„ λ°˜λ³΅μ‹œν‚€κ³  κ°œλ°œμžλŠ” μš”μ†Œλ‹Ή μ²˜λ¦¬ν•΄μ•Όν•  μ½”λ“œλ§Œ μ œκ³΅ν•˜λŠ” μ½”λ“œ νŒ¨ν„΄

πŸ’‘ λ³‘λ ¬μ²˜λ¦¬λž€?

  • ν•œ 가지 μž‘μ—…μ„ μ„œλΈŒ μž‘μ—…μœΌλ‘œ λ‚˜λˆ„κ³ , μ„œλΈŒ μž‘μ—…λ“€μ„ λΆ„λ¦¬λœ μŠ€λ ˆλ“œμ—μ„œ λ³‘λ ¬μ μœΌλ‘œ μ²˜λ¦¬ν•˜λŠ” 것

βœ” λ¦¬λ•μ…˜(Reduction)

λŒ€λŸ‰μ˜ 데이터λ₯Ό κ°€κ³΅ν•΄μ„œ μΆ•μ†Œν•˜λŠ” 것
-> λ°μ΄ν„°μ˜ 합계, 평균값, μΉ΄μš΄νŒ…, μ΅œλŒ€κ°’, μ΅œμ†Œκ°’ 등이 λŒ€ν‘œμ μΈ κ²°κ³Όλ¬Ό

βœ” νŒŒμ΄ν”„λΌμΈ(pipelines)

  • 쀑간연산, μ΅œμ’…μ—°μ‚°μ˜ μ—¬λŸ¬κ°œμ˜ μŠ€νŠΈλ¦Όλ“€μ΄ μ—°κ²°λ˜μ–΄μžˆλŠ” ꡬ쑰
    ( 슀트림이 쀑간연산과 μ΅œμ’…μ—°μ‚°μ„ 이 νŒŒμ΄ν”„λΌμΈμœΌλ‘œ μ²˜λ¦¬ν•¨ )

πŸ’‘ λͺ…λ Ήν˜• ν”„λ‘œκ·Έλž˜λ° vs μ„ μ–Έν˜• ν”„λ‘œκ·Έλž˜λ°

  • λͺ…λ Ήν˜•μ€ if / forλ¬Έ
  • μ„ μ–Έν˜•μ€ stream
    ( 체인처럼 λ‚˜μ—΄λ˜μ–΄ μžˆμ–΄μ„œ μ²΄μΈν˜•μ΄λΌκ³  ν•˜κΈ°λ„ 함 )
    β €
    ➜ 각 μž₯점이 μžˆμœΌλ‹ˆ 상황에 λ§žμΆ”μ–΄ 잘 μ‚¬μš©ν•˜κΈ° !

✏️ 슀트림 μˆœμ„œ

1. 슀트림 생성

  • stream() μ‚¬μš©ν•˜μ—¬ Collection 객체λ₯Ό μ†ŒμŠ€λ‘œ ν•˜λŠ” Stream λ°˜ν™˜
  • 객체의 μ°Έμ‘°λ³€μˆ˜λͺ….stream()

2. 쀑간 μ—°μ‚°

  • μ—°μ†ν•΄μ„œ μ—¬λŸ¬λ²ˆ μˆ˜ν–‰ κ°€λŠ₯ ( μ—¬λŸ¬λ²ˆ μˆ˜ν–‰ν•œ κ²°κ³ΌλŠ” 슀트림 )

    μ£Όμš” λ©”μ„œλ“œ

    • 필터링
      distinct() ➜ 쀑볡 제거
      filter() ➜ Stream 쑰건이 참이 λ˜λŠ”(쑰건이 λ§žλŠ”) λ°μ΄ν„°λ§Œ μΆ”μΆœ
      β €
    • 맀핑
      map()
      ➜ κΈ°μ‘΄ Stream μš”μ†Œλ“€μ„ λŒ€μ²΄ν•˜λŠ” μš”μ†Œλ‘œ κ΅¬μ„±λœ μƒˆλ‘œμš΄ Stream ν˜•μ„±ν•˜λŠ” μ—°μ‚°
      ➜ μ§€μ •λœ 값을 νŠΉμ •ν•œ ν˜•νƒœλ‘œ λ³€ν™˜ν•˜λŠ”λ° 주둜 μ‚¬μš©
      Ex. λͺ¨λ“  μš”μ†Œλ“€μ„ λŒ€λ¬Έμžλ‘œ λ°”κΎΈκΈ°
      ➜ Stream의 Stream을 λ°˜ν™˜
      flatMap() ➜ Stream을 λ°˜ν™˜
      Ex. Srting κ°μ²΄λ“€μ˜ 슀트림이 λ‘κ°œκ°€ μžˆμ„ λ•Œ, 그것듀을 μ—¬λŸ¬ λ°°μ—΄μ˜ μš”μ†Œλ“€μ„ flatν•˜κ²Œ ν•œ 배열에 λͺ°μ•„μ„œ λ§Œλ“€μ–΄μ€€λ‹€ν…μŠ€νŠΈ
      β €
    • μ •λ ¬
      sorted() ➜ μ˜€λ¦„μ°¨μˆœ μ •λ ¬
      sorted(Comparator.reverseOrder()) ➜ λ‚΄λ¦Όμ°¨μˆœ μ •λ ¬
      β €
    • μ—°μ‚° κ²°κ³Ό 확인
      peek() ➜ μ—°μ‚° 쀑간 κ²°κ³Όλ₯Ό ν™•μΈν•˜μ—¬ 디버깅 ν•˜κ³ μžν•  λ•Œ μ‚¬μš©
      β €
    • 슀트림 λ‘κ°œ ν•©μΉ˜κΈ°
      concat() ➜ κ΄„ν˜Έ μ•ˆμ— ν•©μΉ  stream의 참쑰값듀을 λ„£μœΌλ©΄ 합쳐짐

3. μ΅œμ’… μ—°μ‚°

  • ν•œλ²ˆλ§Œ μ—°μ‚° κ°€λŠ₯ (일회용)

    μ£Όμš” λ©”μ„œλ“œ

    • μ—°μ‚° κ²°κ³Ό 확인
      forEach() ➜ νŒŒμ΄ν”„λΌμΈ λ§ˆμ§€λ§‰μ—μ„œ μš”μ†Œλ₯Ό ν•˜λ‚˜μ”© μ—°μ‚°
      β €
      맀칭
      match() ➜ Stream μš”μ†Œλ“€μ΄ νŠΉμ • 쑰건을 μΆ©μ‘±ν•˜λŠ”μ§€ 검사
      ( Predicate(ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€) λ°›μ•„μ„œ 쑰건 검사 ν›„, κ²°κ³Ό boolean으둜 λ°˜ν™˜ )
      ➜ allMatch() - λͺ¨λ“  μš”μ†Œ λ§Œμ‘±ν•˜λŠ”μ§€
      ➜ anyMatch() - μ΅œμ†Œ ν•˜λ‚˜λΌλ„ λ§Œμ‘±ν•˜λŠ”μ§€
      ➜ noneMatch() - λͺ¨λ“  μš”μ†Œ λ§Œμ‘±ν•˜μ§€ μ•ŠλŠ”μ§€
      β €
      집계
      sum() ➜ λͺ¨λ“  μš”μ†Œ 총 ν•©
      count() ➜ μš”μ†Œμ˜ 개수 ( long νƒ€μž…μ˜ 수 λ°˜ν™˜ )
      average() ➜ 평균 ( 각 κΈ°λ³Ένƒ€μž…μœΌλ‘œ λž˜ν•‘λœ(래퍼클래슀) Optional 객체 λ°˜ν™˜ )
      max() ➜ μ΅œλŒ€κ°’ ( κ°€μž₯ 큰 κ°’ κ°€μ§€λŠ” μš”μ†Œλ₯Ό μ°Έμ‘°ν•˜λŠ” Optional 객체 λ°˜ν™˜ )
      min() ➜ μ΅œμ†Œκ°’ ( κ°€μž₯ μž‘μ€ κ°’ κ°€μ§€λŠ” μš”μ†Œλ₯Ό μ°Έμ‘°ν•˜λŠ” Optional 객체 λ°˜ν™˜ )
      reduce()
      ➜ λˆ„μ ν•˜μ—¬ ν•˜λ‚˜λ‘œ 응좕(reduce)ν•˜λŠ” 방식
      ( μ•žμ˜ 두 μš”μ†Œμ˜ μ—°μ‚°κ²°κ³Όλ₯Ό λˆ„μ ν•˜μ—¬ λ‹€μŒ μš”μ†Œμ™€ μ—°μ‚° )
      ➜ μ΅œλŒ€ 3개 λ§€κ°œλ³€μˆ˜ 받을 수 있음
      collect()
      ➜ Stream의 μš”μ†Œλ“€μ„ List, Set, Map, λ“± λ‹€λ₯Έ μ’…λ₯˜μ˜ 결과둜 μˆ˜μ§‘ν•˜κ³  싢은 경우
      ➜ Stream μš”μ†Œλ“€μ„ μ–΄λ–»κ²Œ μˆ˜μ§‘ν•  것인가λ₯Ό μ •μ˜ν•œ Collector νƒ€μž…μ„ 인자둜 λ°›μŒ
      ➜ Collector μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 클래슀
      Ex. collect(Collectors.toList()) -> μ»¬λ ‰μ…˜ 쀑 List둜 μˆ˜μ§‘
      ( Collectors 객체의 toList() λ©”μ„œλ“œλ₯Ό 가져와 리슀트둜 λ§Œλ“ λ‹€ )
      Ex. collect(Collectors.toCollection(LinkedList::new)) -> LinkedList둜 μˆ˜μ§‘
      ( Collections 객체의 Collections μ—μ„œ LinkedList의 객체λ₯Ό 가져와 λ§Œλ“ λ‹€ )
      β €
      [μ°Έκ³ ] https://napasun-programming.tistory.com/39?category=743853

πŸ’¬ μ—¬κΈ°μ„œ λ‚΄κ°€ κΆκΈˆν–ˆλ˜ 점 !!
문제λ₯Ό ν’€ λ•Œ μ–΄λ–€ 애듀은 mapToIntλ₯Ό μ‚¬μš©ν•˜κ³  μ–΄λ–€ 애듀은 getAsIntλ₯Ό μ‚¬μš©ν•˜λ˜λ° κ·Έ 차이가 λ¬΄μ—‡μΌκΉŒ?
mapToInt - Stream 자체λ₯Ό IntStream(κΈ°λ³Έν˜• 슀트림)으둜 λ³€ν™˜ν•˜λŠ” 것 ( λ°˜λŒ€λŠ” mapToObj() / boxed() )
getAsInt - Optional클래슀의 결과값을 Int νƒ€μž…μœΌλ‘œ κ°€μ Έμ˜€λŠ” 것
β €
[μ°Έκ³ ] https://ryan-han.com/post/dev/java-stream/
[μ°Έκ³ ] https://wickies.tistory.com/14

πŸ’‘ peek( ) 와 forEach( )

  • 곡톡점
    μš”μ†Œλ₯Ό ν•˜λ‚˜μ”© 돌며 좜λ ₯ν•œλ‹€λŠ” 점
    β €
  • 차이점
    • peek()
      -> 쀑간 μ—°μ‚° λ©”μ„œλ“œ
      -> ν•˜λ‚˜μ˜ μŠ€νŠΈλ¦Όμ— μ—¬λŸ¬λ²ˆ μ‚¬μš© κ°€λŠ₯
    • forEach()
      -> μ΅œμ’… μ—°μ‚° λ©”μ„œλ“œ
      -> 일회용 호좜 (재호좜 ν•˜λ €λ©΄ μƒˆ 슀트림 λ§Œλ“€μ–΄μ•Όν•¨)

✏️ Optional< T >

  • T νƒ€μž… 객체의 래퍼(Wrapper) 클래슀
  • λͺ¨λ“  νƒ€μž…μ˜ 객체λ₯Ό 담을 수 μžˆλŠ” 래퍼(Wrapper) 클래슀인 Optional ν΄λž˜μŠ€μ— μ—°μ‚° κ²°κ³Όλ₯Ό λ‹΄μ•„ λ°˜ν™˜ν•˜μ—¬ NullPointerException(NPE)κ°€ λ°œμƒν•˜μ§€ μ•Šλ„λ‘ ν•˜λŠ” 것
  • λ³€ν™˜ν•  κ²°κ³Όκ°’λ‹ˆ μ—†μŒμ„ λͺ…ν™•ν•˜κ²Œ ν‘œν˜„ν•˜κΈ° μœ„ν•΄
  • orElse(κΈ°λ³Έκ°’) - Optional 객체에 μ €μž₯된 값이 null 일 λ•Œ 적은 κΈ°λ³Έκ°’ λ°˜ν™˜
  • orElseGet(νƒ€μž…::new) - Optional 객체에 μ €μž₯된 값이 null 일 λ•Œ 적은 객체 λ°˜ν™˜
  • getAsνƒ€μž…() 으둜 κ°’ μ–»μŒ

🌈 λŠλ‚€μ 

μ΄ν•΄ν•˜κΈ° νž˜λ“€μ—ˆμ§€λ§Œ μ½”λ“œλ₯Ό μ“°λ©΄μ„œ κ·Έλž˜λ„ μ‘°κΈˆμ”© μ΄ν•΄ν–ˆλ‹€ μ•„μ§κΉŒμ§€λŠ” stream의 μ‚¬μš©λ²•μ„ μ •ν™•νžˆλŠ” νŒŒμ•…ν•  수 μ—†μ§€λ§Œ νŽ˜μ–΄μ™€ 문제 ν’€λ©΄μ„œ μ΅ν˜€μ•Όκ² λ‹€!!

0개의 λŒ“κΈ€