๐๏ธ Java Lambda๋ก Switch๋ฌธ ๋จ์ํํ๊ธฐ
์ ๋ ์ผ๋ จ์ ์์๊ฐ์ ํ ์คํธํ๊ธฐ ์ํด if-else ๋ฌธ๋ณด๋ค switch ๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ ์ ํธํฉ๋๋ค. switch ๋ฌธ์ ๊ฐ๋ฅํ ๊ฐ์ด ๋ง์ ๋ ๋ ๊ฐ๊ฒฐํ๊ณ ์ฝ๊ธฐ ์ฝ๊ธฐ ๋๋ฌธ์ด์ฃ . ๋ค์ ์ฝ๋์์๋ ์์ผ์ ๋ํ๋ด๋ ์ด๊ฑฐํ๊ณผ ๋ ์ง๋ณ๋ก ๋ค๋ฅธ ๋ชฉํ๋ฅผ ํ๋ฆฐํ ํ๋ switch ๋ฌธ์ ์ฌ์ฉํฉ๋๋ค. ``` public class ClientApp { public static void main(String[] args) { Week week = Week.SATURDAY; GoalPrinter goalPrinter = new GoalPrinter(); showWeekGoal(goalPrinter, week); } private static void showWeekGoal(GoalPrinter goalPrinter,Week week) { switch (week){ case SATURDAY: goalPrinter.saturdayGoal(); break; case SUNDAY: goalPrinter.sundayGoal(); break; // ์๋ต } } } ``` ์ด ์ ๊ทผ์ ๊ฒฐํจ์ด ์์ต๋๋ค. Week์ ์ ์์ผ์ ์ถ๊ฐํด์ผ ํ๋ ๊ฒฝ์ฐ GoalPrinter์ ClientApp์ ๋ชจ๋ ์์ ํด์ผ ํฉ๋๋ค. ์ด๋ Open-Closed(SOLID ๊ฐ๋ฐฉ-ํ์) ์์น์ ์๋ฐฐ๋ฉ๋๋ค. ๋ ๊ฐ์ ํ ์ ์์๊น์? ์ค์ ๋ก Lambda์ Functional Interface ๋์์ผ๋ก ๊ฒฐ์ ์ ์ค์ผ ์ ์์ต๋๋ค. ``` public enum Week { SATURDAY(GoalPrinter::saturdayGoal), SUNDAY(GoalPrinter::sundayGoal), // ์๋ต public final WeekGoalConsumer consumer; Week(WeekGoalConsumer consumer) { this.consumer = consumer; } } ``` WeekGoalConsumer๋ฅผ ๋ง๋ค์์ต๋๋ค. ์ด ์ธํฐํ์ด์ค๋ GoalPrinter์ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ``` @FunctionalInterface public interface WeekGoalConsumer { void execute(T t); } ``` ๊ทธ๋ฆฌ๊ณ ๋ง์นจ๋ด, ClientApplication์ ์์ ํ์ต๋๋ค. ``` public class ClientApp { public static void main(String[] args) { Week week = Week.SUNDAY; week.consumer.execute(new GoalPrinter()); } } ``` ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ ๊นจ๋ํ๊ณ ๊ฐ๊ฒฐํฉ๋๋ค. ์ด๊ฑฐํ์ ์๋ก์ด ์์๋ฅผ ์ถ๊ฐํด์ผ ํ ๋, ๋งค๋ฒ ํด๋ผ์ด์ธํธ ๊ตฌํ์ ๋ณ๊ฒฝํ ํ์๊ฐ ์์ต๋๋ค. ๐ฃ ์ต๊ทผ์ ์ด๋ฐ switch ๋ฌธ ์ฝ๋๋ฅผ ์์ฑํ ์ผ์ด ์์๋๋ฐ, ์ด ํฌ์คํ ์ ์ฐธ๊ณ ํด์ ์์ ํด์ผ๊ฒ ๋ค์.