JavaRush /Java Blog /Random-KO /Java์˜ ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค

Java์˜ ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค

Random-KO ๊ทธ๋ฃน์— ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
์•ˆ๋…•ํ•˜์„ธ์š”! Java Syntax Pro ํ€˜์ŠคํŠธ์—์„œ ์šฐ๋ฆฌ๋Š” ๋žŒ๋‹ค ํ‘œํ˜„์‹์„ ์—ฐ๊ตฌํ–ˆ์œผ๋ฉฐ ์ด๋Š” ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ํ•จ์ˆ˜ํ˜• ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฒƒ์— ์ง€๋‚˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ด๋Š” ์‹คํ˜„๋˜์ง€ ์•Š์€ ๋ฉ”์„œ๋“œ์ธ ์ผ๋ถ€ ์ต๋ช…(์•Œ ์ˆ˜ ์—†์Œ) ํด๋ž˜์Šค์˜ ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ณผ์ •์˜ ๊ฐ•์˜์—์„œ ๋žŒ๋‹ค ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•œ ์กฐ์ž‘์„ ํƒ๊ตฌํ–ˆ๋‹ค๋ฉด ์ด์ œ๋Š” ๋‹ค๋ฅธ ์ธก๋ฉด, ์ฆ‰ ๋ฐ”๋กœ ์ด๋Ÿฌํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ณ ๋ คํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. Java์˜ 8๋ฒˆ์งธ ๋ฒ„์ „์—์„œ๋Š” ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์ŠคJava์˜ ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค - 1 ๊ฐœ๋…์ด ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค . ์ด๊ฒŒ ๋ญ”๊ฐ€์š”? ๊ตฌํ˜„๋˜์ง€ ์•Š์€(์ถ”์ƒ) ๋ฉ”์†Œ๋“œ๊ฐ€ ํ•˜๋‚˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ธฐ๋Šฅ์ ์ธ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ์•ž์„œ ๋…ผ์˜ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ฐ™์€ ๋งŽ์€ ๊ธฐ๋ณธ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ด ์ •์˜์— ์†ํ•ฉ๋‹ˆ๋‹ค . ๋˜ํ•œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ๋งŒ๋“œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋„ ์žˆ์Šต๋‹ˆ๋‹ค. Comparator
@FunctionalInterface
public interface Converter<T, N> {
   N convert(T t);
}
ํ•œ ์œ ํ˜•์˜ ๊ฐœ์ฒด๋ฅผ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ๊ฐœ์ฒด(์ผ์ข…์˜ ์–ด๋Œ‘ํ„ฐ)๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์„์€ @FunctionalInterface๋งค์šฐ ๋ณต์žกํ•˜๊ฑฐ๋‚˜ ์ค‘์š”ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ฃผ์„์˜ ๋ชฉ์ ์€ ์ด ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๊ธฐ๋Šฅ์ ์ด๋ฉฐ ํ•˜๋‚˜์˜ ๋ฉ”์„œ๋“œ๋งŒ ํฌํ•จํ•ด์•ผ ํ•จ์„ ์ปดํŒŒ์ผ๋Ÿฌ์— ์•Œ๋ฆฌ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด ์ฃผ์„์ด ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ๊ตฌํ˜„๋˜์ง€ ์•Š์€(์ถ”์ƒ) ๋ฉ”์„œ๋“œ๊ฐ€ ๋‘ ๊ฐœ ์ด์ƒ ์žˆ๋Š” ๊ฒฝ์šฐ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž˜๋ชป๋œ ์ฝ”๋“œ๋กœ ์ธ์‹ํ•˜๋ฏ€๋กœ ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฑด๋„ˆ๋›ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์ฃผ์„์ด ์—†๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ธฐ๋Šฅ์ ์ด๋ฉฐ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ์ง€๋งŒ @FunctionalInterface์ด๋Š” ์ถ”๊ฐ€ ๋ณดํ—˜์— ์ง€๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ˆ˜์—…์œผ๋กœ ๋Œ์•„๊ฐ€์ž Comparator. ํ•ด๋‹น ์ฝ”๋“œ(๋˜๋Š” ๋ฌธ์„œ ) ๋ฅผ ๋ณด๋ฉด ๋‘ ๊ฐ€์ง€ ์ด์ƒ์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋‹น์‹ ์€ ๋ฌป์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ถ”์ƒ ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ๋‹จ์ผ ๋ฉ”์„œ๋“œ์˜ ๋ฒ”์œ„ ๋‚ด์— ์žˆ์ง€ ์•Š์€ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ณต์ „
์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ฐœ๋…์€ ์ฃผ์–ด์ง„ ์ฝ”๋“œ ๋‹จ์œ„๊ฐ€ ์–ด๋–ค ๋ฉ”์†Œ๋“œ๋„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Java 8๋ถ€ํ„ฐ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ •์  ๋ฉ”์†Œ๋“œ์™€ ๊ธฐ๋ณธ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ •์  ๋ฉ”์„œ๋“œ๋Š” ํด๋ž˜์Šค์— ์ง์ ‘ ๋ฐ”์ธ๋”ฉ๋˜๋ฉฐ ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ํด๋ž˜์Šค์˜ ํŠน์ • ๊ฐœ์ฒด๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์€ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐœ๋…์— ์กฐํ™”๋กญ๊ฒŒ ๋“ค์–ด๋งž์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด์ „ ํด๋ž˜์Šค์— ๊ฐ์ฒด์˜ null์„ ํ™•์ธํ•˜๋Š” ์ •์  ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
@FunctionalInterface
public interface Converter<T, N> {

   N convert(T t);

   static <T> boolean isNotNull(T t){
       return t != null;
   }
}
์ด ๋ฉ”์†Œ๋“œ๋ฅผ ์ˆ˜์‹ ํ•œ ํ›„ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ถˆํ‰ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์—ฌ์ „ํžˆ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ ๋ฐฉ๋ฒ•
Java 8 ์ด์ „์—๋Š” ๋‹ค๋ฅธ ํด๋ž˜์Šค์—์„œ ์ƒ์†๋œ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ ํŠน์ • ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„๋œ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋งŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•์ด ๋ชจ๋“  ํด๋ž˜์Šค์— ๋™์ผํ•˜๋‹ค๋ฉด ์–ด๋–จ๊นŒ์š”? ์ด ๊ฒฝ์šฐ์—๋Š” ์ถ”์ƒ ํด๋ž˜์Šค๊ฐ€ ๊ฐ€์žฅ ์ž์ฃผ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค . ๊ทธ๋Ÿฌ๋‚˜ Java 8๋ถ€ํ„ฐ๋Š” ๊ตฌํ˜„๋œ ๋ฉ”์†Œ๋“œ(๊ธฐ๋ณธ ๋ฉ”์†Œ๋“œ)์™€ ํ•จ๊ป˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•  ๋•Œ ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜๊ฑฐ๋‚˜ ๋ชจ๋“  ๊ฒƒ์„ ๊ทธ๋Œ€๋กœ ๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๊ธฐ๋ณธ ๋กœ์ง์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€). ๊ธฐ๋ณธ ๋ฉ”์†Œ๋“œ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ - ํ‚ค์›Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค default.
@FunctionalInterface
public interface Converter<T, N> {

   N convert(T t);

   static <T> boolean isNotNull(T t){
       return t != null;
   }

   default void writeToConsole(T t) {
       System.out.println("ะขะตะบัƒั‰ะธะน an object - " + t.toString());
   }
}
๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์šฐ๋ฆฌ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ถˆํ‰์„ ์‹œ์ž‘ํ•˜์ง€ ์•Š์•˜์œผ๋ฉฐ ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค์˜ ํ•œ๊ณ„๋ฅผ ๋„˜์–ด์„œ์ง€ ์•Š์•˜์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ์ฒด ํด๋ž˜์Šค ๋ฉ”์†Œ๋“œ
๊ฐ์ฒด ๋น„๊ต ๊ฐ•์˜์—์„œ ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ํด๋ž˜์Šค๊ฐ€ ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†์„ ๋ฐ›๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค Object. ์ด๋Š” ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค์— ํด๋ž˜์Šค์˜ ์ผ๋ถ€ ๋ฉ”์„œ๋“œ์™€ ์„œ๋ช…์ด ์ผ์น˜ํ•˜๋Š” ์ถ”์ƒ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ Object์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ(๋˜๋Š” ๋ฉ”์„œ๋“œ)๋Š” ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค ์ œํ•œ์„ ๊นจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
@FunctionalInterface
public interface Converter<T, N> {

   N convert(T t);

   static <T> boolean isNotNull(T t){
       return t != null;
   }

   default void writeToConsole(T t) {
       System.out.println("ะขะตะบัƒั‰ะธะน an object - " + t.toString());
   }

   boolean equals(Object obj);
}
๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์šฐ๋ฆฌ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ถˆํ‰ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋Š” Converter์—ฌ์ „ํžˆ ๊ธฐ๋Šฅ์ ์ธ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ์ด์ œ ์งˆ๋ฌธ์€: ์™œ ์šฐ๋ฆฌ๋Š” ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๊ตฌํ˜„๋˜์ง€ ์•Š์€ ํ•˜๋‚˜์˜ ๋ฉ”์„œ๋“œ๋กœ ์ œํ•œํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋žŒ๋‹ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค Converter. ์ด๋ฅผ ์œ„ํ•ด ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค Dog.
public class Dog {
  String name;
  int age;
  int weight;

  public Dog(final String name, final int age, final int weight) {
     this.name = name;
     this.age = age;
     this.weight = weight;
  }
}
๊ทธ๋ฆฌ๊ณ  ๋น„์Šทํ•œ ๊ฒƒ Raccoon(๋„ˆ๊ตฌ๋ฆฌ):
public class Raccoon {
  String name;
  int age;
  int weight;

  public Raccoon(final String name, final int age, final int weight) {
     this.name = name;
     this.age = age;
     this.weight = weight;
  }
}
๊ฐ์ฒด๊ฐ€ ์žˆ๊ณ  Dogํ•ด๋‹น ํ•„๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค Raccoon. ์ฆ‰, Converterํ•œ ์œ ํ˜•์˜ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฅธ ์œ ํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ๋ณด์ผ๊นŒ์š”?
public static void main(String[] args) {
  Dog dog = new Dog("Bobbie", 5, 3);

  Converter<Dog, Raccoon> converter = x -> new Raccoon(x.name, x.age, x.weight);

  Raccoon raccoon = converter.convert(dog);

  System.out.println("Raccoon has parameters: name - " + raccoon.name + ", age - " + raccoon.age + ", weight - " + raccoon.weight);
}
์ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ฝ˜์†”์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ถœ๋ ฅ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

Raccoon has parameters: name - Bobbbie, age - 5, weight - 3
์ด๋Š” ์šฐ๋ฆฌ์˜ ๋ฐฉ๋ฒ•์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ–ˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.Java์˜ ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค - 2

๊ธฐ๋ณธ Java 8 ๊ธฐ๋Šฅ ์ธํ„ฐํŽ˜์ด์Šค

์ด์ œ Java 8์ด ์ œ๊ณตํ•˜๊ณ  Stream API์™€ ํ•จ๊ป˜ ์ ๊ทน์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ˆ ๋ถ€

Predicateโ€” ํŠน์ • ์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. ์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜๋ฉด ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  true, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด -๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค false.
@FunctionalInterface
public interface Predicate<T> {
   boolean test(T t);
}
์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ Predicate์—ฌ๋Ÿฌ ์œ ํ˜•์˜ ํŒจ๋ฆฌํ‹ฐ๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด ๋ณด์„ธ์š” Integer.
public static void main(String[] args) {
   Predicate<Integer> isEvenNumber = x -> x % 2==0;

   System.out.println(isEvenNumber.test(4));
   System.out.println(isEvenNumber.test(3));
}
์ฝ˜์†” ์ถœ๋ ฅ:

true
false

์†Œ๋น„์ž

Consumer(์˜์–ด - "consumer") - T ์œ ํ˜•์˜ ๊ฐ์ฒด๋ฅผ ์ž…๋ ฅ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์ผ๋ถ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.
@FunctionalInterface
public interface Consumer<T> {
   void accept(T t);
}
์˜ˆ๋ฅผ ๋“ค์–ด, ์ „๋‹ฌ๋œ ๋ฌธ์ž์—ด ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ˜์†”์— ์ธ์‚ฌ๋ง์„ ์ถœ๋ ฅํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฅผ ์ƒ๊ฐํ•ด ๋ณด์„ธ์š”. Consumer
public static void main(String[] args) {
   Consumer<String> greetings = x -> System.out.println("Hello " + x + " !!!");
   greetings.accept("Elena");
}
์ฝ˜์†” ์ถœ๋ ฅ:

Hello Elena !!!

๊ณต๊ธ‰์ž

Supplier(์˜์–ด - ๊ณต๊ธ‰์ž) - ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ T ์œ ํ˜•์˜ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค:
@FunctionalInterface
public interface Supplier<T> {
   T get();
}
์˜ˆ๋ฅผ ๋“ค์–ด Supplier๋ชฉ๋ก์—์„œ ์ž„์˜์˜ ์ด๋ฆ„์„ ์ƒ์„ฑํ•˜๋Š” ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.
public static void main(String[] args) {
   ArrayList<String> nameList = new ArrayList<>();
   nameList .add("Elena");
   nameList .add("John");
   nameList .add("Alex");
   nameList .add("Jim");
   nameList .add("Sara");

   Supplier<String> randomName = () -> {
       int value = (int)(Math.random() * nameList.size());
       return nameList.get(value);
   };

   System.out.println(randomName.get());
}
๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์„ ์‹คํ–‰ํ•˜๋ฉด ์ฝ˜์†”์˜ ์ด๋ฆ„ ๋ชฉ๋ก์—์„œ ๋ฌด์ž‘์œ„ ๊ฒฐ๊ณผ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ

Functionโ€” ์ด ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ธ์ˆ˜ T๋ฅผ ์ทจํ•ด ์ด๋ฅผ R ์œ ํ˜•์˜ ๊ฐ์ฒด๋กœ ์บ์ŠคํŒ…ํ•˜๊ณ  ๊ฒฐ๊ณผ๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.
@FunctionalInterface
public interface Function<T, R> {
   R apply(T t);
}
์˜ˆ๋ฅผ ๋“ค์–ด ์ˆซ์ž๋ฅผ ๋ฌธ์ž์—ด ํ˜•์‹( )์—์„œ ์ˆซ์ž ํ˜•์‹( ) ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.FunctionStringInteger
public static void main(String[] args) {
   Function<String, Integer> valueConverter = x -> Integer.valueOf(x);
   System.out.println(valueConverter.apply("678"));
}
์ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ฝ˜์†”์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ถœ๋ ฅ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

678
์ถ”์‹ : ์ˆซ์ž ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ๋ฌธ์ž๋„ ๋ฌธ์ž์—ด์— ์ „๋‹ฌํ•˜๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค .NumberFormatException

๋‹จํ•ญ ์—ฐ์‚ฐ์ž

UnaryOperatorโ€” T ์œ ํ˜•์˜ ๊ฐ์ฒด๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ทจํ•˜์—ฌ ์ด์— ๋Œ€ํ•ด ์ผ๋ถ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋™์ผํ•œ T ์œ ํ˜•์˜ ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ์ž‘์—… ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.
@FunctionalInterface
public interface UnaryOperator<T> {
   T apply(T t);
}
UnaryOperatorapply, ์ˆซ์ž๋ฅผ ์ œ๊ณฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค .
public static void main(String[] args) {
   UnaryOperator<Integer> squareValue = x -> x * x;
   System.out.println(squareValue.apply(9));
}
์ฝ˜์†” ์ถœ๋ ฅ:

81
์šฐ๋ฆฌ๋Š” ๋‹ค์„ฏ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด Java 8๋ถ€ํ„ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ „๋ถ€๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ธฐ๋ณธ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋‚˜๋จธ์ง€ ๊ฒƒ๋“ค์€ ๋ณต์žกํ•œ ์œ ์‚ฌํ’ˆ์ž…๋‹ˆ๋‹ค. ์ „์ฒด ๋ชฉ๋ก์€ ๊ณต์‹ Oracle ์„ค๋ช…์„œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .

Stream์˜ ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค

์œ„์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค๋Š” Stream API์™€ ๊ธด๋ฐ€ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ๋ฌผ์–ด๋ณด๋‚˜์š”? Java์˜ ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค - 3๊ทธ๋ฆฌ๊ณ  ๋งŽ์€ ๋ฉ”์†Œ๋“œ๊ฐ€ Stream์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค์™€ ํŠน๋ณ„ํžˆ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. NET์—์„œ ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค Stream.

์ˆ ์–ด๊ฐ€ ์žˆ๋Š” ๋ฐฉ๋ฒ•

์˜ˆ๋ฅผ ๋“ค์–ด, ์ธ์ˆ˜๋กœ ์‚ฌ์šฉ ํ•˜๊ณ  ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์š”์†Œ๋งŒ ๋ฐ˜ํ™˜ํ•˜๋Š” ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ๋ฅผ ์‚ดํŽด Stream๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค . -a ์˜ ๋งฅ๋ฝ์—์„œ ์ด๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋ฉ”์†Œ๋“œ ์—์„œ ์‚ฌ์šฉ๋  ๋•Œ ๋ฐ˜ํ™˜๋˜๋Š” ์š”์†Œ๋งŒ ํ†ต๊ณผํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค . ์ด๊ฒƒ์€ ์šฐ๋ฆฌ์˜ ์˜ˆ๊ฐ€ ์— ๋Œ€ํ•œ ๋ชจ์Šต ์ด์ง€๋งŒ ๋‹ค์Œ์˜ ์š”์†Œ ํ•„ํ„ฐ์— ๋Œ€ํ•œ ๊ฒƒ ์ž…๋‹ˆ๋‹ค . filterPredicateStreamPredicateStreamtruetestPredicatePredicateStream
public static void main(String[] args) {
   List<Integer> evenNumbers = Stream.of(1, 2, 3, 4, 5, 6, 7, 8)
           .filter(x -> x % 2==0)
           .collect(Collectors.toList());
}
๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ชฉ๋ก์€ evenNumbers{2, 4, 6, 8} ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ๊ธฐ์–ตํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ collect๋ชจ๋“  ์š”์†Œ๋ฅผ โ€‹โ€‹ํŠน์ • ์ปฌ๋ ‰์…˜์œผ๋กœ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ List.

์†Œ๋น„์ž์™€์˜ ๋ฐฉ๋ฒ•

Stream๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜ ๋ฉ”์†Œ๋“œ ์ค‘ ํ•˜๋‚˜๋Š” Consumer์ž…๋‹ˆ๋‹ค peek. Consumerin ์— ๋Œ€ํ•œ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค Stream:
public static void main(String[] args) {
   List<String> peopleGreetings = Stream.of("Elena", "John", "Alex", "Jim", "Sara")
           .peek(x -> System.out.println("Hello " + x + " !!!"))
           .collect(Collectors.toList());
}
์ฝ˜์†” ์ถœ๋ ฅ:

Hello Elena !!!
Hello John !!!
Hello Alex !!!
Hello Jim !!!
Hello Sara !!!
๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ฉ”์„œ๋“œ๋Š” peek์™€ ํ•จ๊ป˜ ์ž‘๋™ ํ•˜๋ฏ€๋กœ Consumer๋ฌธ์ž์—ด ์ˆ˜์ •์€ Stream๋ฐœ์ƒํ•˜์ง€ ์•Š์ง€๋งŒ ์›๋ž˜ ์š”์†Œ์™€ ๋™์ผํ•˜๊ฒŒ peek๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค . Stream๋”ฐ๋ผ์„œ ๋ชฉ๋ก์€ peopleGreetings"Elena", "John", "Alex", "Jim", "Sara" ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋Š”๋ฐ foreach, ์ด ๋ฐฉ๋ฒ•๊ณผ ์œ ์‚ฌ peekํ•˜์ง€๋งŒ ์ตœ์ข…-์ข…๋ฃŒ์ ์ด๋ผ๋Š” ์ ์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๊ณต๊ธ‰์ž์™€์˜ ๋ฐฉ๋ฒ•

Streamํ•จ์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜ ๋ฉ”์„œ๋“œ ์˜ˆ๋กœ ์ „๋‹ฌ๋œ ํ•จ์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฌดํ•œ ์‹œํ€€์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฐ€ Supplier์žˆ์Šต๋‹ˆ๋‹ค . generate์˜ˆ์ œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Supplier5๊ฐœ์˜ ์ž„์˜์˜ ์ด๋ฆ„์„ ์ฝ˜์†”์— ์ธ์‡„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
public static void main(String[] args) {
   ArrayList<String> nameList = new ArrayList<>();
   nameList.add("Elena");
   nameList.add("John");
   nameList.add("Alex");
   nameList.add("Jim");
   nameList.add("Sara");

   Stream.generate(() -> {
       int value = (int) (Math.random() * nameList.size());
       return nameList.get(value);
   }).limit(5).forEach(System.out::println);
}
๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ์ฝ˜์†”์—์„œ ์–ป๋Š” ์ถœ๋ ฅ์ž…๋‹ˆ๋‹ค:

John
Elena
Elena
Elena
Jim
limit(5)์—ฌ๊ธฐ์„œ๋Š” ๋ฉ”์†Œ๋“œ์— ์ œํ•œ์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค generate. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ”„๋กœ๊ทธ๋žจ์€ ์ฝ˜์†”์— ์ž„์˜์˜ ์ด๋ฆ„์„ ๋ฌด๊ธฐํ•œ์œผ๋กœ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค.

ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š” ๋ฐฉ๋ฒ•

Stream์ธ์ˆ˜๊ฐ€ ์žˆ๋Š” ๋ฉ”์„œ๋“œ์˜ ์ผ๋ฐ˜์ ์ธ ์˜ˆ๋Š” ํ•œ ์œ ํ˜•์˜ ์š”์†Œ๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ „๋‹ฌํ•˜๋Š” Function๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค . ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ์š”์†Œ๋Š” ์ด๋ฏธ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ์š”์†Œ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. in์„ map์‚ฌ์šฉํ•œ ์˜ˆ๋Š” ๋‹ค์Œ ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค . FunctionStream
public static void main(String[] args) {
   List<Integer> values = Stream.of("32", "43", "74", "54", "3")
           .map(x -> Integer.valueOf(x)).collect(Collectors.toList());
}
๊ฒฐ๊ณผ์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ์ˆซ์ž ๋ชฉ๋ก์„ ์–ป์ง€๋งŒ Integer.

UnaryOperator๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ

์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋กœ ํด๋ž˜์Šค ๋ฉ”์†Œ๋“œ - UnaryOperator๋ฅผ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค . ์ด ๋ฉ”์†Œ๋“œ๋Š” ๋ฉ”์†Œ๋“œ์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค . ๋˜ํ•œ ๋ฌดํ•œ ์‹œํ€€์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€๋งŒ ๋‘ ๊ฐœ์˜ ์ธ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.Streamiterategenerate
  • ์ฒซ ๋ฒˆ์งธ๋Š” ์‹œํ€€์Šค ์ƒ์„ฑ์ด ์‹œ์ž‘๋˜๋Š” ์š”์†Œ์ž…๋‹ˆ๋‹ค.
  • ๋‘ ๋ฒˆ์งธ๋Š” ์ด๋ฉฐ UnaryOperator, ์ด๋Š” ์ฒซ ๋ฒˆ์งธ ์š”์†Œ์—์„œ ์ƒˆ ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์›๋ฆฌ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
์ด๊ฒƒ์ด ์šฐ๋ฆฌ ์˜ˆ์ œ์˜ ๋ชจ์Šต์ž…๋‹ˆ๋‹ค UnaryOperator. ๊ทธ๋Ÿฌ๋‚˜ ๋ฉ”์†Œ๋“œ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค iterate.
public static void main(String[] args) {
   Stream.iterate(9, x -> x * x)
           .limit(4)
           .forEach(System.out::println);
}
์ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ฝ˜์†”์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ถœ๋ ฅ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

9
81
6561
43046721
์ฆ‰, ๊ฐ ์š”์†Œ๋Š” ์ž์ฒด์ ์œผ๋กœ ๊ณฑํ•ด์ง€๊ณ  ์ฒ˜์Œ ๋„ค ์ˆซ์ž์— ๋Œ€ํ•ด์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. Java์˜ ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค - 4๊ทธ๊ฒŒ ๋‹ค์•ผ! ์ด ๊ธฐ์‚ฌ๋ฅผ ์ฝ์€ ํ›„ Java์˜ Stream API๋ฅผ ์ดํ•ดํ•˜๊ณ  ๋งˆ์Šคํ„ฐํ•˜๋Š” ๋ฐ ํ•œ ๊ฑธ์Œ ๋” ๊ฐ€๊นŒ์›Œ์ง€๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค!
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION