DevLog ๐Ÿ˜ถ

[๋ชจ๋˜์ž๋ฐ”์ธ์•ก์…˜] ๋™์ž‘ ํŒŒ๋ผ๋ฏธํ„ฐํ™” : ๋™์ž‘ ์ž์ฒด๋ฅผ ์ „๋‹ฌํ•ด๋ณด์ž! ๋ณธ๋ฌธ

๐Ÿ“–/Modern Java in Action

[๋ชจ๋˜์ž๋ฐ”์ธ์•ก์…˜] ๋™์ž‘ ํŒŒ๋ผ๋ฏธํ„ฐํ™” : ๋™์ž‘ ์ž์ฒด๋ฅผ ์ „๋‹ฌํ•ด๋ณด์ž!

dolmeng2 2023. 2. 27. 01:13

๐Ÿ’ฌ ๋ชจ๋˜ ์ž๋ฐ” ์ธ ์•ก์…˜ ์ฑ•ํ„ฐ 2์„ ์ฝ๊ณ  ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค. 

 


โœ”๏ธ ๋™์ž‘ ํŒŒ๋ผ๋ฏธํ„ฐํ™”

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

์–ด๋Š ๋‚ , ํฌ๋น„๊ฐ€ ์šฐํ…Œ์ฝ” ๊ณต์ง€์‚ฌํ•ญ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋˜์ ธ์ฃผ์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

 

๐Ÿ’ฌ ๋ฐฑ์—”๋“œ ํฌ๋ฃจ ์ค‘์— 25์‚ด ์ดํ•˜์ธ ํฌ๋ฃจ๋งŒ ๋ณด๊ณ  ์‹ถ์€๋ฐ, ๋ชจ์—ฌ ์ฃผ์„ธ์š”.

 

๊ทธ๋Ÿฌ์ž ๋„ค์˜ค๊ฐ€ ์™€์„œ ๋งํ–ˆ๋‹ค.

๐Ÿ’ฌ ์•„๋‹ˆ์—์š”, ํ”„๋ก ํŠธ์—”๋“œ ํฌ๋ฃจ ์ค‘์—์„œ 23์‚ด ์ด์ƒ์ธ ํฌ๋ฃจ๋งŒ ์™€์ฃผ์„ธ์š”.

 

์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์šฐ๋ฆฌ๋Š” ๋ณ€ํ™”ํ•˜๋Š” ์š”๊ตฌ์‚ฌํ•ญ ์†์—์„œ ์œ ๋™์ ์œผ๋กœ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

๊ฐ€์žฅ ๋จผ์ €, ๊ทธ๋ƒฅ ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž๋„๋ก ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์†์„ฑ์— ๋Œ€ํ•ด์„œ ์ „๋ถ€ ์‹œ๋„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

 

1) ๋ฐฑ์—”๋“œ ํฌ๋ฃจ๋ฉด์„œ 25์‚ด ์ดํ•˜์ธ ํฌ๋ฃจ ๋ชจ์œผ๊ธฐ

2) ํ”„๋ก ํŠธ์—”๋“œ ํฌ๋ฃจ๋ฉด์„œ 23์‚ด ์ดํ•˜์ธ ํฌ๋ฃจ ๋ชจ์œผ๊ธฐ

3) ์•ˆ๋“œ๋กœ์ด๋“œ ํฌ๋ฃจ๋ฉด์„œ... (etc)

๋ฟŒ๋“ฏํ•œ ๋งˆ์Œ์œผ๋กœ ๋ชจ๋“  ์กฐ๊ฑด์— ๋Œ€ํ•ด์„œ ๋Œ€์‘์„ ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์ด๋•Œ ์ง€๋‚˜๊ฐ€๋˜ ๋ฆฌ์‚ฌ๊ฐ€ ์™€์„œ ๋ง์„ ๊ฑด๋„จ๋‹ค.

 

๐Ÿ’ฌ ์–ด, ๋‚ด์ผ์€ ๋ฐฑ์—”๋“œ ํฌ๋ฃจ ์ค‘์—์„œ ์ด๋ฆ„์— 'ใ…ˆ'์ด ๋“ค์–ด๊ฐ€๋Š” ํฌ๋ฃจ๋“ค๋งŒ ๋ชจ์—ฌ ์ฃผ์„ธ์š”!

 

๊ฒฐ๊ตญ, ๋‚ด์ผ๋„ ๋น„์Šทํ•œ ๋กœ์ง์„ 100๊ฐœ ์“ฐ๋ฉด์„œ ์นผํ‡ด๋ฅผ ๋ชปํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค ๐Ÿคฏ

 

๐Ÿ’ก ๋น„์Šทํ•œ ์ฝ”๋“œ๊ฐ€ ๋ฐ˜๋ณตํ•ด์„œ ์กด์žฌํ•œ๋‹ค๋ฉด, ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์ถ”์ƒํ™”ํ•˜์ž.

ํ˜„์žฌ์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ƒ๊ฐํ•ด๋ณด์ž. ์šฐ์„ , ์šฐ๋ฆฌ์˜ ๋Œ€์žฅ ํฌ๋น„์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋งŒ์กฑํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐ๊ฑด์„ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

1) ๋ฐฑ์—”๋“œ ํฌ๋ฃจ๋ผ๋ฉด ํ†ต๊ณผ, ์•„๋‹ˆ๋ผ๋ฉด ๋•ก!
2) 25์‚ด ์ดํ•˜์ธ ํฌ๋ฃจ๋ผ๋ฉด ํ†ต๊ณผ, ์•„๋‹ˆ๋ผ๋ฉด ๋•ก!

 

์šฐ๋ฆฌ๋Š” ์œ„ ๋ฌธ์žฅ์„ ๋ณด๊ณ  ๋ฌด์–ธ๊ฐ€ ์ค‘๋ณต๋˜๋Š” ๊ฑธ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. '~๋ผ๋ฉด ํ†ต๊ณผ, ~๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๋•ก!' ์ฆ‰, ๋‘ ์กฐ๊ฑด ๋ชจ๋‘ ์ฐธ๊ณผ ๊ฑฐ์ง“์— ๋Œ€ํ•ด์„œ ๋ฐ˜ํ™˜์„ ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ฐธ๊ณผ ๊ฑฐ์ง“์ด๋ผ๊ณ  ํ•˜๋ฉด ๋ฌด์–ธ๊ฐ€๊ฐ€ ์ƒ๊ฐ๋‚œ๋‹ค. ๋ฐ”๋กœ, boolean ๊ฐ’์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ , ์ž๋ฐ”์—์„œ๋Š” ์ฐธ/๊ฑฐ์ง“์— ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•ด, ๊ฝค๋‚˜ ๋ฉ‹์ง„ ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค. 

@FunctionalInterface
public interface Predicate<T> {
        boolean test(T t);
        }

๋ฌผ๋ก , ์ด ์นœ๊ตฌ์— ๋Œ€ํ•ด ์ง€๊ธˆ์€ ๋ชฐ๋ผ๋„ ๋œ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด ์นœ๊ตฌ๋ฅผ ๋ชจ๋ฐฉํ•ด์„œ 'CrewPredicate'๋ผ๋Š” ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ด๋‹ค. ์šฐ๋ฆฌ๋Š” ํ˜„์žฌ 'ํฌ๋ฃจ'์— ๋Œ€ํ•ด์„œ '๋ฌด์Šจ๋ฌด์Šจ ์กฐ๊ฑด์œผ๋กœ ํ•„ํ„ฐ๋ง!'์„ ํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, ํฌ๋ฃจ๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„์„œ ํ•„ํ„ฐ๋ง ์กฐ๊ฑด์€ ๋‚ด๋ถ€ ๊ตฌํ˜„์ฒด์—๊ฒŒ ๋งก๊ธฐ๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์„ค๊ณ„๋ฅผ ์ง„ํ–‰ํ•  ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿผ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 

public interface CrewPredicate {
    boolean test (Crew crew);
}

์ด ์นœ๊ตฌ๋Š” ์ด์ œ, ์ธ์ž๋กœ ๋“ค์–ด์˜จ Crew์— ๋Œ€ํ•ด์„œ ํŒ๋‹จํ•˜๊ณ , ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด์„œ ์„ ํƒ ์กฐ๊ฑด์— ๋Œ€ํ•ด ๊ตฌ์ฒดํ™”๋ฅผ ์ง„ํ–‰ํ•  ๊ฒƒ์ด๋‹ค. ์šฐ๋ฆฌ์˜ ํ˜„์žฌ ์กฐ๊ฑด์ธ '๋ฐฑ์—”๋“œ ํฌ๋ฃจ'์™€ '25์‚ด ์ดํ•˜์ธ ํฌ๋ฃจ'๋ฅผ ๋ฝ‘๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 

// ๋ฐฑ์—”๋“œ ํฌ๋ฃจ๋ฅผ ๋ฝ‘๋Š” ํด๋ž˜์Šค.
public class BackendCrewPredicate implements CrewPredicate {
    public boolean test(Crew crew) {
        return crew.getCourse.equals(BACKEND);
    }
}

// 25์‚ด ์ดํ•˜์ธ ํฌ๋ฃจ๋ฅผ ๋ฝ‘๋Š” ํด๋ž˜์Šค.
public class AgeCrewPredicate implements CrewPredicate {
    public boolean test(Crew crew) {
        return crew.getAge() <= 25;
    }
}

์œ„ ์ƒํ™ฉ์— ๋งž์ถฐ์„œ ๋‹ค์–‘ํ•œ ๋™์ž‘์„ ์‹คํ–‰ํ•˜๊ณ  ์žˆ๋‹ค. "์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋™์ž‘์„ ์‹คํ–‰ํ•ด?" -> ๋งž๋‹ค, ์ „๋žต ํŒจํ„ด์ด๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด์„œ ์šฐ๋ฆฌ๋Š” '์กฐ๊ฑด์€ ๋ชจ๋ฅด๊ฒ ๊ณ , ๊ทธ๋ƒฅ ๋งž๋Š”์ง€ ์•„๋‹Œ์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ค„ ๊ฑฐ์•ผ!'๋ผ๋Š” ๊ฒƒ๋งŒ ์„ ์–ธํ•ด๋‘๊ณ , ๋‚ด๋ถ€์ ์ธ ๋กœ์ง์€ ๊ตฌํ˜„์ฒด์—๊ฒŒ ์œ„์ž„ํ•˜์—ฌ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋ฐฑ์—”๋“œ ํฌ๋ฃจ๋„ ๋ฝ‘๊ณ , 25์‚ด ์ดํ•˜์ธ ํฌ๋ฃจ๋„ ๋ฝ‘์„ ์ˆ˜ ์žˆ๋„๋ก '๊ฐˆ์•„๋ผ์šฐ๋Š”' ๋กœ์ง์„ ๋งŒ๋“ค์–ด๋‚ธ ๊ฒƒ์ด๋‹ค.

 

์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ์กฐ๊ธˆ ๋” ๋ฉ‹์ง„ ๋ง๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’ก ๊ฐ๊ฐ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ '์บก์Šํ™”'ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํŒจ๋ฐ€๋ฆฌ๋ฅผ ์ •์˜ํ•˜๊ณ , ๋Ÿฐํƒ€์ž„์— ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ ํƒํ•˜๊ฒŒ ๋งŒ๋“ค์ž.

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์บก์Šํ™”๋ฅผ ์ง„ํ–‰ํ–ˆ์œผ๋ฉฐ, CrewPredicate๊ฐ€ ์ผ์ข…์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํŒจ๋ฐ€๋ฆฌ๋‹ค. ๊ทธ๋ฆฌ๊ณ  BackendCrewPredicate / AgeCrewPredicate๊ฐ€ ์ผ์ข…์˜ ์ „๋žต์ด ๋œ๋‹ค.

 

์šฐ๋ฆฌ๋Š” ์ด์ œ, ์ด๋Ÿฌํ•œ ์ „๋žต์„ ๋™์ ์œผ๋กœ ๋ฐ›์•„์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

// ์ธ์ž๋กœ ๋“ค์–ด์˜จ predicate์˜ ๊ตฌ์ฒด ํด๋ž˜์Šค์— ๋Œ€ํ•ด์„œ ํ•„ํ„ฐ ์กฐ๊ฑด์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.
public List<Crew> filterCrews(List<Crew> crews, CrewPredicate p) {
        List<Crew> resultCrews = new ArrayList<>();
        for (Crew crew : crews) {
        if (p.test(crew) {
        resultCrews.add(crew);
        }
        }
        }

์šฐ๋ฆฌ๋Š” ์ด์ œ, '๋ฐฑ์—”๋“œ ํฌ๋ฃจ๋ฅผ ๋ฝ‘๋Š” ๊ฒƒ', '25์‚ด ์ดํ•˜์ธ ํฌ๋ฃจ๋ฅผ ๋ฝ‘๋Š” ๊ฒƒ' ๊ฐ™์€ ์–ด๋– ํ•œ '๋™์ž‘' ์ž์ฒด๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•ด์ค„ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. ์ด๋•Œ, ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ฒด๊ฐ€ ์ž์œ ๋กญ๊ฒŒ ๋“ค์–ด์™€์„œ ์ „๋žต์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“  ๊ฒƒ์ด๋‹ค.

 

ํ•˜์ง€๋งŒ, ์œ„ ์ฝ”๋“œ๋„ ๋ฌด์–ธ๊ฐ€ ๋ถˆํŽธํ•˜๋‹ค. ์šฐ๋ฆฌ๋Š” ์ง€๊ธˆ ํฌ๋น„์˜ ์š”๊ตฌ์‚ฌํ•ญ๋งŒ ๋งŒ์กฑํ•˜๋Š” ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์—ˆ์„ ๋ฟ์ด๋‹ค. ๋„ค์˜ค์˜ ์š”๊ตฌ์‚ฌํ•ญ์ธ 'ํ”„๋ก ํŠธ์—”๋“œ ํฌ๋ฃจ'๋‚˜ '23์‚ด ์ด์ƒ์˜ ํฌ๋ฃจ', '์ด๋ฆ„์— ใ…ˆ์ด ๋“ค์–ด๊ฐ€๋Š” ํฌ๋ฃจ' ๋“ฑ, ์š”๊ตฌ์‚ฌํ•ญ์ด ๋งŽ์•„์ง„๋‹ค๋ฉด ํ•ด๋‹น ์š”๊ตฌ์‚ฌํ•ญ ๊ฐ๊ฐ์— ๋งž๋Š” ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ๋˜ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ท€์ฐฎ์Œ์ด ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋Š” ์ด๋ฅผ ์ฐธ์„ ์ˆ˜ ์—†๋‹ค.

 


 

 โœ”๏ธ ๋ฆฌํŒฉํ„ฐ๋ง ์ง„ํ–‰ํ•˜๊ธฐ - ์ต๋ช… ํด๋ž˜์Šค!

์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ด๋ฅผ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์„๊นŒ? ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—†์„๊นŒ? ๋ฐ”๋กœ, ํด๋ž˜์Šค์˜ ์„ ์–ธ๊ณผ ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ๋™์‹œ์— ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” '์ต๋ช… ํด๋ž˜์Šค'๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ต๋ช… ํด๋ž˜์Šค๋Š” ์ด๋ฆ„์ด ์—†๋Š” ํด๋ž˜์Šค์ด๋‹ค. ํด๋ž˜์Šค๋ช…์— ๋Œ€ํ•œ ๋„ค์ด๋ฐ์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•  ํ•„์š”๋„ ์—†์œผ๋ฉฐ, ๋„ค์ด๋ฐ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์™ธ๋ถ€์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์–ด ๋”ฑ 1๋ฒˆ๋งŒ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. 

// ๋ฆฌํŒฉํ„ฐ๋ง ์ด์ „์˜ ์ฝ”๋“œ, ๊ธฐ์กด์—๋Š” ์ด๋Ÿฐ ์‹์œผ๋กœ ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•ด์ฃผ์—ˆ๋‹ค.
List<Crew> backendCrews = filterCrews(crews, new BackendCrewPredicate());
        List<Crew> ageCrews = filterCrews(crews, new AgeCrewPredicate());

// ์ต๋ช… ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•ด๋ณด์ž!
// CrewPredicate๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.
        List<Crew> backendCrews = filterCrews(crews, new CrewPredicate() {
@Override
public boolean test(Crew crew) {
        return crew.getCourse.equals(BACKEND);
        }
        });

        List<Crew> ageCrews = filterCrews(crews, new CrewPredicate() {
@Override
public boolean test(Crew crew) {
        return crew.getAge() <= 25;
        }
        });

์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด, CrewPredicate ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ฒด๋ฅผ ๋ฐ”๋กœ ์ธ์ž ๋‚ด์—์„œ ๊ตฌํ˜„ํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ์œ„ ์ฝ”๋“œ ์—ญ์‹œ ์—ฌ์ „ํžˆ ๋ถˆํŽธํ•˜๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฑด ๋‚ด๋ถ€์˜ ํ•„ํ„ฐ๋ง ์กฐ๊ฑด์ด์ง€๋งŒ, public boolean test() {...} ๊ฐ™์ด ๋ฉ”์„œ๋“œ ์„ ์–ธ์„ ์œ„ํ•œ ์ฝ”๋“œ๊ฐ€ ๊ณ„์†ํ•ด์„œ ๋”ฐ๋ผ ๋ถ™๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์ง€๋ฉด ๊ฐœ๋ฐœ์ž๋Š” ์ฝ๊ณ  ์‹ถ์ง€๊ฐ€ ์•Š์•„์ง„๋‹ค. ๋˜ํ•œ, ์•ž์„œ ๋งํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์žฌ์‚ฌ์šฉ๋„ ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 


 โœ”๏ธ ๋ฆฌํŒฉํ„ฐ๋ง ์ง„ํ–‰ํ•˜๊ธฐ - ๋žŒ๋‹ค

์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๋” ์งง๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ์„๊นŒ? ์šฐ๋ฆฌ๋Š”, ๋‹ค๋ฅธ ๊ฑด ๋‹ค ํ•„์š”์—†๊ณ  ์˜ค์ง ์กฐ๊ฑด์— ๋Œ€ํ•œ '๋™์ž‘'๋งŒ ํ•„์š”ํ•˜๋‹ค. test ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ๊ฑด ๋ณ„๋กœ ์•Œ๊ณ  ์‹ถ์ง€ ์•Š๊ณ , ๊ทธ๋ƒฅ 'crew.getAge() <= 25'๋ผ๋Š” ํ•„ํ„ฐ๋ง ํ–‰์œ„๋งŒ ํ•„์š”ํ•œ ๊ฒƒ์ด๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด '๋žŒ๋‹ค ํ‘œํ˜„์‹'์ด๋ผ๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

// ๋žŒ๋‹ค ์‚ฌ์šฉํ•˜๊ธฐ
List<Crew> backendCrews = filterCrews(crews, (Crew crew) ->
        crew.getCourse.equals(BACKEND)
        );

        List<Crew> ageCrews = filterCrews(crews, (Crew crew) ->
        crew.getAge() <= 25
        );

๋†€๋ž๊ฒŒ๋„, ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜๊ณ  ๋‚˜๋‹ˆ ํฌ๋ฃจ์— ๋Œ€ํ•œ ์กฐ๊ฑด์ด ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณด์ด๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ˜„์žฌ '๋™์ž‘' ์— ๋Œ€ํ•ด์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ฒจ์ค€ ๊ฒƒ์ด๋‹ค! ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ '๋™์ž‘ ํŒŒ๋ผ๋ฏธํ„ฐํ™”'๋ฅผ ํ†ตํ•ด ์œ ์—ฐ์„ฑ์„ ๋†’์ด๊ณ , ๋žŒ๋‹ค๋ฅผ ํ†ตํ•ด์„œ ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ‹์ง„ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋œ ๊ฒƒ์ด๋‹ค.

 


โœ”๏ธ ์ œ๋„ค๋ฆญ ํ™œ์šฉํ•˜๊ธฐ

์šฐ๋ฆฌ๋Š” ์ด์ œ ๋™์ž‘์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์€ ๋๋‚ฌ๋‹ค. ํ•˜์ง€๋งŒ, ๋งŒ์•ฝ ํฌ๋ฃจ๊ฐ€ ์•„๋‹Œ ์ฝ”์น˜์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ํ•„ํ„ฐ๋งํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ข‹์„๊นŒ? ๋™์ž‘์˜ ๋Œ€์ƒ์— ๋Œ€ํ•ด์„œ๋„ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๋งŒ๋“ค๋ฉด ์–ด๋–จ๊นŒ?๐Ÿค” ๊ธฐ์กด์— ๋งŒ๋“  CrewPredicate๋Š” ํฌ๋ฃจ์— ๋Œ€ํ•œ ์กฐ๊ฑด ํŒ๋‹จ์„ ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค์˜€๊ธฐ ๋•Œ๋ฌธ์—, ์ž๋ฐ”์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” Predicate<T>๋ฅผ ์ด์šฉํ•ด๋ณด์ž. ๋˜ํ•œ, ์ œ๋„ค๋ฆญ์„ ํ™œ์šฉํ•˜์—ฌ ํฌ๋ฃจ๋“ , ์ฝ”์น˜๋“  ๋Œ€์ƒ์— ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๊ณ  ์กฐ๊ฑด ํ•„ํ„ฐ๋ง์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด๋ณด์ž!

public interface Predicate<T> {
        boolean test(T t);
        }

public static <T> List<T> filter(List<T> list, Predicate<T> p) {
        List<T> result = new ArrayList<>();
        for(T e: list) {
        if(p.test(e)) {
        result.add(e);
        }
        }
        return result;
        }

์ด๋ ‡๊ฒŒ ์ œ๋„ค๋ฆญ์„ ํ™œ์šฉํ•˜์—ฌ ์ถ”์ƒํ™”๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด ํฌ๋ฃจ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ฝ”์น˜, ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ๊ฒƒ๋“ค์— ๋Œ€ํ•ด์„œ๋„ ํ•„ํ„ฐ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด์ œ ํ™•์žฅ์„ฑ๊นŒ์ง€ ๊ฐ–์ถ”๊ฒŒ ๋œ ๊ฒƒ์ด๋‹ค ๐Ÿ‘

 

 

๐Ÿ’ก ๋ฉ”์„œ๋“œ ์ฐธ์กฐ vs ๋žŒ๋‹ค์‹

ํ”ํžˆ ๋ฉ”์„œ๋“œ ์ฐธ์กฐ์™€ ๋žŒ๋‹ค์‹์„ ๋งŽ์ด ๋น„๊ตํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค. ์ง€๋‚œ ์ฑ•ํ„ฐ1์—์„œ๋Š” ๋ฉ”์„œ๋“œ ์ฐธ์กฐ๋ฅผ ๋‹ค๋ฃจ์—ˆ๋Š”๋ฐ, ์šฐ๋ฆฌ๋Š” ๋žŒ๋‹ค์‹์—์„œ ๋ฉ”์„œ๋“œ ์ฐธ์กฐ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋” ์งง๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์œ„ ์ฝ”๋“œ์—์„œ ๋žŒ๋‹ค์‹์„ ํ™œ์šฉํ•˜์—ฌ ํ˜ธ์ถœํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

public static void main(String[] args) {
        List<Crew> crews = new ArrayList<>();
        filter(crews, (Crew crew) -> crew.getAge() <= 25);
        }

        ...

ํ•˜์ง€๋งŒ, ๋งŒ์•ฝ ๋‚˜์ด์— ๋Œ€ํ•œ ์กฐ๊ฑด์„ ์žฌ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ๊ทธ๋ฆฌ๊ณ  '๋ฉ”์„œ๋“œ๋ช…์„ ํ†ตํ•ด์„œ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•ด๋‹น ์กฐ๊ฑด์„ ๋‚˜ํƒ€๋‚ด๊ณ  ์‹ถ๋‹ค๋ฉด' ๋ฉ”์„œ๋“œ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ํ•˜๋‚˜์˜ ๋ฐฉ๋ฒ•์ด๋‹ค. (ํ˜น์€, ๋žŒ๋‹ค ๋‚ด๋ถ€์˜ ๊ตฌํ˜„์‹์ด ๋„ˆ๋ฌด ๊ธธ์–ด๋„ ๋ฉ”์„œ๋“œ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ํ•˜๋‚˜์˜ ๋ฐฉ๋ฒ•์ด ๋œ๋‹ค.) ๋ฉ”์„œ๋“œ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฉ”์„œ๋“œ ์ฐธ์กฐ์— ๋Œ€ํ•œ ์„ค๋ช…์€ ์ฑ•ํ„ฐ 3์—์„œ ์กฐ๊ธˆ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•  ์˜ˆ์ •์ด๋‹ค ๐Ÿคญ

public void main(String[] args) {
        List<Crew> crews = new ArrayList<>();
        filter(crews, this::isCrewAgeUnder);
        }

private boolean isCrewAgeUnder(final Crew crew) {
        return crew.getAge() <= 25;
        }

        ...

์œ„์™€ ๊ฐ™์ด ๋ฉ”์„œ๋“œ ์ฐธ์กฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๋ฒˆ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์žˆ๋‹ค. (๋ฉ”์„œ๋“œ ์ฐธ์กฐ์— ์˜ˆ์ œ๋ฅผ ๋งž์ถ”๋ ค๊ณ  ํ•˜๋‹ค ๋ณด๋‹ˆ ์ข€ ์ด์ƒํ•ด์ง„ ๊ฐ์ด ์žˆ์ง€๋งŒ... ์ €๋Ÿฐ ๋Š๋‚Œ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.) ์•„๋‹ˆ๋ฉด, ์กฐ๊ธˆ ๋” ๊ฐ์ฒด์ง€ํ–ฅ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ด ๋ฐฉ๋ฒ•์ด ๋” ๋‚˜์„ ๊ฒƒ ๊ฐ™๋‹ค.

public class Crew {
    private final String name;
    private final String nickname;
    private final int age;
    private final Course course;

	...

    public boolean isCrewAgeUnder(final int age) {
        return this.age <= age;
    }
}
 public void main(String[] args) {
        List<Crew> crews = new ArrayList<>();
        filter(crews, crew -> crew.isCrewAgeUnder(25));
        }

        ...

์ฝ”๋“œ์— ์ •๋‹ต์€ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ๊ทธ๋•Œ๊ทธ๋•Œ ์ƒํ™ฉ์— ๋”ฐ๋ผ์„œ ์“ฐ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค!

 


โœ”๏ธ Comparator๋กœ ์ •๋ ฌํ•˜๊ธฐ

๊ทธ ์™ธ์—๋„, ๋‹ค์–‘ํ•œ ํ™œ์šฉ ์˜ˆ์ œ๋“ค์ด ์žˆ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ Comparator์™€ Runnable์— ๋Œ€ํ•ด์„œ ๊ฐ„๋žตํ•˜๊ฒŒ๋งŒ ์‚ดํŽด๋ณด์ž. ์ž๋ฐ” 8์—์„œ List์—๋Š” sort ๋ฉ”์„œ๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค. (์ธํ„ฐํŽ˜์ด์Šค์— ๋””ํดํŠธ ๋ฉ”์„œ๋“œ์ธ sort๊ฐ€ ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š” ํ˜•ํƒœ์ด๋‹ค) ์ด๋•Œ, Comparator ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™œ์šฉํ•˜๋ฉด sort์˜ ๋™์ž‘์„ ๋‹ค์–‘ํ™”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

// 1๋‹จ๊ณ„ - Comparator์˜ ๊ตฌํ˜„์ฒด ์ƒ์„ฑํ•˜๊ธฐ
crews.sort(new Comparator<Crew>() {
@Override
public int compare(Crew o1, Crew o2) {
        return Integer.compare(o1.getAge(), o2.getAge());
        }
        });

// 2๋‹จ๊ณ„ - ๋žŒ๋‹ค๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ
        crews.sort((o1, o2) -> Integer.compare(o1.getAge(), o2.getAge()));

// 3๋‹จ๊ณ„ - ์ดํ›„ ์ฑ•ํ„ฐ์—์„œ ๋‚˜์˜ฌ ๋‚ด์šฉ. ์ผ๋‹จ์€ ๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ ์ •๋„๋งŒ ์•Œ์•„๋‘์ž.
        crews.sort(Comparator.comparingInt(Crew::getAge));

 

โœ”๏ธ Runnable๋กœ ์ฝ”๋“œ ๋ธ”๋ก ์‹คํ–‰ํ•˜๊ธฐ

์ž๋ฐ”์˜ ์Šค๋ ˆ๋“œ๋ฅผ ํ™œ์šฉํ•˜๋ฉด, ๋ณ‘๋ ฌ๋กœ ์ฝ”๋“œ ๋ธ”๋ก์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ, Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์‹คํ–‰ํ•  ์ฝ”๋“œ ๋ธ”๋ก์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. Runnable ์—ญ์‹œ, run()์ด๋ผ๋Š” ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.

@FunctionalInterface
public interface Runnable {
    public abstract void run();
}

๊ทธ๋ฆฌ๊ณ , ์ด๋Ÿฌํ•œ Runnable์„ ํ™œ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ๋™์ž‘์„ ์Šค๋ ˆ๋“œ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ํŠนํžˆ, ์ž๋ฐ” 8์—์„œ๋Š” ๋žŒ๋‹ค ํ‘œํ˜„์‹์„ ํ™œ์šฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜์—ฌ ์Šค๋ ˆ๋“œ์—๊ฒŒ ๋™์ž‘์„ ๊ฑด๋„ค์ค„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

Thread t = new Thread(() -> System.out.println("Hello world"));

 


๐Ÿ’ฌ ์ •๋ฆฌ

1) ๋™์ž‘ ํŒŒ๋ผ๋ฏธํ„ฐํ™”๋ฅผ ํ†ตํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ ๋‹ค์–‘ํ•œ ๋™์ž‘์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก, ์ฝ”๋“œ๋ฅผ ๋ฉ”์„œ๋“œ์˜ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์š”๊ตฌ์‚ฌํ•ญ์— ๋” ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

2) ์ต๋ช… ํด๋ž˜์Šค ๋ฐ ๋žŒ๋‹ค๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

์ฑ•ํ„ฐ 2์—์„œ๋Š” ๋™์ž‘ ํŒŒ๋ผ๋ฏธํ„ฐํ™”์— ๋Œ€ํ•ด์„œ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด์•˜๋‹ค.

์ฑ•ํ„ฐ 3์—์„œ๋Š” ๋žŒ๋‹ค ํ‘œํ˜„์‹์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž ๐Ÿ’ช ์•„๋งˆ ๋‚ด์šฉ์ด ๊ธธ์–ด์„œ ๋‘ ๊ฐœ๋กœ ๋‚˜๋ˆ ์„œ ์“ธ ๊ฒƒ ๊ฐ™๋‹ค.

Comments