Program Language/java

μ§€κΈˆκΉŒμ§€ λ‹Ήμ—°ν•˜κ²Œ μ“°λ˜ Java8, ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μœΌλ‘œ λ‹€μ‹œ μ΄ν•΄ν•˜κΈ°

κ°œλ°œν•˜λŠ” 주디씨 2023. 10. 11. 17:40

 

μžλ°” ν”„λ‘œκ·Έλž˜λ°μ€ μ΅μˆ™ν•˜μ§€λ§Œ Java 버전에 λŒ€ν•΄μ„œλŠ” λ¬΄μ§€ν–ˆλ˜ 것 κ°™λ‹€. 아무생각없이 μ•ˆμ •ν™”λœ 버전을 μ‚¬μš©ν•˜κ³ , 막상 ν•΄λ‹Ή λ²„μ „μ—μ„œ κ°–λŠ” νŠΉμ„±μ„ 이해해볼 생각은 ν•˜μ§€ μ•Šμ•˜λ‹€. 그럼 Java8은 μ–΄λ–€ νŠΉμ§•μ΄ μžˆμ„κΉŒ?

 

Lambda Expression

java8 λΆ€ν„°λŠ” λžŒλ‹€ν‘œν˜„식(λžŒλ‹€μ‹)을 μ§€μ›ν•©λ‹ˆλ‹€.

μ•„λ§ˆλ„ java8 이전버전을 μ‚¬μš©ν•˜μ‹œλ˜ 뢄이라면 λžŒλ‹€μ‹μ΄ μ΅μˆ™ν•˜μ§€ μ•ŠμœΌμ‹€ 수 μžˆλŠ”λ° 사싀 λžŒλ‹€μ‹, λ˜λŠ” λžŒλ‹€ν•¨μˆ˜λŠ” java8μ—μ„œ 처음 λ‚˜μ˜¨ κ°œλ…μ΄ μ•„λ‹™λ‹ˆλ‹€.

λžŒλ‹€μ‹μ€ μˆ˜ν•™ λžŒλ‹€ κ³„μ‚°λ²•μ—μ„œ μ‚¬μš©λœ μ‹μœΌλ‘œ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ‘œμ„œλŠ” LISP에 첫 λ„μž…μ΄ λ˜μ–΄ 이후 C#, Scala, Python λ“± ν˜„μž¬λŠ” λŒ€λΆ€λΆ„μ˜ μ–Έμ–΄μ—μ„œ μ§€μ›ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

λžŒλ‹€μ‹μ€ μ΅λͺ…ν•¨μˆ˜λ₯Ό μ§€μΉ­ν•˜λŠ” μš©μ–΄λ‘œμ„œ 말 κ·ΈλŒ€λ‘œ μ„ μ–Έλ˜μ–΄μžˆμ§€ μ•Šμ€ ν•¨μˆ˜λ₯Ό 자체적으둜 ν•¨μˆ˜ν™”ν•œ ν‘œν˜„μ‹μ„ λœ»ν•©λ‹ˆλ‹€. μ„€λͺ…μœΌλ‘œλ§Œ ν’€μ–΄ μ“°μžλ‹ˆ μ΄ν•΄ν•˜κΈ° νž˜λ“œμ‹€ 것 κ°™μ•„ 예제λ₯Ό 톡해 μ•Œμ•„λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

public String concat(String message1, String message2){
    return message1+message2;
}

μœ„μ—μ„œ μ„ μ–Έν•œ concat λ©”μ„œλ“œλŠ” 2개의 String parameterλ₯Ό λ°›μ•„ λΆ™μ—¬μ£ΌλŠ” λ©”μ„œλ“œ μž…λ‹ˆλ‹€. μœ„μ˜ λ©”μ„œλ“œλ₯Ό λžŒλ‹€μ‹μœΌλ‘œ ν‘œν˜„ν•˜μžλ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

(a,b)-> a+b

// (a,b) : parameter μ„ μ–Έ
// -> : parameter와 bodyλ₯Ό κ΅¬λΆ„ν•˜λŠ” κ΅¬λΆ„μž
// a+b : return κ°’

ν˜Ήμ€ λ‹€μŒκ³Ό 같이 ν‘œν˜„μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.

(a,b)->{return a+b;}

// (a,b) : parameter μ„ μ–Έ
// -> : parameter와 bodyλ₯Ό κ΅¬λΆ„ν•˜λŠ” κ΅¬λΆ„μž
// {return a+b;} : ν•¨μˆ˜ body

μœ„μ˜ 예제둜 μ•Œ 수 μžˆλ“―μ΄ λžŒλ‹€μ‹μ˜ κ°€μž₯ 큰 μž₯점은 μ½”λ“œκ°€ 맀-우 κ°„κ²°ν•΄μ§ˆ 수 μžˆλ‹€λŠ” μž₯점이 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ λͺ¨λ“  κ²½μš°μ—μ„œ μ΄λŸ¬ν•œ λžŒλ‹€μ‹μ„ μ‚¬μš© ν•  수 μžˆλŠ” 것은 μ•„λ‹™λ‹ˆλ‹€.

Functional Interface

μžλ°”μ—μ„œ λžŒλ‹€μ‹μ„ μ‚¬μš© κ°€λŠ₯ν•œκ²½μš°λŠ”, Functional Interface (ν•¨μˆ˜ν˜„ μΈν„°νŽ˜μ΄μŠ€)둜 μ„ μ–Έλ˜μ–΄μžˆλŠ” κ²½μš°μ—μ„œλ§Œ λžŒλ‹€μ‹μœΌλ‘œ ν‘œν˜„μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.

λ”°λΌμ„œ μ–΄λ–€ κ²½μš°μ— λžŒλ‹€μ‹ ν‘œν˜„μ„ μ‚¬μš©ν•˜λŠ”μ§€ μ•Œμ•„λ³΄κΈ° μœ„ν•΄ λ¨Όμ €, Functional Interface (ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€)에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λŠ” ν•˜λ‚˜μ˜ λ©”μ„œλ“œλ§Œμ„ κ°–λŠ” Interface μž…λ‹ˆλ‹€. λ‹€μŒμ€ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ 예제 μ½”λ“œμž…λ‹ˆλ‹€.

@FunctionalInterface
interface Concat{
	publicStringprocess(String message1,String message2);
}

μœ„μ˜ 예제λ₯Ό λ³΄μ‹œλ©΄ concat μΈν„°νŽ˜μ΄μŠ€λŠ” process ν•˜λ‚˜μ˜ λ©”μ„œλ“œλ§Œμ„ κ°–μŠ΅λ‹ˆλ‹€.

μœ„μ™€ 같은 쑰건을 λ§Œμ‘±ν•  λ•Œ, ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€λŠ” ν•¨μˆ˜ν˜•μΈν„°νŽ˜μ΄μŠ€μ˜ 쑰건에 μΆ©μ‘±ν•œλ‹€κ³  ν•  수 μžˆκ² μŠ΅λ‹ˆλ‹€.

μœ„μ™€κ°™μ€ μΈν„°νŽ˜μ΄μŠ€κ°€ μžˆμ„λ•Œ, μΌλ°˜μ μœΌλ‘œλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ κ΅¬ν˜„μ²΄λ₯Ό 직접 μž‘μ„±ν•˜μ—¬ ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν• μˆ˜λ„ μžˆκ² μ§€λ§Œ, λ‹€μŒκ³Ό 같은 λžŒλ‹€μ‹μ„ ν†΅ν•΄μ„œ ν‘œν˜„μ΄ κ°€λŠ₯ν•΄μ§‘λ‹ˆλ‹€.

public static void main(String[] args){
	Concat concatString=(m1, m2)-> m1+ m2;
	System.out.println(concatString.process("ν•˜λ‚˜","λ‘˜"));
}

ν•΄λ‹Ή 읡λͺ…ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜κ²Œ 되면 μ›ν•˜λŠ” 상황적 μ˜΅μ…˜μ— λ”°λΌμ„œ 결과값을 λ‹€λ₯΄κ²Œ λ„μΆœμ΄ κ°€λŠ₯ν•΄μ§‘λ‹ˆλ‹€.

public static void main(String[] args){

	Concat concatString=(m1, m2)-> m1+ m2;
	System.out.println(concatString.process("ν•˜λ‚˜","λ‘˜"));
	Concat concatSplitString=(m1, m2)-> m1+ ","+ m2;
	System.out.println(concatSplitString.process("ν•˜λ‚˜","λ‘˜"));
}

μœ„μ˜ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ©”μ„œλ“œν™”μ‹œν‚€λ©΄ λ‹€μŒκ³Ό 같이 ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°λ‹΅κ²Œ μ½”λ“œλ₯Ό κ΅¬ν˜„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

public static void main(String[] args){
	concat("ν•˜λ‚˜", "λ‘˜",(m1, m2)-> m1+ m2);
	concat("ν•˜λ‚˜", "λ‘˜",(m1, m2)-> m1+ ","+ m2);
}

public static void concat(String m1, string m2,Concat func){
	System.out.println(concatString.process(m1,m2));
}

java.util.function

javaμ—μ„œλŠ” λžŒλ‹€μ‹μ„ 더 νŽΈν•˜κ²Œ μ‚¬μš© ν•  수 μžˆλ„λ‘ μœ„μ™€κ°™μ΄ λ³„λ„μ˜ Functional Interfaceλ₯Ό μ„ μ–Έν•˜μ§€ μ•Šκ³  읡λͺ…ν•¨μˆ˜λ₯Ό μ‚¬μš©ν• μˆ˜ μžˆλ„λ‘ java.util.function λ‚΄μž₯ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

 

ꡉμž₯히 λ§Žμ€λ° μ–΄λ–€ interfaceκ°€ μžˆλŠ”μ§€λŠ” λ‹€μŒμ—..!

 

끝