πΉ chap2. λμ νλΌλ―Έν°ν μ½λ μ λ¬νκΈ°
- λμ νλΌλ―Έν°ν(behavior parameterization)
μμ§μ μ΄λ»κ² μ€νν κ²μΈμ§ κ²°μ νμ§ μμ μ½λ λΈλ‘
μ΄ μ½λ λΈλ‘μ μ€νμ λμ€μΌλ‘ λ―Έλ€μ§κ³ , κ²°κ³Όμ μΌλ‘ μ½λ λΈλ‘μ λ°λΌ λ©μλμ λμμ΄ νλΌλ―Έν°νλ¨
2.1 λ³ννλ μꡬμ¬νμ λμνκΈ°
μ¬κ³Ό λμ₯μ μ¬κ³ νμ μ μν 리μ€νΈ νν°λ§ κΈ°λ₯μ μμλ‘ νλ€.
2.1.1 첫 λ²μ§Έ μλ : λ Ήμ μ¬κ³Ό νν°λ§
μ¬κ³Ό μμ μ μνλ Color numμ΄ μ‘΄μ¬νλ€.
1
enum Color { RED, GREEN }
첫 λ²μ§Έ μλ κ²°κ³Ό μ½λμ΄λ€.
1
2
3
4
5
6
7
8
9
public static List<Apple> filterGreenApples(List<Apple> inventory) {
List<Apple> result = new ArrayList<>(); // μ¬κ³Ό λμ 리μ€νΈ
for (Apple apple : inventory) {
if **(GREEN.equals(apple.getColor())** { // λ
Ήμ μ¬κ³Όλ§ μ ν
result.add(apple);
}
}
return result;
}
κ΅΅κ² λ λΆλΆμ λ Ήμ μ¬κ³Όλ₯Ό μ ννλ λ° νμν 쑰건μ΄λ€.
κ·Έλ°λ° λλΆκ° λ³μ¬νμ¬ λ Ήμ μ¬κ³Ό λ§κ³ λΉ¨κ° μ¬κ³Όλ νν°λ§ νκ³ μΆμ΄μ‘λ€. λ©μλλ₯Ό 볡μ¬νμ¬ filterRedApplesλΌλ μλ‘μ΄ λ©μλλ₯Ό λ§λ€κ³ , ifλ¬Έμ 쑰건μ λΉ¨κ° μ¬κ³Όλ‘ λ°κΏ μ μμ§λ§, λμ€μ λ λ€μν μμΌλ‘ νν°λ§ νλ λ±μ λ³νμ μ μ νκ² λμν μ μλ€.
β κ±°μ λΉμ·ν μ½λκ° λ°λ³΅ μ‘΄μ¬νλ€λ©΄ κ·Έ μ½λλ₯Ό μΆμν νλ€.
2.1.2 λ λ²μ§Έ μλ : μμ νλΌλ―Έν°ν
μμ νλΌλ―Έν°νν μ μλλ‘ λ©μλμ νλΌλ―Έν°λ₯Ό μΆκ°νλ©΄ λ³ννλ μꡬμ¬νμ μ’ λ μ μ°νκ² λμνλ μ½λλ₯Ό λ§λ€ μ μλ€.
1
2
3
4
5
6
7
8
9
10
public static List<Apple> filterApplesByColor(List<Apple> inventory, Color color)
{
List<Apple> result = new ArrayList<>();
for (Apple apple : inventory) {
if **(apple.getColor().equals(color))** {
result.add(apple);
}
}
return result;
}
λ€μμ²λΌ ꡬνν λ©μλλ₯Ό νΈμΆνλ€.
1
2
List<Apple> greenApples = filterApplesByColor(inventory, GREEN);
List<Apple> redApples = filterApplesByColor(inventory, RED);
κ°μκΈ° μ¬κΈ°μ λλΆκ° βμ μ΄μΈμλ μ¬κ³Όλ₯Ό 무κ²λ‘ ꡬλΆν μ μλ€λ©΄ μ’κ² λ€βλΌλ μꡬλ₯Ό νλ€.
λ€μν 무κ²μ λμν μ μλλ‘ λ¬΄κ² μ 보 νλΌλ―Έν°λ μΆκ°νλ€.
1
2
3
4
5
6
7
8
9
10
public static List<Apple> filterApplesByWeight(List<Apple> inventory, int weight)
{
List<Apple> result = new ArrayList<>();
for (Apple apple : inventory) {
if **(apple.getWeight() > weight)** {
result.add(apple);
}
}
return result;
}
μμ μ½λλ₯Ό 보면 μ νν°λ§ μ½λμ λλΆλΆ μ€λ³΅λλ€. μ΄λ μννΈμ¨μ΄ 곡νμ DRY(donβt repeat yourself) μμΉμ μ΄κΈ°λ κ²μ΄λ€.
μκ³Ό 무κ²λ₯Ό filterλΌλ λ©μλλ‘ ν©μΉλ λ°©λ²μ΄ μμ§λ§ μ΄λ μ΄λ€ κΈ°μ€μΌλ‘ μ¬κ³Όλ₯Ό νν°λ§ν μ§ κ΅¬λΆνλ λ λ€λ₯Έ λ°©λ²μΌλ‘ νλκ·Έλ₯Ό μΆκ°ν΄μΌνλ€. νμ§λ§ μ€μ μμλ μ λ μ΄ λ°©λ²μ μ¬μ©νμ§ λ§μμΌ νλ€.
2.1.3 μΈ λ²μ§Έ μλ : κ°λ₯ν λͺ¨λ μμ±μΌλ‘ νν°λ§
λ€μμ λͺ¨λ μμ±μ λ©μλ νλΌλ―Έν°λ‘ μΆκ°ν μ½λμ΄λ€.(νμ§ λ§μμΌ ν μ§)
1
2
3
4
5
6
7
8
9
10
11
public static 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;
}
μ€ν μ½λ
1
2
List<Apple> greenApples = filterApples(inventory, GREEN, 0, true);
List<Apple> heavyApples = filterApples(inventroy, null, 150, false);
μ μ½λλ₯Ό λ΄€μ λ trueμ falseκ° λ¬΄μμ μλ―Ένλμ§ νμ νκΈ° μ΄λ ΅κ³ , μμΌλ‘ μꡬμ¬νμ΄ λ°λμμ λ μ μ°νκ² λμν μλ μλ€. λ§μ½ ν¬κΈ°, λͺ¨μ, μΆνμ§ λ±μΌλ‘ νν°λ§ νκ³ μΆλ€λ©΄ κ²°κ΅ μ€λ³΅λ νν° λ©μλλ₯Ό λ§λ€κ±°λ, λͺ¨λ κ²μ μ²λ¦¬νλ κ±°λν νλμ νν° λ©μλλ₯Ό ꡬνν΄μΌ νλ€.
2.2 λμ νλΌλ―Έν°ν
νλ λμΌμ΄νΈ : μ°Έ λλ κ±°μ§μ λ°ννλ ν¨μ
μ ν 쑰건μ κ²°μ νλ μΈν°νμ΄μ€λ₯Ό μ μνμ.
1
2
3
public interface ApplePredicate {
boolean test (Apple apple);
}
λ€μκ³Ό κ°μ΄ λ€μν μ ν 쑰건μ λννλ μ¬λ¬ λ²μ μ ApplePredicateλ₯Ό μ μν μ μλ€.
1
2
3
4
5
public class AppleHeavyWeightPredicate implements ApplePredicate {
public boolean test(Apple apple) {
return apple.getWeight() > 150;
}
}
1
2
3
4
5
public class AppleGreenColorPredicate implements ApplePredicate {
public boolean test(Apple apple) {
return GREEN.equals(apple.getColor());
}
}
μ 쑰건μ λ°λΌ filter λ©μλκ° λ€λ₯΄κ² λμν κ²μ΄λΌκ³ μμν μ μκ³ , μ΄λ₯Ό μ λ΅ λμμΈ ν¨ν΄ μ΄λΌκ³ νλ€.
- μ λ΅ λμμΈ ν¨ν΄
κ° μκ³ λ¦¬μ¦(μ λ΅μ΄λΌ λΆλ¦¬λ)μ μΊ‘μννλ μκ³ λ¦¬μ¦ ν¨λ°λ¦¬λ₯Ό μ μν΄λ λ€μμ λ°νμμ μκ³ λ¦¬μ¦μ μ ννλ κΈ°λ²
μμμλ ApplePredicateκ° μκ³ λ¦¬μ¦ ν¨λ°λ¦¬μ΄κ³ , AppleHeavyWeightPredicateμ AppleGreenColorPredicateκ° μ λ΅μ΄λ€.
μ΄μ filterApplesμμ ApplePredicateμ κ°μ²΄λ₯Ό λ°μ μ νμ 쑰건μ κ²μ¬νλλ‘ λ©μλλ₯Ό κ³ μ³μΌνλ€. μ΄λ κ² λμ νλΌλ―Έν°ν, μ¦ λ©μλκ° λ€μν λμ(λλ μ λ΅)μ λ°μ λ΄λΆμ μΌλ‘ λ€μν λμμ μνν μ μλ€.
2.2.1 λ€ λ²μ§Έ μλ : μΆμμ 쑰건μΌλ‘ νν°λ§
λ€μμ ApplePredicateλ₯Ό μ΄μ©ν νν° λ©μλμ΄λ€.
1
2
3
4
5
6
7
8
9
10
public static List<Apple> filterApples(List<Apple> inventroy, **ApplePredicate p**)
{
List<Apple> result = new ArrayList<>();
for (Apple apple : inventory) {
if (p.test(apple)) { // νλ λμΌμ΄νΈ κ°μ²΄λ‘ μ¬κ³Ό κ²μ¬ 쑰건μ μΊ‘μν
result.add(apple);
}
}
return result;
}
μ½λ/λμ μ λ¬νκΈ°
μ΄μ λλΆμ κ²μ 쑰건μ λ°λΌ ApplePredicateλ₯Ό μ μ ν ꡬννλ ν΄λμ€λ§ λ§λ€λ©΄ λλ€. μ΄μ Appleμ μμ±κ³Ό κ΄λ ¨ν λͺ¨λ λ³νμ λμν μ μλ μ μ°ν μ½λλ₯Ό μ€λΉν κ²μ΄λ€.
150κ·Έλ¨μ΄ λλ λΉ¨κ° μ¬κ³Όλ₯Ό κ²μν΄λ¬λΌ
1
2
3
4
5
6
7
8
public class AppleRedAndHeavyPredicate implements ApplePredicate {
public boolean test(Apple apple) {
return RED.equals(apple.getColor()) && apple.getWeight() > 150;
}
}
List<Apple> redAndHeeavyApples =
filterApples(inventory, new AppleRedAndHeavyPredicate());
μ λ¬ν ApplePredicate κ°μ²΄μ μν΄ filterApples λ©μλμ λμμ΄ κ²°μ λλ€. μ¦, filterApples λ©μλμ λμμ νλΌλ―Έν°νν κ²μ΄λ€.
filterApples λ©μλμ μλ‘μ΄ λμμ μ μνλ κ²μ΄ test λ©μλμ΄λ€. λ©μλλ κ°μ²΄λ§ μΈμλ‘ λ°μΌλ―λ‘ test λ©μλλ₯Ό ApplePredicate κ°μ²΄λ‘ κ°μΈμ μ λ¬ν΄μΌ νλ€.
ν κ°μ νλΌλ―Έν°, λ€μν λμ
- λμ νλΌλ―Έν°νμ κ°μ
Quiz. μ μ°ν prettyPrintApple λ©μλ ꡬννκΈ°
μ¬κ³Ό 리μ€νΈλ₯Ό μΈμλ‘ λ°μ λ€μν λ°©λ²μΌλ‘ λ¬Έμμ΄μ μμ±(컀μ€ν°λ§μ΄μ¦λ λ€μν toString λ©μλμ κ°μ΄)ν μ μλλ‘ νλΌλ―Έν°νλ prettyPrintApple λ©μλλ₯Ό ꡬννμμ€. μλ₯Ό λ€μ΄ prettyPrintApple λ©μλκ° κ°κ°μ μ¬κ³Ό 무κ²λ₯Ό μΆλ ₯νλλ‘ μ§μν μ μλ€. νΉμ κ°κ°μ μ¬κ³Όκ° 무거μ΄μ§ κ°λ²Όμ΄μ§ μΆλ ₯νλλ‘ μ§μν μ μλ€. prettyPrintApple λ©μλλ μ§κΈκΉμ§ μ΄ν΄λ³Έ νν°λ§ μμ μ λΉμ·ν λ°©λ²μΌλ‘ ꡬνν μ μλ€. μ’ λ μ½κ² λ¬Έμ λ₯Ό ν΄κ²°ν μ μλλ‘ λλ΅μ μΈ μ½λλ₯Ό 곡κ°νλ€.
1 2 3 4 5 6
public static void prettyPrintApple(List<Apple> inventory, ???) { for (Apple apple: inventory) { String output = ???.???(apple); System.out.println(output); } }
μ λ΅
μ°μ Appleμ μΈμλ‘ λ°μ μ ν΄μ§ λ¬Έμμ΄λ‘ λ°νν μλ¨μ΄ μμ΄μΌ νλ€. ApplePredicate μΈν°νμ΄μ€λ₯Ό μκ°ν΄λ³΄μ.
1 2 3
public interface AppleFormatter { String accept(Apple a); }
μ΄μ AppleFormatter μΈν°νμ΄μ€λ₯Ό ꡬνν΄ μ¬λ¬ ν¬λ§· λμμ λ§λ€ μ μλ€.
1 2 3 4 5 6 7 8 9 10 11 12
public class AppleFancyFormatter implements AppleFormatter { public String accept(Apple apple) { String characteristic = apple.getWeight() > 150 ? "heavy" : "light"; return "A " + characteristic + " " + apple.getColor() + " apple"; } public class AppleSimpleFormatter implements AppleFormatter( public String accept(Apple apple) { return "An apple of " + apple.getWeight() + "g"; } }
λ§μ§λ§μΌλ‘ prettyPrintApple λ©μλκ° AppleFormatter κ°μ²΄λ₯Ό μΈμλ‘ λ°μ λ΄λΆμ μΌλ‘ μ¬μ©νλλ‘ μ§μνλ€. μ¦, prettyPrintAppleμ νλΌλ―Έν°λ₯Ό μΆκ°νλ€.
1 2 3 4 5 6 7
public static void prettyPrintApple(List<Apple> inventory, AppleFormatter formatter) { for (Apple apple : inventory) { String output = formatter.accept(apple); System.out.println(output); } }
μ΄μ λ€μν λμμ prettyPrintApple λ©μλλ‘ μ λ¬ν μ μλ€. AppleFormatterμ ꡬνμ κ°μ²΄νν λ€μμ prettyPrintAppleμ μΈμλ‘ μ λ¬νλ€.
1
prettyPrintAppple(inventory, new AppleFancyFormatter());
μ½λ μ€ν κ²°κ³Όλ λ€μκ³Ό κ°λ€.
1 2
A light green apple A heavy red apple
λλ λ€μκ³Ό κ°μ΄ ꡬννλ€.
1
prettyPrintApple(inventory, new AppleSimpleFormatter());
λ€μμ μ½λ μ€ν κ²°κ³Όμ΄λ€.
1 2
An apple of 80g An apple of 155g
λμμ μΆμν νμ¬ λ³ννλ μꡬμ¬νμ λμνλ μ½λλ₯Ό ꡬννμ§λ§, μ¬λ¬ ν΄λμ€λ₯Ό ꡬνν΄μ μΈμ€ν΄μ€ννλ κ³Όμ μ κ°μ ν λ°©λ²μ μμ보μ.
2.3 볡μ‘ν κ³Όμ κ°μν
[ λμ νλΌλ―Έν°ν : νλ λμΌμ΄νΈλ‘ μ¬κ³Ό νν°λ§ ] μμ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
// λ¬΄κ±°μ΄ μ¬κ³Ό μ ν public class AppleHeavyWeightPreidicate implements ApplePredicate { public boolean test(Apple apple) { return apple.getWeight() > 150; } } // λ Ήμ μ¬κ³Ό μ ν public class AppleGreenColorPredicate implements ApplePredicate { public boolean test(Apple apple) { return GREEN.equals(apple.getColor()); } } public class FilteringApples { public static void main(String...args) { List<Apple> inventory = Arrays.asList(new Apple(80, GREEN), new Apple(155, GREEN), new Apple(120, RED)); List<Apple> heavyApples = // κ²°κ³Ό 리μ€νΈλ 155κ·Έλ¨μ μ¬κ³Ό νκ°λ₯Ό ν¬ν¨νλ€. filterApples(inventory, new AppleHeavyWeightPredicate()); List<Apple> greenApples = // κ²°κ³Ό 리μ€νΈλ λ Ήμ μ¬κ³Ό λ κ°λ₯Ό ν¬ν¨νλ€. filterApples(inventory, new AppleGreenColorPredicate()); } public static List<Apple> filterApples(List<Apple> inventory, ApplePredicate p) { List<Apple> result = new ArrayList<>(); for (Apple apple: inventory) { if (p.test(apple)) { result.add(apple); } } return result; } }
λ‘μ§κ³Ό κ΄λ ¨ μλ μ½λκ° λ§μ΄ μΆκ°λμ΄μλ€.
μλ°λ ν΄λμ€μ μ μΈκ³Ό μΈμ€ν΄μ€νλ₯Ό λμμ μνν μ μλλ‘ μ΅λͺ ν΄λμ€λΌλ κΈ°λ²μ μ 곡νλ€. μ΅λͺ ν΄λμ€λ₯Ό μ΄μ©νλ©΄ μ½λμ μμ μ€μΌ μ μλ€. (νμ§λ§ λλ€ ννμμ μ¬μ©ν μλ μμ)
2.3.1 μ΅λͺ ν΄λμ€
μλ°μ μ§μ ν΄λμ€(λΈλ‘ λ΄λΆμ μ μΈλ ν΄λμ€)μ λΉμ·ν κ°λ μΌλ‘ λ§ κ·Έλλ‘ μ΄λ¦μ΄ μλ ν΄λμ€λ€.
μ΅λͺ ν΄λμ€λ₯Ό μ΄μ©νλ©΄ ν΄λμ€ μ μΈκ³Ό μΈμ€ν΄μ€νλ₯Ό λμμ ν μ μλ€.
μ¦, μ¦μμμ νμν ꡬνμ λ§λ€μ΄ μ¬μ©ν μ μλ€.
2.3.2 λ€μ― λ²μ§Έ μλ : μ΅λͺ ν΄λμ€ μ¬μ©
λ€μμ μ΅λͺ ν΄λμ€λ₯Ό μ΄μ©ν΄μ ApplePredicateλ₯Ό ꡬννλ κ°μ²΄λ₯Ό λ§λλ λ°©λ²μΌλ‘ νν°λ§ μμ λ₯Ό λ€μ ꡬνν μ½λλ€.
1
2
3
4
5
6
List<Apple> redApples = filterApples(inventory, new ApplePredicate() {
// filterApples λ©μλμ λμμ μ§μ νλΌλ―Έν°ν νλ€!
public boolean test(Apple apple) {
return RED.equals(apple.getColor());
}
}
GUI μ ν리μΌμ΄μ μμ μ΄λ²€νΈ νΈλ€λ¬ κ°μ²΄λ₯Ό ꡬνν λ μ΅λͺ ν΄λμ€κ° μ’ μ’ μ¬μ©λλ€.
- μ΅λͺ
ν΄λμ€μ λΆμ‘±ν μ
λ§μ κ³΅κ° μ°¨μ§
1 2 3 4 5 6 7 8 9 10
List<Apple> redApples = filterApples(inventory, new ApplePredicate() { public boolean test(Apple a) { return RED.equals(a.getColor()); } }); button.setOnAction(new EventHandler<ActionEvent>() { public void handle(ActionEvent event) { System.out.println("Whoooo a click!!"); } }
μ½λκ° λ°λ³΅λμ΄ μ§μ λΆνλ€.
λ§μ νλ‘κ·Έλλ¨Έκ° μ΅λͺ ν΄λμ€ μ¬μ©μ μ΅μνμ§ μλ€.
μ₯ν©ν μ½λλ ꡬννκ³ μ μ§λ³΄μνλ λ° μκ°μ΄ μ€λ 걸릴 λΏ μλλΌ μ½λ μ¦κ±°μλ λΊλλ€.
ν λμ μ΄ν΄ν μ μμ΄μΌ μ’μ μ½λλ€.
2.3.3 μ¬μ― λ²μ§Έ μλ : λλ€ ννμ μ¬μ©
μλ° 8μ λλ€ ννμμ μν΄ μ΄μ μμ μ½λλ₯Ό κ°λ¨νκ² μ¬κ΅¬νν μ μλ€.
1
2
List<Apple> result =
filterApples(inventory, (Apple apple) -> RED.equals(apple.getColor()));
2.3.4 μΌκ³± λ²μ§Έ μλ : 리μ€νΈ νμμΌλ‘ μΆμν
1
2
3
4
5
6
7
8
9
10
11
12
13
public interface Predicate<T> {
boolean test(T t);
}
public static <T> List<T> filter(List<T> list, Predicate<T> p) {//νμ νλΌλ―Έν° pλ±μ₯
List<T> result = new ArrayList<>();
for (T e: list) {
if (p.test(e)) {
result.add(e);
}
}
return result;
}
λ€μμ λλ€ ννμμ μ¬μ©ν μμ λ€.
1
2
3
4
5
List<Apple> redApples =
filter(inventory, (Apple apple) -> RED.equals(apple.getColor()));
List<Integer> evenNumbers =
filter(numbers, (Integer i) -> i % 2 == 0);
μλ° 8 μ΄νλΆν° κ°λ₯ν μ½λμ΄λ€.
2.4 μ€μ μμ
2.4.1 Comparatorλ‘ μ λ ¬νκΈ°
μλ° 8μ Listμλ sort λ©μλκ° ν¬ν¨λμ΄ μλ€(λ¬Όλ‘ Collections.sortλ μ‘΄μ¬).
λ€μκ³Ό κ°μ μΈν°νμ΄μ€λ₯Ό κ°λ java.util.Comparator κ°μ²΄λ₯Ό μ΄μ©ν΄μ sortμ λμμ νλΌλ―Έν°ν ν μ μλ€.
1
2
3
4
// java.util.Comparator
public interface Comparator<T> {
int compare(T o1, T o2);
}
Comparatorλ₯Ό ꡬνν΄μ sort λ©μλμ λμμ λ€μνν μ μλ€.
μ΅λͺ ν΄λμ€λ₯Ό μ΄μ©ν΄ 무κ²κ° μ μ μμλ‘ μ¬κ³Όλ₯Ό μ λ ¬
1 2 3 4 5
inventory.sort(new Comparator<Apple>() { public int compare(Apple a1, Apple a2) { return a1.getWeight().compareTo(a2.getWeight()); } });
μꡬμ¬νμ΄ λ³κ²½λλ©΄ μλ‘μ΄ μꡬμ¬νμ λ§λ Comparatorμ λ§λ€μ΄ sortμ μ λ¬νλ€.
λλ€ ννμμΌλ‘ λ³κ²½
1 2
inventory.sort( (Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight()));
2.4.2 Runnableλ‘ μ½λ λΈλ‘ μ€ννκΈ°
μλ° μ€λ λλ₯Ό μ΄μ©νλ©΄ λ³λ ¬λ‘ μ½λ λΈλ‘μ μ€νν μ μλ€.
μλ° 8κΉμ§λ Thread μμ±μμ κ°μ²΄λ§μ μ λ¬ν μ μμμΌλ―λ‘ λ³΄ν΅ κ²°κ³Όλ₯Ό λ°ννμ§ μλ void run λ©μλλ₯Ό ν¬ν¨νλ μ΅λͺ ν΄λμ€κ° Runnable μΈν°νμ΄μ€λ₯Ό ꡬννλλ‘ νλ κ²μ΄ μΌλ°μ μΈ λ°©λ²μ΄μλ€.
μλ°μμλ Runnable μΈν°νμ΄μ€λ₯Ό μ΄μ©ν΄μ μ€νν μ½λ λΈλ‘μ μ§μ ν μ μλ€.
1
2
3
4
// java.lang.Runnable
public interface Runnable {
void run();
} // μ½λ λΈλ‘ μ€ν κ²°κ³Ό void
Runnableμ μ΄μ©ν΄μ λ€μν λμμ μ€λ λλ‘ μ€ν κ°λ₯νλ€.
1
2
3
4
5
Thread t = new Thread(new Runnable() {
public void run() {
System.out.println("Hello world");
}
});
μλ° 8λΆν° μ§μνλ λλ€ ννμμ μ΄μ©νλ©΄ λ€μμ²λΌ μ€λ λ μ½λλ₯Ό ꡬνν μ μλ€.
1
Thread t = new Thread(() -> System.out.println("Hello world"));
2.4.3 Callableμ κ²°κ³Όλ‘ λ°ννκΈ°
- ExecutorService(μΈν°νμ΄μ€)
- μλ° 5λΆν° μ§μνλ μΆμν κ°λ
- νμ€ν¬ μ μΆκ³Ό μ€ν κ³Όμ μ μ°κ΄μ±μ λμ΄μ€
- νμ€ν¬λ₯Ό μ€λ λ νλ‘ λ³΄λ΄κ³ κ²°κ³Όλ₯Ό Futureλ‘ μ μ₯ κ°λ₯(μ€λ λμ Runnableμ μ΄μ©νλ λ°©μκ³Ό λ€λ¦)
Callable μΈν°νμ΄μ€λ₯Ό μ΄μ©ν΄ κ²°κ³Όλ₯Ό λ°ννλ νμ€ν¬λ₯Ό λ§λ λ€. (Runnableμ μ κ·Έλ μ΄λ λ²μ )
1
2
3
4
// java.util.concurrent.Callable
public interface Callable<V> {
V call();
}
μλ μ½λμμ λ³Ό μ μλ―μ΄ μ€ν μλΉμ€μ νμ€ν¬λ₯Ό μ μΆν΄μ μ μ½λλ₯Ό νμ©ν μ μλ°. λ€μ μμ λ νμ€ν¬λ₯Ό μ€ννλ μ€λ λμ μ΄λ¦μ λ°ννλ€.
1
2
3
4
5
6
7
ExecutorService executorService = Executors.newCachedThreadPool();
Future<String> threadName = executorService.submit(new Callable<String>() {
@Override
public String call() throws Exception {
return Thread.currentThread().getName();
}
});
λλ€λ₯Ό μ΄μ©νλ©΄ λ€μμ²λΌ μ½λλ₯Ό μ€μΌ μ μλ€.
1
2
Future<String> threadName = executorService.submit(
() -> Thread.currentThread().getName());
2.4.4 GUI μ΄λ²€νΈ μ²λ¦¬νκΈ°
- GUI νλ‘κ·Έλλ°
- λ§μ°μ€ ν΄λ¦, λ¬Έμμ΄ μλ‘ μ΄λ λ±μ μ΄λ²€νΈ λμ λμ μν΄
- λ³νμ λμν μ μλ μ μ°ν μ½λ νμ(λͺ¨λ λμμ λ°μν΄μΌν¨)
μλ°FXμμλ setOnAction λ©μλμ EventHandlerλ₯Ό μ λ¬ν¨μΌλ‘μ¨ μ΄λ²€νΈμ μ΄λ»κ² λ°μν μ§ μ€μ κ°λ₯
1
2
3
4
5
6
Button button = new Button("Send");
button.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {
label.setText("Sent!!");
}
});
μ¦, EventHandlerλ setOnAction λ©μλμ λμμ νλΌλ―Έν°ννλ€. λλ€ννμμ λ€μκ³Ό κ°λ€.
1
button.setOnAction((ActionEvent event) -> label.setText("Sent!!"));
2.5 λ§μΉλ©°
- λμ νλΌλ―Έν°νμμλ λ©μλ λ΄λΆμ μΌλ‘ λ€μν λμμ μνν μ μλλ‘ μ½λλ₯Ό λ©μλ μΈμλ‘ μ λ¬νλ€.
- λμ νλΌλ―Έν°νλ₯Ό μ΄μ©νλ©΄ λ³ννλ μꡬμ¬νμ λ μ λμν μ μλ μ½λλ₯Ό ꡬνν μ μμΌλ©° λμ€μ μμ§λμ΄λ§ λΉμ©μ μ€μΌ μ μλ€.
- μ½λ μ λ¬ κΈ°λ²μ μ΄μ©νλ©΄ λμμ λ©μλμ μΈμλ‘ μ λ¬ν μ μλ€. νμ§λ§ μλ° 8 μ΄μ μλ μ½λλ₯Ό μ§μ λΆνκ² κ΅¬νν΄μΌ νλ€. μ΅λͺ ν΄λμ€λ‘λ μ΄λ μ λ μ½λλ₯Ό κΉλνκ² λ§λ€ μ μμ§λ§ μλ° 8μμλ μΈν°νμ΄μ€λ₯Ό μμλ°μ μ¬λ¬ ν΄λμ€λ₯Ό ꡬνν΄μΌ νλ μκ³ λ₯Ό μμ¨ μ μλ λ°©λ²μ μ 곡νλ€.
- μλ° APIμ λ§μ λ©μλλ μ λ ¬, μ€λ λ, GUI μ²λ¦¬ λ±μ ν¬ν¨ν λ€μν λμμΌλ‘ νλΌλ―Έν°νν μ μλ€.