λμ νλΌλ―Έν°λ₯Ό μμλκΉ?
νλ‘κ·Έλλ° μ μ¬μ©νλ "λμ"μ μλμ κ°μ κ²μ μλ―Έν©λλ€.
aμ bλ₯Ό κ³±νλ ν¨μκ° μλ€κ³ ν΄λ΄ μλ€.
def multiply_numbers(a, b):
result = a * b
return result
μ΄ ν¨μλ νλΌλ―Έν°λ‘ λ°μ κ³±νλ "λμ"μ νλλ°μ©,
aμ bμ κ°μ λ°λΌμ multiply_numbers ν¨μμ κ²°κ³Ό κ°μ λ¬λΌμ§κ² λ©λλ€.
μ΄λ, aμ bλ₯Ό λμ νλΌλ―Έν°λΌκ³ νλ κ±°μμ΄~
result1 = multiply_numbers(2, 3) # a=2, b=3μ μ λ¬νμ¬ 2 * 3 = 6μ΄ λ°νλ¨
result2 = multiply_numbers(5, 7) # a=5, b=7μ μ λ¬νμ¬ 5 * 7 = 35κ° λ°νλ¨
μ΄λ κ² λ§μ΄μ Έ.
aμ bμ κ°μ λ°λΌ result κ°μ΄ λ¬λΌμ§κ² λ©λλ€.
μ¦, λμ νλΌλ―Έν°λ
ν¨μλ λ©μλμ νΈμΆ μ μ λ¬λλ κ°μΌλ‘,
ν΄λΉ ν¨μ λλ λ©μλμ λμμ μ μ΄νκ±°λ μ‘°μ νλ λ° μ¬μ©λ©λλ€.
κ·Έλ¬λ©΄ λμ νλΌλ―Έν°νκ° λ¬΄μμΈμ§,
Java 8μ λμ νλΌλ―Έν°νλ‘ λ¬΄μμ ν μ μλμ§!!
Modern Java In Action μ± μ μ°Έκ³ λ‘ μ 리ν΄λ³΄λ €κ³ ν©λλ€
μ°λ¦¬κ° κ°λ°μ ν λ κ³ λ―Όνλ λ΄μ©μ μλμ κ°μ΅λλ€.
π μ μ§λ³΄μκ° μ¬μμΌ νκ³ μλ‘μ΄ κΈ°λ₯μ΄ μΆκ°λ λ μ½κ² ꡬνμ΄ λμ΄μΌ νλ€.
π λ³κ²½λλ μꡬμ¬νμ ν¨κ³Όμ μΌλ‘ λμν΄μΌ ν λ°©λ²μ΄ νμνλ€.
λμ νλΌλ―Έν°ν
μμ§ μ΄λ»κ² μ€νλ μ§ κ²°μ λμ§ μμ μ½λ λΈλ‘.
μ½λ λΈλ‘μ λ°λΌ λ©μλ λμμ΄ νλΌλ―Έν°ν λλ€.
첫 λ²μ§Έ μλ: λ Ήμ μ¬κ³Ό νν°λ§
public List<Apple> filterGreenApples(List<Apple> inventory) {
List<Apple> result = new ArrayList<>();
for (Apple apple : inventory) {
if(Color.GREEN.equals(apple.getColor())) {
result.add(apple);
}
}
return result;
}
public class Apple {
private final Color color;
Apple(Color color) {
this.color = color;
}
public Color getColor() { return this.color;}
}
λ Ήμ μ¬κ³Όλ₯Ό νν°λ§νκ³ μΆλ€~λ ν¨μμ λλ€.
νλΌλ―Έν°λ‘ λ°μ inventoryμμ κΊΌλΈ μ¬κ³Όμ μμκ³Ό GREENμΈμ§ λΉκ΅λ₯Ό νκ³ μλ€.
λ§μ½ λΉ¨κ° μ¬κ³Όλ₯Ό νν°λ§νκ³ μΆλ€λ©΄? μμμ΄ 3000κ° λμ΄λλ€λ©΄?
μΆμνλ₯Ό ν΄λ³΄μ
λ λ²μ§Έ μλ: μμ νλΌλ―Έν°ν
@Test
@DisplayName("λ
Ήμ μ¬κ³Ό νν°λ§")
void filterGreenApples() {
List<Apple> inventory = new ArrayList<>();
inventory.add(new Apple(Color.GREEN));
inventory.add(new Apple(Color.GREEN));
inventory.add(new Apple(Color.RED));
inventory.add(new Apple(Color.RED));
inventory.add(new Apple(Color.GREEN));
inventory.add(new Apple(Color.GREEN));
// 첫 λ²μ§Έ μλ
// assertEquals(4, filterGreenApples(inventory).size());
// λ λ²μ§Έ μλ
assertEquals(2, filterGreenApples(inventory, Color.RED).size());
}
public List<Apple> filterGreenApples(List<Apple> inventory, Color color) {
List<Apple> result = new ArrayList<>();
for (Apple apple : inventory) {
if(color.equals(apple.getColor())) { // color.GREEN λμ color νλΌλ―Έν°μ λΉκ΅!
result.add(apple);
}
}
return result;
}
public class Apple {
private final Color color;
Apple(Color color) {
this.color = color;
}
public Color getColor() { return this.color;}
}
νλΌλ―Έν°λ‘ μμμ λ°λλ‘ λ³κ²½νλ€
λ§μ½ μμλΏλ§ μλλΌ μ¬κ³Όμ 무κ²λ νν°λ§μ νκ³ μΆλ€λ©΄?
public List<Apple> filterGreenApplesByWeight(List<Apple> inventory, int weight) {
List<Apple> result = new ArrayList<>();
for (Apple apple : inventory) {
if(apple.getWeight() > weight) {
result.add(apple);
}
}
return result;
}
무κ²λ₯Ό νν°λ§νλ ν¨μκ° μΆκ°λλ€
inventoryμμ μ¬κ³Όλ₯Ό κΊΌλ΄μ, λ°λ³΅λ¬Έμ λλ©° μμμ νν°λ§νλ λΆλΆμ΄ μ€λ³΅λλ€.
DRY (don't repeat yourself) μμΉμ μ΄κΈλ μ½λμμ΄~
μΈ λ²μ§Έ μλ: κ°λ₯ν λͺ¨λ κ²½μ°μ μλ‘ νν°λ§νλ€
public List<Apple> filterApples(List<Apple> inventory, Color color, int weight, boolean flag) {
List<Apple> result = new ArrayList<>();
for (Apple apple : inventory) {
if( (flag && apple.getColor().equals(color)) ||
(!flag && apple.getWeight() > weight)) {
result.add(apple);
}
}
return result;
}
flagκ° λλ°μμ΄ λ±μ₯
μ± μμλ ννΈμλ μ½λλΌκ³ ν΄μ μκ²Όλ€
μ΄λ€ κΈ°μ€μΌλ‘ μ¬κ³Όλ₯Ό νν°λ§ν κ±΄μ§ ν¨κ³Όμ μΌλ‘ μ λ¬νλ λ°©λ²μ΄ νμνλ€
→ λμ νλΌλ―Έν°νλ‘ μ μ°μ±μ μ»μ.
public interface ApplePredicate {
boolean test (Apple apple);
}
μ΄λ€ μμ±μ κΈ°μ΄ν΄μ μ°Έκ³Ό κ±°μ§μ λ°ννλ νλ λμΌμ΄νΈ μΈν°νμ΄μ€λ₯Ό μμ±νλ€.
μΈν°νμ΄μ€λ₯Ό μμλ°μμ κΈ°λ₯μ λΆλ¦¬ν΄ 보μ.
Predicateλ μ£Όλ‘ μ‘°κ±΄μ κ²μ¬νμ¬ μ°Έ λλ κ±°μ§μ νλ¨νλ ν¨μμ΄λ€.
public class AppleHeavyWeightPredicate implements ApplePredicate {
@Override
public boolean test(Apple apple) {
return false;
}
}
public class AppleGreenColorPredicate implements ApplePredicate {
@Override
public boolean test(Apple apple) {
return false;
}
}
μ λ΅ λμμΈ ν¨ν΄μ μ¬μ©ν μμ μ΄λ€.
ApplePredicateμ΄ → μκ³ λ¦¬μ¦ ν¨λ°λ¦¬
μμλ°μ μ λ€μ΄ → μ λ΅μ΄ λλ κ²μ΄λ€.
μμμ λ³Έ ν¨μ filterApples() μμ κ°μ²΄λ₯Ό λ°μμ 쑰건μ κ²μ¬νλλ‘ λ°κΎΈλ©΄ λμμ΄~
λ©μλκ° λ€μν λμμ νκ² λλ€ → μ΄κ² λμ νλΌλ―Έν°νμμ΄~
μ λ΅ λμμΈ ν¨ν΄
μΊ‘μννλ μκ³ λ¦¬μ¦ ν¨λ°λ¦¬λ₯Ό μ μνκ³ λ°νμ μ μκ³ λ¦¬μ¦μ΄ μ ν
λ€ λ²μ§Έ μλ: μΆμμ 쑰건μΌλ‘ νν°λ§
public List<Apple> filterApples(List<Apple> inventory, ApplePredicate applePredicate) {
List<Apple> result = new ArrayList<>();
for (Apple apple : inventory) {
if(applePredicate.test(apple))
result.add(apple);
}
return result;
}
Predicate κ°μ²΄λ‘ μ¬κ³Ό κ²μ¬ 쑰건μ μΊ‘μνν μμ μ΄λ€.
μ λ¬ν ApplePredicate κ°μ²΄μ μν΄ ν¨μμ λμμ΄ κ²°μ λλ€.
λ©μλμ λμμ΄ νλΌλ―Έν°ν λμλ€λ κ²μ΄λ€.
...
κ·Όλ° λ§μ½ λΉ¨κ° λ¬΄κ±°μ΄ μ¬κ³Όλ₯Ό νν°λ§νκ³ μΆλ€λ©΄?
public class AppleRedHeavyPredicate implements ApplePredicate {
@Override
public boolean test(Apple apple) {
/**
* λ‘μ§
*/
return false;
}
}
μ΄λ° ν΄λμ€λ€μ΄ κ³μν΄μ μΆκ°κ° λ κ²μ΄λ€.
μ€λ³΅μ μ΄λ»κ² μ€μ΄κ³ 볡μ‘νμ§ μκ² λ§λ€ μ μμκΉ?λ₯Ό κ³ λ―Όν΄μΌ νλ€.
볡μ‘ν κ³Όμ κ°μνν΄ λ³΄μ
κ°μννκΈ° μν λ°©λ²μΌλ‘ μ΅λͺ ν΄λμ€μ λλ€κ° μλ€.
κ·Έμ€, μ΅λͺ ν΄λμ€λ μλμ κ°μ μλ―Έλ₯Ό κ°μ§λ€.
μ΅λͺ ν΄λμ€ ( Anonymous Class)
μ½λμ μμ μ€μΌ μ μλ€
μλ°μ μ§μ ν΄λμ€μ λΉμ·ν κ°λ μΌλ‘, μ΄λ¦μ΄ μλ μ΅λͺ μΈ ν΄λμ€λ λ»μ΄λ€
ν΄λμ€ μ μΈκ³Ό μΈμ€ν΄μ€νλ₯Ό λμμ ν μ μλ€
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// λ²νΌμ΄ ν΄λ¦λμμ λ μνλλ μ½λ
}
});
λ²νΌμ΄ λλ Έμ λ μ€νλ μ½λλ₯Ό μ μνμλ€.
λ³λμ ν΄λμ€ μ΄λ¦μ κ°μ§ μλλ€.
λ€μ― λ²μ§Έ μλ: μ΅λͺ ν΄λμ€
μ΅λͺ ν΄λμ€λ₯Ό μ΄μ©ν΄μ λ€μ ꡬν
λ©μλ λμμ μ΅λͺ ν΄λμ€λ‘ λ§λ€μ΄μ μ§μ νλΌλ―Έν°ν νλ€.
μ΅λͺ ν΄λμ€λ‘ μμ±ν΄ μ£Όλ©΄, μΈν 리μ μ΄μμ λλ€λ₯Ό μΆμ²ν΄ μ€λ€.
μΉμ ν΄ π
μ¬μ― λ²μ§Έ μλ: λλ€ ννμ
List<Apple> greenApples = filterApples(inventory, apple -> false);
λ§€μ° κΉκΌΌ..
λλ€λ λ€μ κΈμμ λ€μ μμΈν λ€λ£¨κ² λ€.
μΌκ³± λ²μ§Έ μλ: 리μ€νΈ νμμΌλ‘ μΆμν
void filterList() {
List<Apple> inventory = new ArrayList<>();
List<Apple> redApples = filter(inventory, (Apple apple) -> Color.RED.equals(apple.getColor()));
}
public static <T> List<T> filter(List<T> list, Predicate<T> predicate) {
List<T> result = new ArrayList<>();
for (T t : list) {
if(predicate.test(t)) {
result.add(t);
}
}
return result;
}
νμ νλΌλ―Έν° Tλ‘ ν΄λμ€λ₯Ό μμ±ν μλ μλ€.
νν° λ©μλλ₯Ό μ¬μ©νμ¬, μ¬κ³ΌλΏλ§ μλλΌ λ°λλ, μ€λ μ§ λ±λ±μ μ¬μ©ν μ μλ€.
μ€μ μμ
κ·Έλ λ€λ©΄ λμ νλΌλ―Έν°νλ₯Ό λ€λ£¨λ μ€μ μμ λ₯Ό λ΄λ³΄μ.
1) Comparatorλ‘ μ λ ¬νκΈ°
μλ° 8μ Listμ sort λ©μλκ° ν¬ν¨λμ΄ μλ€
Collections.sortλ λ¬Όλ‘ μμ
java.util.Comparator κ°μ²΄λ₯Ό μ΄μ©ν΄μ sort λμμ νλΌλ―Έν°ν ν μ μλ€
List<Apple> inventory = new ArrayList<>();
List<Apple> redApples = filter(inventory, (Apple apple) -> Color.RED.equals(apple.getColor()));
inventory.sort(new Comparator<Apple>() {
@Override
public int compare(Apple o1, Apple o2) {
return o1.getWeight() > o2.getWeight() ? o1.getWeight() : o2.getWeight();
}
});
μ΅λͺ ν΄λμ€λ₯Ό μ¬μ©ν μμ μ΄λ€.
λ§μ½ λλΆμ μꡬμ¬νμ΄ λ°λλ©΄
μλ‘μ΄ Comparatorλ₯Ό λ§λ€μ΄μ sort λ©μλμ μ λ¬ν΄ μ£Όλ©΄ λλ€.
inventory.sort((o1, o2) -> o1.getWeight() > o2.getWeight() ? o1.getWeight() : o2.getWeight());
λλ€λ‘ λ°κΎΈλ©΄ μ΄λ κ² ν μ μλ€.
2) Runnableλ‘ μ½λ λΈλ‘ μ€ννκΈ°
λ λ€λ₯Έ μμ λ₯Ό λ΄λ³΄μ.
μλ° μ€λ λλ₯Ό μ΄μ©νλ©΄ Runnableλ‘ μ½λ λΈλ‘μ λ³λ ¬λ‘ μ€νν μ μλ€.
μ¬λ¬ μ€λ λκ° κ°μ λ€λ₯Έ μ½λλ₯Ό μ€νν μ μλ€λ λ»μ΄λ€.
μλ° 8 μ΄μ κΉμ§λ Thread μμ±μμ κ°μ²΄λ§μ μ λ¬ν μ μμΌλ―λ‘
λ³΄ν΅ κ²°κ³Όλ₯Ό λ°ν μ νλ void run κ°μ λ©μλλ₯Ό ν¬ν¨νλ μ΅λͺ ν΄λμ€κ°
Runnable μΈν°νμ΄μ€λ₯Ό ꡬννλλ‘ νλ κ² μΌλ°μ μ΄μλ€κ³ νλ€.
void threadTest() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("FilterGreenApples.run");
}
});
}
λλ€λ‘ λ°κΎΈλ©΄
void threadTest() {
Thread thread = new Thread(() -> System.out.println("FilterGreenApples.run"));
}
3) Callableλ₯Ό κ²°κ³Όλ‘ λ°ννκΈ°
ExecutorService (μλ° 5λΆν° μ§μ.)
ExecutorServiceλ μ€λ λ νμ κ΄λ¦¬νκ³ μ€λ λ μμ μ μ€ννλ λ° μ¬μ©λλ μΈν°νμ΄μ€λ€.
μ€λ λ κ΄λ¦¬ λ° μμ μ€μΌμ€λ§μ μΆμννκ³ ν¨κ³Όμ μΌλ‘ λ€λ£° μ μλλ‘ λμμ€.
ExecutorServiceμλ λͺ κ°μ§ μΆμν κ°λ μ΄ μμ.
1) μ€λ λ ν
ExecutorServiceλ μ€λ λ νμ μ¬μ©νμ¬ μμ μ μ²λ¦¬ν¨.
미리 μ€λ λ ν μμ±ν΄ λκ³ , μμ μ λΆλ°°ν΄μ μ€λ λλ₯Ό μ¬μ¬μ©ν μ μλλ‘ ν΄μ€.
μ€λ λμ μμ± λ° μλ©Έμ λ°λ₯Έ μ€λ²ν€λλ₯Ό κ°μμν€κ³ ν¨μ¨μ±μ λμ¬μ€.
2) μμ ν
μμ μ νμ λ£μ΄λκ³ μ€λ λ νμ΄ μ΄λ₯Ό κΊΌλ΄μ΄ μ€νν¨.
μμ νλ μ€λ λκ° μ¬μ© κ°λ₯ν λλ§λ€ μμ μ κΊΌλ΄μ΄ μ€ννκ² λ¨.
μ΄λ¬λ©΄ λκ° μ’μΌλ? μ¬λ¬ μμ μ λΉλκΈ°μ μΌλ‘ μ²λ¦¬ν μ μλ€~
3) μμ μ€νκ³Ό μ’ λ£
ExecutorServiceλ submit() λ©μλλ₯Ό ν΅ν΄ μμ μ μ μΆνκ³ ,
μμ μ΄ μλ£λ λκΉμ§ κΈ°λ€λ¦¬κ±°λ κ²°κ³Όλ₯Ό λ°μ μ μλ Future κ°μ²΄λ₯Ό λ°νν¨.
μ’ λ£λ shutdown() λλ shutdownNow() λ©μλλ‘ νλ€.
→ Runnable λ°©μκ³Ό λ€λ₯Έ μ μ΄λΉ
4) μ€λ λ μλͺ μ£ΌκΈ° κ΄λ¦¬
ExecutorServiceλ μ€λ λ μλͺ μ£ΌκΈ°λ₯Ό μλμΌλ‘ κ΄λ¦¬κΉμ§ νλ€;;
μ€λ λλ₯Ό μμ±νκ³ μ’ λ£νλ©°, μμΈκ° λ°μν κ²½μ°μλ μ μ ν μ²λ¦¬ν μ μμ΅λλ€.
void callableTest() {
ExecutorService executorService = Executors.newCachedThreadPool();
Future<String> future = executorService.submit(new Callable<String>() {
@Override
public String call() throws Exception {
return Thread.currentThread().getName();
}
});
}
νΉλ€λ‘ λ°κΏμ£Όλ©΄?
void callableTest() {
ExecutorService executorService = Executors.newCachedThreadPool();
Future<String> future = executorService.submit(() -> Thread.currentThread().getName());
}
μ΄λ¬νλ€.
κ²°λ‘
λμ νλΌλ―Έν°νμμλ μ½λλ₯Ό λ©μλ μΈμλ‘ μ λ¬νλ€.
λ©μλ λ΄λΆμ μΌλ‘ λ€μν λμμ μνν μ μλλ‘ νκΈ° μν΄μμ΄λ€.
μꡬμ¬νμ μ λμνμ¬ μμ§λμ΄λ§ λΉμ© κ°μνμ.
μλ° 8λ‘ μ€λ©°, μ΅λͺ ν΄λμ€μ λλ€ λ±μ μ΄μ©ν΄μ μ½λλ₯Ό κΉλνκ² λ°κΏ μ μλ€!!
μ λ ¬, μ€λ λ, GUI μ²λ¦¬ λ±μ λ€μν λμμΌλ‘ νλΌλ―Έν°ν ν μ μλ€.
'π Java&Spring > λͺ¨λμλ°μΈμ‘μ ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[λͺ¨λμλ°μΈμ‘μ ] Stream μ€νΈλ¦Ό νμ© (4) | 2024.03.26 |
---|---|
[λͺ¨λμλ°μΈμ‘μ ] Stream μ€νΈλ¦Ό (6) | 2023.12.17 |
[λͺ¨λμλ°μΈμ‘μ ] λλ€ (Lambda) (4) | 2023.12.03 |