Java & Kotlin

[Java] ๋žŒ๋‹ค์‹๊ณผ ์ŠคํŠธ๋ฆผ - (1) ๋žŒ๋‹ค์‹ ๊ธฐ๋ณธ

์žํ๋‹ˆ 2022. 3. 11. 04:04

0.๐Ÿšถ๋“ค์–ด๊ฐ€๋ฉฐ

์ž๋ฐ”๋Š” JDK1.5์—์„œ ์ถ”๊ฐ€๋œ ์ œ๋„ค๋ฆญ์œผ๋กœ ํ•œ ๋ฒˆ, JDK1.8์—์„œ ์ถ”๊ฐ€๋œ ๋žŒ๋‹ค์‹์˜ ๋“ฑ์žฅ์—์„œ ๋˜ ํ•œ ๋ฒˆ ํฐ ๋ณ€ํ™”๊ฐ€ ์ƒ๊ฒผ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋žŒ๋‹ค์‹์˜ ๋„์ž…์œผ๋กœ ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์˜€๋˜ ์ž๋ฐ”๋Š” ํ•จ์ˆ˜ํ˜• ์–ธ์–ด์˜ ๊ธฐ๋Šฅ๊นŒ์ง€ ๊ฐ–์ถ”๊ฒŒ ๋œ ๊ฒƒ์ด์ฃ .

 

๊ฐœ์ธ์ ์œผ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ Arrow Function๊ณผ ๊ณ ์ฐจ ํ•จ์ˆ˜๊ฐ€ ๋งค์šฐ ๋งˆ์Œ์— ๋“œ๋Š” ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์—ˆ๋Š”๋ฐ์š”. ์ž๋ฐ”์—์„œ๋„ ๋žŒ๋‹ค์‹๊ณผ ์ŠคํŠธ๋ฆผ์ด๋ผ๋Š” ๊ฐœ๋…์œผ๋กœ ๋น„์Šทํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์ค€๋‹ค๋Š” ์‚ฌ์‹ค์ด ๋งค์šฐ ๋ฐ˜๊ฐ€์› ๊ณ , ์ด๋ฅผ ์†Œ๊ฐœํ•˜๊ธฐ ์œ„ํ•ด ๊ธ€์„ ์จ๋ณด๋ คํ•ฉ๋‹ˆ๋‹ค. 


1.๐Ÿ“•๋žŒ๋‹ค์‹์ด๋ž€?

๋žŒ๋‹ค์‹์€ ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜๋‚˜์˜ "์‹"์œผ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŒŒ์ด์ฌ์ด๋‚˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ๋น„๊ตํ•œ๋‹ค๋ฉด ์ž๋ฐ”๋Š” ๋ฉ”์„œ๋“œ ํ•˜๋‚˜๋ฅผ ์ •์˜ํ•˜๋Š” ๊ณผ์ •์ด ์ƒ๋‹นํžˆ ๊ท€์ฐฎ์Šต๋‹ˆ๋‹ค. ๋žŒ๋‹ค์‹์€ ์ž๋ฐ”์˜ ๋ฉ”์„œ๋“œ ์ •์˜ ๊ณผ์ •์„ ๊ต‰์žฅํžˆ ๊ฐ„ํŽธํ•˜๊ฒŒ ํ•ด์ฃผ๊ณ , ์ ์ ˆํžˆ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๊ฐ€๋…์„ฑ ์—ญ์‹œ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋žŒ๋‹ค์‹์˜ ์˜ˆ์‹œ๋ฅผ ํ•˜๋‚˜๋งŒ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

// ๊ธฐ์กด ๋ฉ”์„œ๋“œ ์ •์˜ ๋ฐฉ์‹
int sum(int a, int b) {
    return a + b;
}

// ์œ„ ๋ฉ”์„œ๋“œ๋ฅผ ๋žŒ๋‹ค์‹์œผ๋กœ ๋ณ€๊ฒฝ
(a, b) -> a + b;

๋žŒ๋‹ค์‹์„ ๋ณด์‹œ๋ฉด ๊ธฐ์กด ๋ฐฉ์‹๋ณด๋‹ค ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•ด์ง„ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์กฐ๊ธˆ๋งŒ ์ต์ˆ™ํ•ด์ ธ๋„ ๊ฐ€๋…์„ฑ์ด ๊ธฐ์กด ๋ฐฉ์‹๋ณด๋‹ค ํ›จ์”ฌ ๋›ฐ์–ด๋‚ฉ๋‹ˆ๋‹ค. 

 

๋˜ํ•œ ๋žŒ๋‹ค์‹์œผ๋กœ ๋ณ€๊ฒฝํ•  ๋•Œ sum์ด๋ผ๋Š” ๋ฉ”์„œ๋“œ ์ด๋ฆ„๊ณผ ๋ฆฌํ„ด ํƒ€์ž…์ด ์‚ฌ๋ผ์กŒ๋Š”๋ฐ ์ด๋Ÿฌํ•œ ์ด์œ ์—์„œ ๋žŒ๋‹ค์‹์„ "์ต๋ช… ํ•จ์ˆ˜"๋ผ๊ณ ๋„ ๋ถ€๋ฆ…๋‹ˆ๋‹ค.


2.โœ๋žŒ๋‹ค์‹ ์ž‘์„ฑํ•˜๋Š” ๋ฒ•

์œ„ ์˜ˆ์‹œ์—์„œ ์‚ด์ง ์‚ดํŽด๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ ๋žŒ๋‹ค์‹์„ ์ž‘์„ฑํ•˜๋Š” ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๋ฉ”์„œ๋“œ์—์„œ ์ด๋ฆ„๊ณผ ๋ฆฌํ„ด ํƒ€์ž…์„ ์ œ๊ฑฐํ•ด์ค๋‹ˆ๋‹ค.
  2. ์„ ์–ธ๋ถ€ ๋ฐ”๋กœ ๋’ค์— -> ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค.

์ฝ”๋“œ๋กœ ํ•œ ๋ฒˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

// ๊ธฐ์กด ๋ฐฉ์‹์˜ ๋ฉ”์„œ๋“œ
int max(int a, int b) {
	return a > b ? a : b;
}

// ๋žŒ๋‹ค์‹ ๋ณ€ํ™˜ - (1) ๊ธฐ๋ณธ ๋ฐฉ์‹
(int a, int b) -> { return a > b ? a : b; }


// ๋žŒ๋‹ค์‹ ๋ณ€ํ™˜ - (2) return๋ฌธ ๋Œ€์‹  ์‹์œผ๋กœ ๋Œ€์ฒด
// ์‹์˜ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๊ฐ€ ์ž๋™์ ์œผ๋กœ ๋ฆฌํ„ด๊ฐ’์ด ๋œ๋‹ค.
(int a, int b) -> a > b? a : b


// ๋žŒ๋‹ค์‹ ๋ณ€ํ™˜ - (3) ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํƒ€์ž… ์ƒ๋žต
// ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํƒ€์ž…์ด ์ถ”๋ก  ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ์ƒ๋žต๊ฐ€๋Šฅ -> ๋Œ€๋ถ€๋ถ„ ์ƒ๋žต ๊ฐ€๋Šฅ
(a, b) -> a > b ? a : b

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Arrow Function์— ์ต์ˆ™ํ•˜์‹œ๋‹ค๋ฉด ๋งค์šฐ ์นœ์ˆ™ํ•œ ํ˜•ํƒœ์ด์‹ค ๊ฒƒ์ด๊ณ , ์ต์ˆ™ํ•˜์ง€ ์•Š์œผ์‹œ๋”๋ผ๋„ ๋žŒ๋‹ค์‹ ๋ณ€ํ™˜ ๋ฐฉ์‹์„ ์œ„๋ถ€ํ„ฐ ์ฐจ๊ทผ์ฐจ๊ทผ ์‚ดํŽด๋ณด์‹œ๋ฉด ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต์ง€ ์•Š์œผ์‹ค ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!


3.๐Ÿ“šํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค

๋žŒ๋‹ค์‹์€ ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋ฐ€์ ‘ํ•œ ๊ด€๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ธฐ ์ „ ๋žŒ๋‹ค์‹์˜ ์ •์ฒด๋ถ€ํ„ฐ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์ž๋ฐ”๋Š” ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์—์„œ ํ•จ์ˆ˜ํ˜• ์–ธ์–ด๊ฐ™์€ ํ‘œํ˜„ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ ์ด์œ ๊ฐ€ ๋ญ˜๊นŒ์š”? ์ง€๊ธˆ๊นŒ์ง€ ๋žŒ๋‹ค์‹์ด ๋ฉ”์„œ๋“œ์™€ ๋™๋“ฑํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์„ค๋ช…ํ•ด์™”๋Š”๋ฐ ์‚ฌ์‹ค ๋žŒ๋‹ค์‹์€ ์ต๋ช… ๊ตฌํ˜„ ๊ฐ์ฒด์™€ ๋™๋“ฑํ•ฉ๋‹ˆ๋‹ค. 

 

์ฝ”๋“œ๋กœ ์‚ดํŽด๋ณด์ฃ .

(a, b) -> a > b ? a : b

์œ„์™€ ๊ฐ™์€ ๋žŒ๋‹ค์‹์„ ํ˜ธ์ถœํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ์š”..? ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๋ฉด ์ฐธ์กฐํƒ€์ž…์ด ์žˆ์–ด์•ผํ•˜๊ณ  ๊ทธ ์ฐธ์กฐ ํƒ€์ž…์„ ํ†ตํ•ด ๋ฉ”์„œ๋“œ ์ด๋ฆ„์œผ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๊ฒŒ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ๋žŒ๋‹ค์‹์— ๊ทธ ๋ฐฉ์‹์„ ์ ์šฉํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ด๋ด…์‹œ๋‹ค.

ํƒ€์ž… f = (a, b) -> a > b ? a : b

 ์œ„์™€ ๊ฐ™์ด ์จ์ฃผ๊ณ  ์‹ถ์€๋ฐ f์˜ ํƒ€์ž…์„ ์–ด๋–ป๊ฒŒ ํ•ด์ฃผ์–ด์•ผํ•  ์ง€ ๋‹ต์ด ๋‚˜์˜ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ฐธ์กฐํ˜• ํƒ€์ž…์ด๋‹ˆ ํด๋ž˜์Šค๊ฑฐ๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํ›„๋ณด๊ตฐ์ด ๋  ์ˆ˜ ์žˆ๊ฒ ์ฃ ? ์ด๋•Œ ๋งŒ์•ฝ ํƒ€์ž…์ด ์ธํ„ฐํŽ˜์ด์Šค์ด๊ณ  ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค์— ๊ตฌํ˜„ํ•ด์•ผํ•  ๋ฉ”์„œ๋“œ๊ฐ€ ํ•˜๋‚˜์ธ ๊ฒฝ์šฐ๋ผ๋ฉด ์–ด๋–จ๊นŒ์š”? ์œ„์—์„œ ๋งํ–ˆ๋˜ ์ต๋ช… ๊ตฌํ˜„ ๊ฐ์ฒด์™€ ๋™๋“ฑํ•˜๋‹ค๋ผ๋Š” ๋ง์ด ์—ฌ๊ธฐ์„œ ์ข€ ๋” ๊ตฌ์ฒดํ™”๋ฉ๋‹ˆ๋‹ค. 

 

์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌํ˜„ํ•  ๋ฉ”์„œ๋“œ๊ฐ€ ํ•˜๋‚˜์ธ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค.

interface MyInterface {
	public abstract int max(int a, int b);
}

์œ„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ์ต๋ช… ๊ตฌํ˜„ ํด๋ž˜์Šค๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

MyInterface f = new MyInterface() {
	public int max(int a, int b) {
    	return a > b ? a : b;
    }
}

int bigger = f.max(5, 3); // ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ

 

์œ„ ์ฝ”๋“œ์€ ๋žŒ๋‹ค์‹์„ ์ด์šฉํ•ด ์•„๋ž˜์ฒ˜๋Ÿผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

MyInterface f = (a, b) -> a > b ? a : b;
int bigger = f.max(5, 3);

์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ์ด์œ ๊ฐ€ ๋ฐ”๋กœ ๋žŒ๋‹ค์‹์ด ์‹ค์ œ๋กœ๋Š” ์ต๋ช… ๊ตฌํ˜„ ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๋žŒ๋‹ค์‹์—์„œ ๋ฉ”์„œ๋“œ ์ด๋ฆ„, ๋งค๊ฐœ ๋ณ€์ˆ˜์˜ ํƒ€์ž…, ๋ฆฌํ„ด ๊ฐ’์„ ์ƒ๋žตํ•ด๋„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋„ ๊ตฌํ˜„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

์ด์ฒ˜๋Ÿผ ์ž๋ฐ”์—์„œ๋Š” ๊ตฌํ˜„ํ•  ๋ฉ”์„œ๋“œ๊ฐ€ ํ•˜๋‚˜์ธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•ด์„œ ๋žŒ๋‹ค์‹์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๊ณ  ์ด ๋•Œ, ๋žŒ๋‹ค์‹์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฐ”๋กœ ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

์•„๋ž˜์™€ ๊ฐ™์ด @FunctinalInterface ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ์ฃผ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ ์ ˆํžˆ ์ •์˜ํ•ด์ฃผ์—ˆ๋Š”์ง€ ์ฒดํฌํ•ด์ฃผ๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

@FunctionalInterface
interface MyInterface {
	public abstract int max(int a, intb);
}

4.๐Ÿ’จ๋‚˜๊ฐ€๋ฉฐ

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ๋žŒ๋‹ค์‹์˜ ๊ธฐ๋ณธ ๊ฐœ๋…์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ž๋ฐ”์˜ ๊ธฐ์กด ์„ฑ์งˆ์„ ๊นจ์ง€ ์•Š๊ณ  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด ๋žŒ๋‹ค์‹์ด๋ผ๋Š” ํ•จ์ˆ˜ํ˜• ์–ธ์–ด์˜ ํŠน์ง•์„ ๊ฐ€์ ธ์™”๋‹ค๋Š” ๊ฒƒ์ด ๋งค์šฐ ๋†€๋ผ์šด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

ํŽธ๋ฆฌํ•จ์„ ๋งŽ์ด ์ œ๊ณตํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ธ๋งŒํผ ์ž˜์•Œ์•„๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค๊ณ  ๊ธฐํšŒ๊ฐ€ ๋˜๋ฉด ์ถ”ํ›„ ๊ฐ™์€ ์ฃผ์ œ๋กœ ๊ธ€์„ ๋” ์จ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

๋ฐ˜์‘ํ˜•