Javaμ κΈ°λ³Έ ν¨μν μΈν°νμ΄μ€
μλ‘
μ¬λ΄ μ½λλ₯Ό μ΄ν΄λ³΄λ€κ° ν¨μν μΈν°νμ΄μ€, κ·Έμ€μμλ BiFunction<T, U, R>μ μ¬μ©ν λ‘μ§μ μμ£Ό λ³Ό μ μμλλ°, μ€μ λ‘ λ³΄λ μμνκΈ°λ νκ³ , μ λ λ‘μ§μ νλ² λ
Ήμ¬λ³΄κ³ μΆμ΄μ μ΄λ² κΈ°νμ μ 리λ₯Ό ν΄λ³΄λ €κ³ ν©λλ€.
ν¨μν μΈν°νμ΄μ€ μ’ λ₯
Javaμ ν¨μν μΈν°νμ΄μ€λ JAVA 8λΆν° λμ
λ κΈ°λ₯μΌλ‘, νλμ μΆμ λ©μλλ§ κ°μ§λ μΈν°νμ΄μ€λ₯Ό μλ―Έν©λλ€. μ΄λ¬ν μΈν°νμ΄μ€λ€μ λλ€ ννμμ΄λ λ©μλ μ°Έμ‘°λ₯Ό ν΅ν΄ κ°λ¨νκ² ννν μ μμΌλ©°, Javaμμλ java.util.function ν¨ν€μ§λ₯Ό ν΅ν΄ 미리 μ μλ λ€μν ν¨μν μΈν°νμ΄μ€λ₯Ό μ 곡ν©λλ€.
Javaμμ 미리 μ μν΄ λ μ£Όμ ν¨μν μΈν°νμ΄μ€λ λ€μκ³Ό κ°μ΅λλ€.
- Function<T, R>: μ
λ ₯ μΈμ Tλ₯Ό λ°μ κ²°κ³Ό Rμ λ°ννλ ν¨μλ₯Ό λνλΈλ€. μ£Όλ‘ λ°μ΄ν° λ³ν μμ
μ μ¬μ©λλ€.
- R apply(T t)
- BiFunction<T, U, R>: λ κ°μ μ
λ ₯ μΈμ Tμ Uλ₯Ό λ°μ κ²°κ³Ό Rμ λ°ννλ ν¨μλ₯Ό λνλΈλ€.
- R apply(T t, U u)
- Consumer<T>: μ
λ ₯ μΈμ Tλ₯Ό λ°μ μ²λ¦¬νλ ν¨μλ₯Ό λνλΈλ€. λ°νκ°μ μμΌλ©°, μ£Όλ‘ λ°μ΄ν°λ₯Ό μλΉνλ μμ
μ μ¬μ©λλ€.
- void accept(T t)
- BiConsumer<T, U>: λ κ°μ μ
λ ₯ μΈμ Tμ Uλ₯Ό λ°μ μ²λ¦¬νλ ν¨μλ₯Ό λνλΈλ€. λ°ν κ°μ μλ€.
- void accept(T t, U u)
- Supplier<T>: μ
λ ₯ μΈμ μμ΄ κ²°κ³Ό Tλ₯Ό λ°ννλ ν¨μλ₯Ό λνλΈλ€. μ£Όλ‘ κ°μ μμ±νκ±°λ 곡κΈνλ μμ
μ μ¬μ©λλ€.
- T get()
- Predicate<T>: μ
λ ₯ μΈμ Tλ₯Ό λ°μ boolean κ°μ λ°ννλ ν¨μλ₯Ό λνλΈλ€. μ£Όλ‘ μ‘°κ±΄ κ²μ¬μ μ¬μ©λλ€.
- boolean test(T t)
- BiPredicate<T, U>: λ κ°μ μ
λ ₯ μΈμ Tμ Uλ₯Ό λ°μ boolean κ°μ λ°ννλ ν¨μλ₯Ό λνλΈλ€.
- boolean test(T t, U u)
- UnaryOperator<T>: μ
λ ₯ μΈμ Tλ₯Ό λ°μ λμΌν μ νμ κ²°κ³Όλ₯Ό λ°ννλ ν¨μλ₯Ό λνλΈλ€. Function<T, T>μ μλΈ μΈν°νμ΄μ€μ΄λ©°, μ£Όλ‘ λ¨ν μ°μ° μμ
μ μ¬μ©λλ€.
- T apply(T t)
- BinaryOperator<T>: λ κ°μ μ
λ ₯ μΈμ Tλ₯Ό λ°μ λμΌν μ νμ κ²°κ³Όλ₯Ό λ°ννλ ν¨μλ₯Ό λνλΈλ€. BiFunction<T, T, T>μ μλΈ μΈν°νμ΄μ€μ΄λ©°, μ£Όλ‘ μ΄ν μ°μ° μμ
μ μ¬μ©λλ€.
- T apply(T t1, T t2)
- μ΄ μΈμ ν¨μλ€
μμ
βοΈ Function<T, R> : μ λ ₯ μΈμ Tλ₯Ό λ°μ κ²°κ³Ό Rμ λ°ννλ ν¨μ, μ£Όλ‘ λ°μ΄ν° λ³ν μμ μ μ¬μ©
import java.util.function.Function;
public class Main {
public static void main(String[] args) {
Function<String, Integer> strLength = str -> str.length();
System.out.println("Length of 'Hello': " + strLength.apply("Hello")); // μΆλ ₯: Length of 'Hello': 5
}
}
βοΈ BiFunction<T, U, R>: λ κ°μ μ λ ₯ μΈμ Tμ Uλ₯Ό λ°μ κ²°κ³Ό Rμ λ°ννλ ν¨μ
import java.util.function.BiFunction;
public class Main {
public static void main(String[] args) {
BiFunction<Integer, Integer, Integer> add = (a, b) -> a + b;
System.out.println("10 + 20 = " + add.apply(10, 20)); // μΆλ ₯: 10 + 20 = 30
}
}
βοΈ Consumer<T>: μ λ ₯ μΈμ Tλ₯Ό λ°μ μ²λ¦¬νλ ν¨μ, λ°νκ°μ μμΌλ©°, μ£Όλ‘ λ°μ΄ν°λ₯Ό μλΉνλ μμ μ μ¬μ©
import java.util.function.Consumer;
public class Main {
public static void main(String[] args) {
Consumer<String> printUpperCase = str -> System.out.println(str.toUpperCase());
printUpperCase.accept("hello world"); // μΆλ ₯: HELLO WORLD
}
}
βοΈ BiConsumer<T, U>: λ κ°μ μ λ ₯ μΈμ Tμ Uλ₯Ό λ°μ μ²λ¦¬νλ ν¨μ, λ°ν κ°μ μμ
import java.util.function.BiConsumer;
public class Main {
public static void main(String[] args) {
BiConsumer<String, Integer> printNTimes = (str, n) -> {
for (int i = 0; i < n; i++) {
System.out.println(str);
}
};
printNTimes.accept("Hello", 3);
// μΆλ ₯:
// Hello
// Hello
// Hello
}
}
βοΈ Supplier<T>: μ λ ₯ μΈμ μμ΄ κ²°κ³Ό Tλ₯Ό λ°ννλ ν¨μ, μ£Όλ‘ κ°μ μμ±νκ±°λ 곡κΈνλ μμ μ μ¬μ©
import java.util.function.Supplier;
public class Main {
public static void main(String[] args) {
Supplier<Double> randomSupplier = () -> Math.random();
System.out.println("Random number: " + randomSupplier.get()); // μΆλ ₯: Random number: 0.123456789 (μμ)
}
}
βοΈ Predicate<T>: μ λ ₯ μΈμ Tλ₯Ό λ°μ boolean κ°μ λ°ννλ ν¨μ, μ£Όλ‘ μ‘°κ±΄ κ²μ¬μ μ¬μ©
import java.util.function.Predicate;
public class Main {
public static void main(String[] args) {
Predicate<Integer> isEven = num -> num % 2 == 0;
System.out.println("10μ μ§μμ
λκΉ? " + isEven.test(10)); // μΆλ ₯: 10μ μ§μμ
λκΉ? true
System.out.println("15μ μ§μμ
λκΉ? " + isEven.test(15)); // μΆλ ₯: 15μ μ§μμ
λκΉ? false
}
}
βοΈ BiPredicate<T, U>: λ κ°μ μ λ ₯ μΈμ Tμ Uλ₯Ό λ°μ boolean κ°μ λ°ννλ ν¨μ
import java.util.function.BiPredicate;
public class Main {
public static void main(String[] args) {
BiPredicate<Integer, Integer> areBothEven = (a, b) -> a % 2 == 0 && b % 2 == 0;
System.out.println("10κ³Ό 20μ λͺ¨λ μ§μμΈκ°? " + areBothEven.test(10, 20)); // μΆλ ₯: 10κ³Ό 20μ λͺ¨λ μ§μμΈκ°? true
System.out.println("10κ³Ό 15μ λͺ¨λ μ§μμΈκ°? " + areBothEven.test(10, 15)); // μΆλ ₯: 10κ³Ό 15μ λͺ¨λ μ§μμΈκ°? false
}
}
βοΈ UnaryOperator<T>: μ λ ₯ μΈμ Tλ₯Ό λ°μ λμΌν μ νμ κ²°κ³Όλ₯Ό λ°ννλ ν¨μ, μ£Όλ‘ λ¨ν μ°μ° μμ μ μ¬μ©
import java.util.function.UnaryOperator;
public class Main {
public static void main(String[] args) {
UnaryOperator<Integer> square = num -> num * num;
System.out.println("5μ μ κ³±: " + square.apply(5)); // μΆλ ₯: 5μ μ κ³±: 25
}
}
βοΈ BinaryOperator<T>: λ κ°μ μ λ ₯ μΈμ Tλ₯Ό λ°μ λμΌν μ νμ κ²°κ³Όλ₯Ό λ°ννλ ν¨μ, μ£Όλ‘ μ΄ν μ°μ° μμ μ μ¬μ©
import java.util.function.BinaryOperator;
public class Main {
public static void main(String[] args) {
BinaryOperator<Integer> multiply = (a, b) -> a * b;
System.out.println("5 * 10 = " + multiply.apply(5, 10)); // μΆλ ₯: 5 * 10 = 50
}
}
ν¨μν μΈν°νμ΄μ€μ μ₯μ
- κ°κ²°ν μ½λ: λλ€ ννμμ μ¬μ©νλ©΄ μ½λλ₯Ό λ κ°κ²°νκ² μμ±ν μ μμΌλ©°, μ΄λ μ½λμ κ°λ μ±κ³Ό μ μ§ λ³΄μμ±μ λμΈλ€.
- λμ λͺ¨λμ±: ν¨μν νλ‘κ·Έλλ°μ μμ ν¨μμ λμ λͺ¨λμ±μ μ§ν₯νλ€. μ΄λ₯Ό ν΅ν΄ μ½λλ₯Ό μ¬μ¬μ©νκΈ° μ¬μμ§λ©°, ν μ€νΈμ λλ²κΉ μ΄ μ©μ΄ν΄μ§λ€.
- λΆλ³μ±: ν¨μν νλ‘κ·Έλλ°μ μν λ³κ²½μ μ΅μννλ©° λΆλ³ λ°μ΄ν° ꡬ쑰λ₯Ό μ¬μ©νλ€. μ΄λ‘ μΈν΄ μμ μ±μ΄ λμμ§λ©°, λ²κ·Έ λ°μ κ°λ₯μ±μ΄ μ€μ΄λ λ€.
- κ³ μ°¨ ν¨μ μ¬μ©: κ³ μ°¨ ν¨μλ ν¨μλ₯Ό μΈμλ‘ λ°κ±°λ ν¨μλ₯Ό λ°ννλ ν¨μμ΄κΈ°μ, κ³ μ°¨ν¨μλ₯Ό μ¬μ©νμ¬ ν¨μλ₯Ό μ‘°ν©νκ±°λ μΆμννμ¬ κ°λ ₯ν κΈ°λ₯μ ꡬνν μ μλ€.
- μμ°μ€λ¬μ΄ λ³λ ¬ μ²λ¦¬: ν¨μν νλ‘κ·Έλλ°μ λΆμ ν¨κ³Ό(Side Effect)κ° μλ μμ ν¨μλ₯Ό μ νΈνλ―λ‘, λμμ±κ³Ό λ³λ ¬ μ²λ¦¬μ μ ν©νλ€. μ΄λ₯Ό ν΅ν΄ λ©ν°μ½μ΄ μμ€ν μμ μ±λ₯ ν₯μμ μ»μ μ μλ€.
- μ§μ° νκ°: ν¨μν νλ‘κ·Έλλ°μμλ μ§μ° νκ°(Lazy Evaluation)λ₯Ό μ¬μ©ν μ μλ€. μ΄λ₯Ό ν΅ν΄ λΆνμν κ³μ°μ νΌνκ³ , μ±λ₯μ ν₯μμν¬ μ μλ€.
- 컬λ μ μ²λ¦¬μ ν¨μ¨μ±: ν¨μν νλ‘κ·Έλλ°μ 컬λ μ μ²λ¦¬μ λν κ°λ ₯ν λꡬλ₯Ό μ 곡νλ€. μ€νΈλ¦Ό APIλ₯Ό μ¬μ©νλ©΄ 컬λ μ μ μ½κ² μ‘°μνκ³ λ°νν μ μλ€.
λ²μΈ
μΆκ°λ‘ μ κ° μκ³ μΆμλ BiFunctionμ λν΄μ λ μμΈν μ 리νκ² μ΅λλ€.
λ¨Όμ BiFunction μΈν°νμ΄μ€μ μ μλ λ€μκ³Ό κ°μ΅λλ€.
@FunctionalInterface
public interface BiFunction<T, U, R> {
R apply(T t, U u);
}
μ¬κΈ°μ T, U, Rμ μ λ€λ¦ νμ
μ΄λ©°, κ°κ° λ κ°μ μ
λ ₯ μΈμμ λ°ν κ°μ ν΄λΉνλ νμ
μ λνλ
λλ€.
BiFunction μΈν°νμ΄μ€μλ λ€μ λ©μλλ€μ΄ ν¬ν¨λμ΄ μμ΅λλ€.
- apply(T t, U u): λ κ°μ μΈμλ₯Ό λ°μμ κ²°κ³Όλ₯Ό λ°ννλ€. μ΄ λ©μλλ₯Ό ꡬννμ¬ μ€μ μμ μ μννλ λ° μ¬μ©λλ€.
- andThen(Function<? super R, ? extents V> after): μ΄ λ©μλλ νμ¬μ BiFunction μΈμ€ν΄μ€μ λ€λ₯Έ Function μΈμ€ν΄μ€λ₯Ό μ°κ²°νλ©°, νμ¬ μΈμ€ν΄μ€μ κ²°κ³Όλ₯Ό λ€λ₯Έ ν¨μμ μ λ ₯μΌλ‘ μ¬μ©νλ€. λ°λΌμ μ΅μ’ μ μΌλ‘ μλ‘μ΄ BiFunction μΈμ€ν΄μ€λ₯Ό λ°ννλ€.
μμ λ λ€μκ³Ό κ°μ΅λλ€.
import java.util.function.BiFunction;
public class Main {
public static void main(String[] args) {
// BiFunction μΈμ€ν΄μ€ μμ±
BiFunction<Integer, Integer, Integer> adder = (a, b) -> a + b;
// apply λ©μλλ₯Ό μ¬μ©νμ¬ λ μ«μλ₯Ό λν¨
int result = adder.apply(5, 3);
System.out.println("5 + 3 = " + result);
// andThen λ©μλλ₯Ό μ¬μ©νμ¬ λ ν¨μλ₯Ό μ°κ²°
BiFunction<Integer, Integer, Integer> multiplier = (a, b) -> a * b;
Function<Integer, String> toString = num -> "κ²°κ³Ό: " + num;
BiFunction<Integer, Integer, String> combined = adder.andThen(toString);
String combinedResult = combined.apply(5, 3);
System.out.println(combinedResult);
}
}
μΆλ ₯ κ²°κ³Ό
5 + 3 = 8
κ²°κ³Ό: 8
μ μ½λλ λ κ°μ BiFunction μΈμ€ν΄μ€λ₯Ό μμ±νκ³ , apply λ©μλλ₯Ό μ¬μ©νμ¬ λ μ«μλ₯Ό λν λ€μ, andThen λ©μλλ₯Ό μ¬μ©νμ¬ κ²°κ³Όλ₯Ό λ¬Έμμ΄λ‘ λ³ννλ ν¨μμ μ°κ²°ν©λλ€.
import java.util.function.BiFunction;
import java.util.function.Function;
public class Main {
public static void main(String[] args) {
// λ¬Έμμ΄ κ²°ν© BiFunction μΈμ€ν΄μ€ μμ±
BiFunction<String, String, String> concat = (a, b) -> a + b;
// apply λ©μλλ₯Ό μ¬μ©νμ¬ λ λ¬Έμμ΄μ κ²°ν©
String result = concat.apply("Hello, ", "World!");
System.out.println("κ²°κ³Ό: " + result);
// andThen λ©μλλ₯Ό μ¬μ©νμ¬ λλ¬Έμ λ³ν ν¨μλ₯Ό μ°κ²°
Function<String, String> toUpperCase = String::toUpperCase;
BiFunction<String, String, String> combined = concat.andThen(toUpperCase);
// μ°κ²°λ ν¨μλ₯Ό μ¬μ©νμ¬ λ¬Έμμ΄ κ²°ν© λ° λλ¬Έμ λ³ν μν
String combinedResult = combined.apply("hello, ", "world!");
System.out.println(combinedResult);
}
}
μΆλ ₯ κ²°κ³Ό
κ²°κ³Ό: Hello, World!
HELLO, WORLD!
μ μ½λλ λ¬Έμμ΄ κ²°ν©μ μννλ BiFunction μΈμ€ν΄μ€λ₯Ό μμ±ν λ€μ, apply λ©μλλ₯Ό μ¬μ©νμ¬ λ λ¬Έμμ΄μ κ²°ν©ν©λλ€. κ·Έλ° λ€μ andThen λ©μλλ₯Ό μ¬μ©νμ¬ λλ¬Έμ λ³ν ν¨μλ₯Ό μ°κ²°νκ³ , μ°κ²°λ ν¨μλ₯Ό μ¬μ©νμ¬ λ¬Έμμ΄ κ²°ν©κ³Ό λλ¬Έμ λ³νμ λμμ μνν©λλ€.
import java.util.HashMap;
import java.util.Map;
import java.util.function.BiFunction;
public class Main {
public static void main(String[] args) {
// Map μμ± λ° λ°μ΄ν° μ½μ
Map<String, Integer> map = new HashMap<>();
map.put("A", 10);
map.put("B", 20);
map.put("C", 30);
// BiFunction μΈμ€ν΄μ€ μμ±
BiFunction<Map<String, Integer>, String[], Integer> sumValues = (m, keys) -> {
int sum = 0;
for (String key : keys) {
sum += m.getOrDefault(key, 0);
}
return sum;
};
// λ ν€μ λν κ°μ ν©κ³λ₯Ό λ°ν
String[] keys = {"A", "B"};
int result = sumValues.apply(map, keys);
System.out.println("ν€ Aμ ν€ Bμ κ°μ ν©κ³: " + result);
}
}
μΆλ ₯ κ²°κ³Ό
ν€ Aμ ν€ Bμ κ°μ ν©κ³: 30
μ μ½λλ Mapμ λ°μ΄ν°λ₯Ό μ½μ ν ν, λ ν€μ λν κ°μ ν©κ³λ₯Ό λ°ννλ BiFunction μΈμ€ν΄μ€λ₯Ό μμ±ν©λλ€. apply λ©μλλ₯Ό μ¬μ©νμ¬ Mapκ³Ό ν€ λ°°μ΄μ μ λ¬νλ©΄, ν¨μλ ν€ λ°°μ΄μ ν΄λΉνλ κ°λ€μ ν©κ³λ₯Ό λ°νν©λλ€.
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.BiFunction;
public class Main {
public static void main(String[] args) {
// λ κ°μ 리μ€νΈ μμ±
List<Integer> list1 = new ArrayList<>(Arrays.asList(1, 2, 3));
List<Integer> list2 = new ArrayList<>(Arrays.asList(4, 5, 6));
// BiFunction μΈμ€ν΄μ€ μμ±
BiFunction<List<Integer>, List<Integer>, List<Integer>> addLists = (l1, l2) -> {
List<Integer> result = new ArrayList<>();
int size = Math.min(l1.size(), l2.size());
for (int i = 0; i < size; i++) {
result.add(l1.get(i) + l2.get(i));
}
return result;
};
// λ 리μ€νΈμμ λμΌν μΈλ±μ€μ μμλ€μ λν¨
List<Integer> sumList = addLists.apply(list1, list2);
System.out.println("λ 리μ€νΈμ μμλ³ ν©κ³: " + sumList);
}
}
μΆλ ₯ κ²°κ³Ό
λ 리μ€νΈμ μμλ³ ν©κ³: [5, 7, 9]
μ μ½λλ λ κ°μ μ μ 리μ€νΈλ₯Ό μμ±ν ν, λμΌν μΈλ±μ€μ μμλ€μ λνλ BiFunction μΈμ€ν΄μ€λ₯Ό μμ±ν©λλ€. apply λ©μλλ₯Ό μ¬μ©νμ¬ λ 리μ€νΈλ₯Ό μ λ¬νλ©΄, ν¨μλ κ° μΈλ±μ€λ³ ν©κ³λ₯Ό κ°μ§ μλ‘μ΄ λ¦¬μ€νΈλ₯Ό λ°νν©λλ€.
λν Javaμμ μ 곡νλ λ€λ₯Έ ν¨μν μΈν°νμ΄μ€μ μ‘°ν©νμ¬ λ 볡μ‘ν μμ
μ μνν μ μμ΅λλ€. μλ₯Ό λ€μ΄, BiFunctionκ³Ό Function μΈν°νμ΄μ€λ₯Ό ν¨κ» μ¬μ©νμ¬ λ€μν μ
λ ₯ λ° μΆλ ₯ μ νμ μ²λ¦¬νλ νΉμ μμ
μ μ²λ¦¬ν μ μμ΅λλ€.
import java.util.function.BiFunction;
import java.util.function.Function;
public class Main {
public static void main(String[] args) {
// BiFunction μΈμ€ν΄μ€ μμ±
BiFunction<String, Integer, String> repeat = (str, count) -> {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < count; i++) {
sb.append(str);
}
return sb.toString();
};
// Function μΈμ€ν΄μ€ μμ±
Function<String, Integer> countVowels = str -> {
int count = 0;
String vowels = "AEIOUaeiou";
for (char c : str.toCharArray()) {
if (vowels.indexOf(c) != -1) {
count++;
}
}
return count;
};
// λ¬Έμμ΄ λ°λ³΅ λ° λͺ¨μ κ°μ κ³μ°
String repeatedStr = repeat.apply("Hello", 3);
int vowelCount = countVowels.apply(repeatedStr);
System.out.println("λ°λ³΅λ λ¬Έμμ΄: " + repeatedStr);
System.out.println("λͺ¨μ κ°μ: " + vowelCount);
}
}
μΆλ ₯ κ²°κ³Ό
λ°λ³΅λ λ¬Έμμ΄: HelloHelloHello
λͺ¨μ κ°μ: 6
μ μ½λμμλ repeatλΌλ BiFunction μΈμ€ν΄μ€λ₯Ό μμ±νμ¬ λ¬Έμμ΄μ μ£Όμ΄μ§ νμλ§νΌ λ°λ³΅νκ³ , countVowelsλΌλ Function μΈμ€ν΄μ€λ₯Ό μμ±νμ¬ λ¬Έμμ΄μμ λͺ¨μ κ°μλ₯Ό κ³μ°ν©λλ€. κ·Έ ν, λ ν¨μν μΈμ€ν΄μ€λ₯Ό μμ±νμ¬ λ¬Έμμ΄μμ λͺ¨μ κ°μλ₯Ό κ³μ°ν©λλ€. λ°λΌμ μ΅μ’
μ μΌλ‘ λ ν¨μν μΈν°νμ΄μ€λ₯Ό ν¨κ» μ¬μ©νμ¬ λ¬Έμμ΄μ λ°λ³΅ν ν λͺ¨μ κ°μλ₯Ό κ³μ°ν μ μμ΅λλ€.
μ΄μ²λΌ BiFunctionμ λ€λ₯Έ ν¨μν μΈν°νμ΄μ€μ ν¨κ» μ¬μ©νμ¬ μμ
μ μ‘°ν©νκ³ , μ½λμ κ°λ
μ±κ³Ό μ μ°μ±μ ν₯μμν¬ μ μμ΅λλ€. μ΄λ¬ν λ°©μμΌλ‘ ν¨μν νλ‘κ·Έλλ° ν¨λ¬λ€μμ μ΄μ μ μ κ·Ή νμ©νμ¬ μ½λμ μ¬μ¬μ©μ±, ν
μ€νΈ μ©μ΄μ±, μ μ§ κ΄λ¦¬μ±μ λμΌ μ μκΈ°μ μ μμ§ν΄μ μ¬μ©νμΌλ©΄ μ’κ² μ΅λλ€.