JavaRush /Java Blog /Random-KO /๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค ์†Œ๊ฐœ
minuteman
๋ ˆ๋ฒจ 32

๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค ์†Œ๊ฐœ

Random-KO ๊ทธ๋ฃน์— ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
๋„ˆ๋ฌด ๋งŽ์ด ํŠธ๋กค๋งํ•˜์ง€ ๋งˆ์„ธ์š”. ์ด์ œ ๋ง‰ ๊ธฐ์‚ฌ ๋ฒˆ์—ญ์„ ์‹œ์ž‘ํ•˜๋Š” ์ค‘์ž…๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค ์†Œ๊ฐœ - 1

๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค ์†Œ๊ฐœ - Java 8์—์„œ ์žฌํ˜„๋œ ๊ฐœ๋…

์ „ ์„ธ๊ณ„์˜ ๋ชจ๋“  Java ๊ฐœ๋ฐœ์ž๋Š” ๋‹ค์Œ ์ธํ„ฐํŽ˜์ด์Šค ์ค‘ ํ•˜๋‚˜๋ฅผ ํ•œ ๋ฒˆ ์ด์ƒ ์‚ฌ์šฉํ•ด ๋ณธ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค: java.lang.Runnable, java.awt.event.ActionListener, java.util.Comparator, java.util.concurrent.Callable. ๊ทธ๋“ค์€ ๋ชจ๋‘ ํ•œ ๊ฐ€์ง€ ๊ณตํ†ต์ ์ด ์žˆ๋Š”๋ฐ, ๊ทธ๊ฒƒ์€ ๋ชจ๋‘ ํ•˜๋‚˜์˜ ๋ฐฉ๋ฒ•๋งŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. JDK์—๋Š” ์ด๋Ÿฌํ•œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋งŽ์ด ์žˆ์œผ๋ฉฐ Java ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งŒ๋“  ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๋„ ์žˆ์Šต๋‹ˆ๋‹ค. Single Abstract Method interfaces์ด๋Ÿฌํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋Š” (SAM ์ธํ„ฐํŽ˜์ด์Šค) ๋ผ๊ณ ๋„ ํ•ฉ๋‹ˆ๋‹ค . ์ด๋Ÿฌํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋Š” ๋‹ค์Œ ์˜ˆ์ œ์™€ ๊ฐ™์ด ์ด๋Ÿฌํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
public class AnonymousInnerClassTest {
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("A thread created and running...");
            }
        }).start();
    }
}
Java 8์—์„œ๋Š” SAM ๊ฐœ๋…์ด ๋‹ค์‹œ ์ƒ์„ฑ๋˜์–ด ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋žŒ๋‹ค ์‹, ๋ฉ”์„œ๋“œ ์ฐธ์กฐ ๋ฐ ์ฐธ์กฐ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์„์„ ์ถ”๊ฐ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๊ธฐ๋Šฅ ์ˆ˜์ค€์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ ์ˆ˜์ค€์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ƒˆ๋กœ์šด @FunctionalInterface ์ฃผ์„์ด ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
@FunctionalInterface
public interface SimpleFunInterface {
    public void doWork();
}
์ธํ„ฐํŽ˜์ด์Šค๋Š” ํด๋ž˜์Šค์—์„œ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•  ์ˆ˜๋„ java.lang.Object์žˆ์ง€๋งŒ ์ด ๊ฒฝ์šฐ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ธฐ๋Šฅ์ ์œผ๋กœ ์„ ์–ธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
@FunctionalInterface
public interface SimpleFuncInterface {
    public void doWork();
    public String toString();
    public Boolean equals(Object o);
}
์ธํ„ฐํŽ˜์ด์Šค์— ๋˜ ๋‹ค๋ฅธ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์ž๋งˆ์ž IDE๋Š” ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์ด๋ฅผ ์ž˜๋ชป๋œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค ์†Œ๊ฐœ - 2 ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ƒ์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ƒ์†๋˜๊ณ  ์ƒˆ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ด ์ธํ„ฐํŽ˜์ด์Šค๋„ ๊ธฐ๋Šฅ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ํ•˜๋‚˜์˜ ์ถ”์ƒ ๋ฉ”์„œ๋“œ์™€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ธฐ๋ณธ ๋ฉ”์„œ๋“œ๋งŒ ํฌํ•จ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์—ฌ์ „ํžˆ ๊ธฐ๋Šฅ์ ์ธ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.
@FunctionalInterface
public interface ComplexFunctionalInterface extends SimpleFuncInterface {
    default public void doSomeWork() {
        System.out.println("Doing some work in interface impl...");
    }
    default public void doSomeWork() {
        System.out.println("Doing some other work in interface impl...");
    }
}
๋งจ ์œ„์˜ ์˜ˆ๋Š” ์—ฌ์ „ํžˆ ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. ์ด์ œ ๋žŒ๋‹ค ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ๋Œ€์ฒดํ•˜์—ฌ ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
/*
*Implementation the interface by creating an
*anonymoous inner class versus using
*lambda expression.
*/
public class SimpleFunInterfaceTest {
    public static void main(String[] args) {
        carryOutWork(new SimpleFunInterface() {
            @Override
            public void doWork() {
                System.out.println("Do work in SimpleFun impl...");
            }
        });
        carryOutWork(() -> System.out.println("Do work in lambda exp impl..."));
    }
    public static void carryOutWork(SimpleFuncInterface sfi) {
        sfi.work();
    }
}
ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
Do work in SimpleFun impl...
Do work in lambda exp impl...
Java ๋žŒ๋‹ค ํ‘œํ˜„์‹ ๊ตฌ๋ฌธ(Netbeans 8 Nightly ๋นŒ๋“œ)์„ ์ง€์›ํ•˜๋Š” IDE๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ โ€“ ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํžŒํŠธ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค ์†Œ๊ฐœ - 3 ์ด๋Š” Java 8์˜ ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค ๊ฐœ๋…๊ณผ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ์†Œ๊ฐœ์˜€์Šต๋‹ˆ๋‹ค. ๋žŒ๋‹ค ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION