nyximos.log

[Java] λžŒλ‹€μ‹ λ³Έλ¬Έ

Programming/JAVA

[Java] λžŒλ‹€μ‹

nyximos 2023. 3. 29. 00:31

πŸ‘©‍πŸš€ λͺ©ν‘œ

μžλ°”μ˜ λžŒλ‹€μ‹μ— λŒ€ν•΄ ν•™μŠ΅ν•˜μ„Έμš”.

πŸ‘©‍πŸ’» ν•™μŠ΅ν•  것

  • λžŒλ‹€μ‹ μ‚¬μš©λ²•
  • ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€
  • Variable Capture
  • λ©”μ†Œλ“œ, μƒμ„±μž 레퍼런슀

 

 

 

λžŒλ‹€μ‹ μ‚¬μš©λ²•

λžŒλ‹€μ‹ Lambda expression

λ©”μ„œλ“œλ₯Ό ν•˜λ‚˜μ˜ 식expression으둜 ν‘œν˜„ν•œ 것

  • ν•¨μˆ˜λ₯Ό κ°„λž΅ν•˜κ³  λͺ…ν™•ν•˜κ²Œ ν‘œν˜„
  • ν™”μ‚΄ν‘œ 이용
  • 읡λͺ… 클래슀의 객체와 λ™μΌν•˜λ‹€.

νŠΉμ§•

  • 0개 μ΄μƒμ˜ λ§€κ°œλ³€μˆ˜λ₯Ό κ°€μ§ˆ 수 μžˆλ‹€. 맀개 λ³€μˆ˜μ˜ ν˜•μ‹μ„ λͺ…μ‹œμ μœΌλ‘œ μ„ μ–Έν•  수 μžˆλ‹€.
    (int a)와 (a)λŠ” λ™μΌν•˜λ‹€. : λ¬Έλ§₯μ—μ„œ μΆ”μ •
  • 맀개 λ³€μˆ˜λŠ” κ΄„ν˜Έλ‘œ 묢이고 μ‰Όν‘œλ‘œ κ΅¬λΆ„λœλ‹€.
    (a, b) λ˜λŠ” (int a, int b) λ˜λŠ” (String a int b, float c)
  • 빈 κ΄„ν˜Έ = 맀개 λ³€μˆ˜κ°€ μ—†μŒ
  • 단일 맀개 λ³€μˆ˜μ΄κ³  νƒ€μž… μœ μΆ”κ°€ κ°€λŠ₯ν•œ 경우 κ΄„ν˜Έλ₯Ό μ‚¬μš©ν•  ν•„μš”κ°€ μ—†λ‹€.
    a -> return a*a
  • λžŒλ‹€μ‹μ˜ λ³Έλ¬Έμ—λŠ” 0개 μ΄μƒμ˜ λ¬Έμž₯이 포함될 수 μžˆλ‹€.
  • λžŒλ‹€μ‹μ˜ 본문은 단일 λ¬Έμž₯일 경우 μ€‘κ΄„ν˜ΈλŠ” 없어도 되며, μ„Έλ―Έμ½œλ‘ μ„ μƒλž΅ν•œλ‹€.
    λ°˜ν™˜ ν˜•μ‹μ€ 일반적인 ν•¨μˆ˜μ™€ λ™μΌν•˜λ‹€.
  • 본문에 ν•˜λ‚˜ μ΄μƒμ˜ λ¬Έμž₯이 있으면 μ€‘κ΄„ν˜Έ { } 둜 λ¬Άμ–΄μ•Όν•œλ‹€.
  • 본문에 ν•˜λ‚˜λΏμΈ λ¬Έμž₯이 return 문일 경우 κ΄„ν˜Έ{ }λ₯Ό μƒλž΅ν•  수 μ—†λ‹€.

μž‘μ„±λ²•

1. λ©”μ„œλ“œμ—μ„œ 이름과 λ°˜ν™˜νƒ€μž…μ„ μ œκ±°ν•˜κ³  λ§€κ°œλ³€μˆ˜ 선언뢀와 λͺΈν†΅{ } 사이에 -> λ₯Ό μΆ”κ°€ν•˜κΈ°λ§Œ ν•˜λ©΄ λœλ‹€.

int max(int a, int b) {
    return a > b ? a : b;
}
(int a, int b) -> {
    return a > b ? a : b;
}

 

2. λ°˜ν™˜κ°’μ΄ μžˆλŠ” λ©”μ„œλ“œμ˜ 경우 returnλ¬Έ λŒ€μ‹  식 expression 으둜 λŒ€μ‹  ν•  수 μžˆλ‹€.
    μ‹μ˜ μ—°μ‚° κ²°κ³Όκ°€ μžλ™μ μœΌλ‘œ λ°˜ν™˜κ°’μ΄ λœλ‹€.
    μ΄λ•Œ λ¬Έμž₯ statement이 μ•„λ‹Œ 식 expression μ΄λ―€λ‘œ 끝에 μ„Έλ―Έμ½œλ‘ μ„ 뢙이지 μ•ŠλŠ”λ‹€.

(int a, int b) -> { return a > b ? a : b; }
(int a, int b) -> a > b ? a : b

 

3. λžŒλ‹€μ‹μ— μ„ μ–Έλœ λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μ€ 좔둠이 κ°€λŠ₯ν•œ κ²½μš°λŠ” μƒλž΅ν•  수 μžˆλŠ”λ°, λŒ€λΆ€λΆ„μ˜ κ²½μš°μ— μƒλž΅κ°€λŠ₯ν•˜λ‹€.

     λžŒλ‹€μ‹μ— λ°˜ν™˜νƒ€μž…μ΄ μ—†λŠ” μ΄μœ λ„ 항상 좔둠이 κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

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

 

4. μ„ μ–Έλœ λ§€κ°œλ³€μˆ˜κ°€ ν•˜λ‚˜λΏμΈ κ²½μš°μ—λŠ” κ΄„ν˜Έ( )λ₯Ό μƒλž΅ν•  수 μžˆλ‹€.

    λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μ΄ 있으면 κ΄„ν˜Έ ( )λ₯Ό μƒλž΅ν•  수 μ—†λ‹€.

(a) -> a * a
a -> a * a

(int a) -> a * a
int a -> a * a    // error

 

5. κ΄„ν˜Έ { } μ•ˆμ˜ λ¬Έμž₯이 ν•˜λ‚˜μΌ λ•ŒλŠ” κ΄„ν˜Έ { }λ₯Ό μƒλž΅ν•  수 μžˆλ‹€. λ¬Έμž₯의 끝에 μ„Έλ―Έμ½œλ‘ μ„ 뢙이지 μ•Šμ•„μ•Ό ν•œλ‹€.

(String name, int i) -> {
    System.out.println(name+"="+i);
}
(String name, int i) ->
    System.out.println(name="="+i)

 

6. κ΄„ν˜Έ { } μ•ˆμ˜ ν•˜λ‚˜λΏμΈ λ¬Έμž₯이 return 일 κ²½μš°μ—λŠ” κ΄„ν˜Έ { }λ₯Ό μƒλž΅ν•  수 μ—†λ‹€.

(int a, int b) -> { return a > b ? a : b; }   // OK
(int a, int b) -> return a > b ? a : b        // error

 

 

ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ Functional Interface

μžλ°”8μ—μ„œ λ„μž…λœ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ„ κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ Java8λΆ€ν„° λ„μž…λœ java.util.function νŒ¨ν‚€μ§€μ˜ 일뢀

  • 좔상 λ©”μ†Œλ“œλ₯Ό 1개만 가지고 μžˆλŠ” μΈν„°νŽ˜μ΄μŠ€
  • SAM Single Abstract Method μΈν„°νŽ˜μ΄μŠ€
  • @FunctionalInterface μ–΄λ…Έν…Œμ΄μ…˜μ„ 가진 μΈν„°νŽ˜μ΄μŠ€
    μΈν„°νŽ˜μ΄μŠ€μ˜ λͺ©μ μ„ λͺ…ν™•ν•˜κ²Œ μ „λ‹¬ν•˜κ³  쑰건을 μΆ©μ‘±ν•˜μ§€ μ•Šμ„ 경우 μ»΄νŒŒμΌλŸ¬κ°€ 였λ₯˜λ₯Ό 생성할 수 있게 ν•œλ‹€.
  • default method와 static mehtodλŠ” μ—¬λŸ¬κ°œ μ‘΄μž¬ν•΄λ„ 상관 μ—†λ‹€.

λ©”μ„œλ“œ maxκ°€ μ„ μ–Έλœ MyFunction μΈν„°νŽ˜μ΄μŠ€ μ •μ˜

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

μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 읡λͺ… 클래슀 객체

MyFunction f = MyFunction() {
                    public int max(int a, int b) {
                        return a > b ? a : b;
                    }
               };
int big = f.max(5,3);  // 읡λͺ… 객체의 λ©”μ„œλ“œλ₯Ό 호좜

MyFunction μΈν„°νŽ˜μ΄μŠ€μ— μ •μ˜λœ λ©”μ„œλ“œ max()λŠ” λžŒλ‹€μ‹ '(int a, int b) -> a > b ? a : b' κ³Ό λ©”μ„œλ“œμ˜ μ„ μ–ΈλΆ€κ°€ μΌμΉ˜ν•œλ‹€.

μœ„ μ½”λ“œμ˜ 읡λͺ… 객체λ₯Ό λžŒλ‹€μ‹μœΌλ‘œ μ•„λž˜μ™€ 같이 λŒ€μ²΄ν•  수 μžˆλ‹€.

MyFunction f = (int a, int b) -> a > b ? a : b;  // 읡λͺ… 객체λ₯Ό λžŒλ‹€μ‹μœΌλ‘œ λŒ€μ²΄
int big = f.max(5,3);    // 읡λͺ… 객체의 λ©”μ„œλ“œλ₯Ό 호좜

λžŒλ‹€μ‹λ„ μ‹€μ œλ‘œλŠ” 읡λͺ… 객체이고, MyFunction μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 읡λͺ… 객체의 λ©”μ„œλ“œ max()와 λžŒλ‹€μ‹μ˜ λ§€κ°œλ³€μˆ˜ νƒ€μž…κ³Ό 개수 그리고 λ°˜ν™˜κ°’μ΄ μΌμΉ˜ν•˜κΈ° λ•Œλ¬Έμ— λžŒλ‹€μ‹μœΌλ‘œ λŒ€μ²΄ν•  수 μžˆλ‹€.

ν•˜λ‚˜μ˜ λ©”μ„œλ“œκ°€ μ„ μ–Έλœ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ν•΄μ„œ λžŒλ‹€μ‹μ„ λ‹€λ£¨λŠ” 것은 기쑴의 μžλ°”μ˜ κ·œμΉ™μ„ 어기지 μ•ŠμœΌλ©΄μ„œλ„ μžμ—°μŠ€λŸ½λ‹€.

κ·Έλž˜μ„œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 톡해 λžŒλ‹€μ‹μ„ λ‹€λ£¨κΈ°λ‘œ κ²°μ •ν–ˆλ‹€.

 

ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ MyFunction μ •μ˜

@FunctionalInterface
interface MyFunction {
    public abstract int max(int a, int b);
}

 

ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ—λŠ” 였직 ν•˜λ‚˜μ˜ 좔상 λ©”μ„œλ“œλ§Œ μ •μ˜λ˜μ–΄ μžˆμ–΄μ•Ό ν•œλ‹€λŠ” μ œμ•½μ΄ μžˆλ‹€.

λžŒλ‹€μ‹κ³Ό μΈν„°νŽ˜μ΄μŠ€μ˜ λ©”μ„œλ“œκ°€ 1:1둜 연결될 수 있기 λ•Œλ¬Έμ΄λ‹€.

ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ§ˆλ‹€ μ‹€ν–‰ λ©”μ†Œλ“œ 이름이 λ‹€λ₯΄λ‹€.

 

Package java.util.function

 

1) Runnable

인자 πŸ™…‍♀️

λ°˜ν™˜κ°’ πŸ™…‍♀️

public interface Runnable {
    public abstract void run();
}
Runnable runnable = () -> System.out.println("run");
runnable.run();
run

 

2) Supplier

인자 πŸ™…‍♀️

λ°˜ν™˜κ°’ T νƒ€μž… πŸ™†‍♀️

public interface Supplier<T> {
    T get();
}
Supplier<String> sayHi = () -> "Hello World!";
String str = sayHi.get();
System.out.println(str);
Hello World!

 

3) Consumer

인자 T νƒ€μž… πŸ™†‍♀️

λ°˜ν™˜κ°’ πŸ™…‍♀️

public interface Consumer<T> {
    void accept(T t);
    
    default Consumer<T> andThen(Consumer<? super T> after) {
    	Object.requireNonNull(after);
        return (T t) -> { accept(t); after.accept(t); };
    }
}

 

Consumer<String> makeJuice = fruit -> System.out.println(fruit + " Juice");
makeJuice.accept("Apple");
Apple Juice

 

Consumer<String> makeJuice = fruit -> System.out.println(fruit + " Juice");
Consumer<String> answer = fruit -> System.out.println("--> Love");
makeJuice.andThen(answer).accept("Apple");
Apple Juice
--> Love

 

4) Function

인자 T νƒ€μž… πŸ™†‍♀️

λ°˜ν™˜κ°’ R νƒ€μž… πŸ™†‍♀️

public interface Function<T, R> {
    R apply(T t);

    default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
        Objects.requireNonNull(before);
        return (V v) -> apply(before.apply(v));
    }

    default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
        Objects.requireNonNull(after);
        return (T t) -> after.apply(apply(t));
    }

    static <T> Function<T, T> identity() {
        return t -> t;
    }
}

 

Function<Integer, Integer> multiply = (value) -> value * 2;
Integer result = multiply.apply(3);
System.out.println(result);
6

 

Function<Integer, Integer> multiply = (value) -> value * 2;
Function<Integer, Integer> add      = (value) -> value + 3;

Function<Integer, Integer> addThenMultiply = multiply.compose(add);

Integer result1 = addThenMultiply.apply(3);
System.out.println(result1);
12

 

5) Predicate

인자 Tνƒ€μž… πŸ™†‍♀️

λ°˜ν™˜κ°’ boolean πŸ™†‍♀️ 

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

    default Predicate<T> and(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) && other.test(t);
    }

    default Predicate<T> negate() {
        return (t) -> !test(t);
    }

    default Predicate<T> or(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) || other.test(t);
    }

    static <T> Predicate<T> isEqual(Object targetRef) {
        return (null == targetRef)
                ? Objects::isNull
                : object -> targetRef.equals(object);
    }
}

test()

Predicate<Integer> isBiggerThanFive = num -> num > 5;
System.out.println("10 is bigger than 5? -> " + isBiggerThanFive.test(10));
10 is bigger than 5? -> true

and() / or()

Predicate<Integer> isBiggerThanFive = num -> num > 5;
Predicate<Integer> isLowerThanSix = num -> num < 6;
System.out.println(isBiggerThanFive.and(isLowerThanSix).test(10));
System.out.println(isBiggerThanFive.or(isLowerThanSix).test(10));
false
true
Predicate<String> isEquals = Predicate.isEqual("Google");
isEquals.test("Google");
true

 

Variable Capture 

λžŒλ‹€λŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ™€ static λ³€μˆ˜, μ§€μ—­λ³€μˆ˜λ₯Ό 자유둭게 μΊ‘μ²˜ν•΄μ„œ μ‚¬μš©ν•  수 μžˆλ‹€.

μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ : heap에 μ €μž₯, μ“°λ ˆλ“œλΌλ¦¬ 곡유 κ°€λŠ₯

static λ³€μˆ˜ : λͺ¨λ“  μΈμŠ€ν„΄μŠ€μ—μ„œ 곡유

지역 λ³€μˆ˜ : stack에 μ €μž₯, μ“°λ ˆλ“œλΌλ¦¬ 곡유 λΆˆκ°€λŠ₯

 

λžŒλ‹€

μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λŠ” heap에 직접 μ ‘κ·Όν•΄μ„œ μ‚¬μš©

지역 λ³€μˆ˜μ— 직접 μ ‘κ·Όν•˜μ§€ μ•Šκ³ , λ³€μˆ˜λ₯Ό stack에 λ³΅μ‚¬ν•΄μ„œ μ‚¬μš©ν•œλ‹€.

 

variable capture

λžŒλ‹€μ—μ„œ νŒŒλΌλ―Έν„°λ‘œ λ„˜κ²¨μ§„ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ•„λ‹ˆλΌ μ™ΈλΆ€μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 것

final ν‚€μ›Œλ“œλ‘œ μž‘μ„±ν•˜κ±°λ‚˜ effectively final λ³€μˆ˜μ—¬μ•Ό ν•œλ‹€.

μΊ‘μ²˜ν•œ λ³€μˆ˜λ₯Ό λ³€κ²½ν•˜λ €κ³ ν•˜λ©΄ 컴파일 였λ₯˜κ°€ λ°œμƒν•œλ‹€.

 

final λ³€μˆ˜

λžŒλ‹€ ν‘œν˜„μ‹ λ‚΄λΆ€μ—μ„œ ν•΄λ‹Ή λ³€μˆ˜λ₯Ό λ³€κ²½ν•  수 μ—†λ‹€κ³  ν•œλ‹€.

 

effectively final λ³€μˆ˜

λžŒλ‹€ ν‘œν˜„μ‹ λ‚΄λΆ€μ—μ„œλ§Œ μ‚¬μš©λ˜κ³ , ν•œ 번 ν• λ‹Ήν•œ ν›„μ—λŠ” λ³€κ²½λ˜μ§€ μ•ŠλŠ” λ³€μˆ˜

λžŒλ‹€ ν‘œν˜„μ‹μ—μ„œ ν•΄λ‹Ή λ³€μˆ˜λ₯Ό μΊ‘μ²˜ν•  λ•Œ final을 μ‚¬μš©ν•˜μ§€ μ•Šλ”λΌλ„ finalκ³Ό λ™μΌν•œ 효과λ₯Ό κ°–λŠ”λ‹€. (μžλ°”8λΆ€ν„° κ°€λŠ₯)

 

public void printNumber(int number) {
    int x = 1; // 일반 지역 λ³€μˆ˜
    int y = 2; // 일반 지역 λ³€μˆ˜
    int z = 3; // 일반 지역 λ³€μˆ˜
    int sum = x + y + z + number; // μΊ‘μ²˜ν•œ λ³€μˆ˜ μ‚¬μš©

    Consumer<Integer> printer = n -> {
        // x = 100;   // 컴파일 였λ₯˜
        // y++;       // 컴파일 였λ₯˜
        // z = z * 2; // 컴파일 였λ₯˜
        System.out.println(sum); // μΊ‘μ²˜ν•œ λ³€μˆ˜ μ‚¬μš©
    };
    printer.accept(number);
}

 

μ»¬λ ‰μ…˜μ΄λ‚˜ λ°°μ—΄ λ³€μˆ˜λ₯Ό λžŒλ‹€ λ‚΄λΆ€μ—μ„œ λ³€κ²½ν•˜λŠ” 것은 κ°€λŠ₯ν•˜μ§€λ§Œ 항상 μ•ˆμ „ν•˜μ§€λŠ” μ•Šλ‹€.

λ‹€λ₯Έ μ“°λ ˆλ“œλ‚˜ μ½”λ“œμ—μ„œ λ™μ‹œμ— μ ‘κ·Ό λ˜λŠ” 경우 λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€.

 

 

 

λ©”μ†Œλ“œ 레퍼런슀

  • λžŒλ‹€μ‹μ΄ ν•˜λ‚˜μ˜ λ©”μ„œλ“œλ§Œ ν˜ΈμΆœν•˜λŠ” κ²½μš°μ— λžŒλ‹€μ‹μ„ κ°„λž΅νžˆ ν•  수 μžˆλ‹€.
  • 클래슀λͺ…::λ©”μ„œλ“œλͺ… or μ°Έμ‘°λ³€μˆ˜::λ©”μ„œλ“œλͺ…
  • λžŒλ‹€μ‹μ˜ 일뢀가 μƒλž΅λ˜μ—ˆμ§€λ§Œ,
  • μ»΄νŒŒμΌλŸ¬κ°€ μƒλž΅λœ 뢀뢄을 μš°λ³€μ˜ parseInt λ©”μ„œλ“œ μ„ μ–ΈλΆ€λ‘œλΆ€ν„°, μ’Œλ³€μ˜ Function μΈν„°νŽ˜μ΄μŠ€μ— μ§€μ •λœ 지넀릭 νƒ€μž…μœΌλ‘œλΆ€ν„° μ‰½κ²Œ μ•Œμ•„λ‚Ό 수 μžˆλ‹€.
Function<String, Integer> f = (String s) -> Integer.parseInt(s);

// λ©”μ„œλ“œ μ°Έμ‘°
Function<String, Integer> f = Integer::parseInt;

 

static λ©”μ„œλ“œ μ°Έμ‘°

(x) -> ClassName.method(x)  // λžŒλ‹€
ClassName::method  	    // λ©”μ„œλ“œ μ°Έμ‘°


μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ μ°Έμ‘°

(obj, x) -> obj.method(x)  // λžŒλ‹€
ClassName::method  	   // λ©”μ„œλ“œ μ°Έμ‘°

 

νŠΉμ • 객체 μΈμŠ€ν„΄μŠ€  λ©”μ„œλ“œ μ°Έμ‘°

(x) -> obj.method(x) 	 // λžŒλ‹€
obj::method  	    	 // λ©”μ„œλ“œ μ°Έμ‘°

 

 

 

μƒμ„±μž 레퍼런슀

μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜λŠ” λžŒλ‹€μ‹λ„ λ©”μ„œλ“œ 참쑰둜 λ³€ν™˜ν•  수 μžˆλ‹€.

Supplier<MyClass> s = () -> new MyClass();   // λžŒλ‹€μ‹
Supplier<MyClass> s = MyClass::new();        // λ©”μ„œλ“œ μ°Έμ‘°

 

λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” μƒμ„±μžλŠ” λ§€κ°œλ³€μˆ˜ κ°―μˆ˜μ— 따라 μ•Œλ§žμ€ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•œλ‹€.

ν•„μš”ν•˜λ‹€λ©΄ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒˆλ‘œ μ •μ˜ν•œλ‹€.

Function<Integer, MyClass> f = (i) -> new MyClass(i);    // λžŒλ‹€μ‹
Function<Integer, MyClass> f2 = myClass::new;            // λ©”μ„œλ“œ μ°Έμ‘°

Function<Integer, String, MyClass> bf = (i,s) -> new MyClass(i,s);    // λžŒλ‹€μ‹
Function<Integer, String, MyClass> bf2 = myClass::new;                // λ©”μ„œλ“œ μ°Έμ‘°

 

 

λ°°μ—΄ 생성

Function<Integer, int[]> f = x -> new int[x];   // λžŒλ‹€μ‹
Function<Integer, int[]> f2 = int[]::new;       // λ©”μ„œλ“œ μ°Έμ‘°

 

 

 

μ°Έμ‘°

15μ£Όμ°¨ 과제: λžŒλ‹€μ‹

 

남ꢁ성, μžλ°”μ˜ 정석 기초편, λ„μš°μΆœνŒ, 2019

'Programming > JAVA' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[Java] μ œλ„€λ¦­  (1) 2022.09.26
[Java] I/O  (1) 2022.09.21
[Java] μ• λ…Έν…Œμ΄μ…˜  (1) 2022.09.11
[Java] Enum  (1) 2022.09.08
[Java] λ©€ν‹°μ“°λ ˆλ“œ ν”„λ‘œκ·Έλž˜λ°  (0) 2022.09.06