π¦ chap2. λμ νλΌλ―Έν°ν μ½λ μ λ¬νκΈ°
λ³ννλ μꡬμ¬νμ μννΈμ¨μ΄ μμ§λμ΄λ§μμ νΌν μ μλ λ¬Έμ μ΄λ€.
μμκ°κ° λ³νλ μ¬μ©μ μꡬμ¬νμ μ΄λ»κ² λμν΄μΌ ν κΉ?
2.1 λ³ννλ μꡬμ¬νμ λμνκΈ°
2.1.1 첫 λ²μ§Έ μλ : λ Ήμ μ¬κ³Ό νν°λ§
μ¬κ³Ό μμ μ μνλ λ€μ enum μ΄ μ‘΄μ¬νλ€κ³ νμ
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
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;
}
κ·Έλ°λ° λλΆκ° λ λ³μ¬νμ¬ λ¬΄κ²κ° 150g μ΄μμΈ μ¬κ³Όλ₯Ό ꡬλ³νκ³ μΆλ€κ³ νλ©΄?
λ¬΄κ² μ 보 νλΌλ―Έν°λ μΆκ°νλ€.
1
2
3
4
5
6
7
8
9
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) μμΉμ μ΄κΈ°λ κ²μ΄λ€.
2.1.3 μΈ λ²μ§Έ μλ : κ°λ₯ν λͺ¨λ μμ±μΌλ‘ νν°λ§
μμ΄λ λ¬΄κ² μ€ μ΄λ€ κ²μΌλ‘ νν°λ§ν μ§ κ°λ¦¬ν€λ νλκ·Έλ₯Ό μ ν μλ μλ€.
(νμ§λ§ μ€μ μμλ μ λ μ΄ λ°©λ²μ μ¬μ©ν΄μλ μλλ€)
1
2
3
4
5
6
7
8
9
10
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;
}
ννΈμλ μ½λμ΄λ€. true false κ° λ체 무μμ μλ―Ένλ κ²μΈμ§ μ μ μλ€.
λ³ννλ μꡬμ¬νμ μ μ°νκ² λμν μλ μλ€.
2.2 λμ νλΌλ―Έν°ν
μ°Έ λλ κ±°μ§μ λ°ννλ ν¨μλ₯Ό Predicate λΌκ³ νλ€.
μ ν 쑰건μ κ²°μ νλ μΈν°νμ΄μ€λ₯Ό μ μνλ€.
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 λ©μλκ° λ€λ₯΄κ² λμν κ²μ΄λΌκ³ μμν μ μλ€.
μ΄λ₯Ό μ λ΅ λμμΈ ν¨ν΄(Strategy design pattern) μ΄λΌκ³ νλ€.
μ λ΅ λμμΈ ν¨ν΄μ μ λ΅μ΄λΌ λΆλ¦¬λ κ° μκ³ λ¦¬μ¦μ μΊ‘μν νλ μκ³ λ¦¬μ¦ ν¨λ°λ¦¬λ₯Ό μ μν΄ λ λ€μμ
λ°νμμ μκ³ λ¦¬μ¦μ μ ννλ κΈ°λ²μ΄λ€.
μ¬κΈ°μμλ ApplePredicate κ° μκ³ λ¦¬μ¦ ν¨λ°λ¦¬μ΄κ³
AppleHeavyWeightPredicate μ AppleGreenColorPredicate κ° μ λ΅μ΄λ€.
λμ νλΌλ―Έν°ν, μ¦ λ©μλκ° λ€μν λμ λλ μ λ΅μ λ°μμ λ΄λΆμ μΌλ‘ λ€μν λμμ μνν μ μλ€.
2.2.1 λ€ λ²μ§Έ μλ : μΆμμ 쑰건μΌλ‘ νν°λ§
1
2
3
4
5
6
7
8
9
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;
}
μ°λ¦¬λ filterApples λ©μλμ λμμ νλΌλ―Έν°ν νλ€.
μ΄λ μ½λλ₯Ό λ©μλμ μ λ¬ν κ²μ΄λ λ€λ¦μλ€.
νμ§λ§ μ¬λ¬ ν΄λμ€λ₯Ό ꡬνν΄μ μΈμ€ν΄μ€ννλ κ³Όμ μ΄ μ‘°κΈμ κ±°μΆμ₯μ€λ½λ€.
μ΄ λΆλΆμ μ΄λ»κ² κ°μ ν μ μμκΉ
2.3 볡μ‘ν κ³Όμ κ°μν
νμ¬λ filterApples λ©μλλ‘ μλ‘μ΄ λμμ μ μνλ €λ©΄ ApplePredicate μΈν°νμ΄μ€λ₯Ό ꡬννλ μ¬λ¬ ν΄λμ€λ₯Ό μ μν λ€μμ μΈμ€ν΄μ€νν΄μΌ νλ€. μ΄λ μλΉν λ²κ±°λ‘κ³ μκ° λλΉμ΄λ€.
ν΄λμ€μ μ μΈκ³Ό μΈμ€ν΄μ€νλ₯Ό λμμ μνν μ μλλ‘ μ΅λͺ ν΄λμ€λΌλ κΈ°λ²μ μ¬μ©ν΄λ³΄μ.
2.3.1 μ΅λͺ ν΄λμ€
μ΅λͺ ν΄λμ€λ₯Ό μ΄μ©νλ©΄ ν΄λμ€ μ μΈκ³Ό μΈμ€ν΄μ€νλ₯Ό λμμ ν μ μλ€.
2.3.2 λ€μ― λ²μ§Έ μλ : μ΅λͺ ν΄λμ€ μ¬μ©
1
2
3
4
5
List<Apple> redApples = filterApples(inventory, new ApplePredicate() {
public boolean test(Apple apple) {
return RED.equals(apple.getColor());
}
}
μ΅λͺ ν΄λμ€λ‘λ μμ§ λΆμ‘±ν μ μ΄ μλ€. μ΅λͺ ν΄λμ€λ μ¬μ ν λ§μ 곡κ°μ μ°¨μ§νλ€.
μ½λμ μ₯ν©ν¨μ λμ νΉμ±μ΄λ€. ꡬννκ³ μ μ§λ³΄μνλ λ° μκ°μ΄ μ€λ κ±Έλ¦¬κ³ μ½λ μ¦κ±°μμ λΉΌμλλ€.
2.3.3 μ¬μ― λ²μ§Έ μλ : λλ€ ννμ μ¬μ©
μλ° 8μ λλ€ ννμμ μ΄μ©ν΄μ κ°λ¨νκ² μ¬κ΅¬νν μ μλ€.
1
2
List<Apple> redApples = filterApples(inventory,
(Apple apple) -> RED.equals(apple.getColor()));
κ°κ²°ν΄μ§λ©΄μ λ¬Έμ λ₯Ό λ μ μ€λͺ νλ μ½λκ° λμλ€.
2.3.4 μΌκ³± λ²μ§Έ μλ : 리μ€νΈ νμμΌλ‘ μΆμν
1
2
3
4
5
6
7
8
9
10
11
12
public interface Predicate<T> {
boolean test(T t);
}
public static <T> List<T> filter(List<T> list, Predicate<T> p) {
List<T> result = new ArrayList<>();
for(T e: list) {
if(p.test(e)) {
result.add(e);
}
}
}
μ΄μ λ°λλ, μ€λ μ§, μ μ, λ¬Έμμ΄ λ±μ 리μ€νΈμ νν° λ©μλλ₯Ό μ¬μ©ν μ μλ€.
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);
2.4 μ€μ μμ
2.4.1 Comparatorλ‘ μ λ ¬νκΈ°
컬λ μ μ λ ¬μ λ°λ³΅λλ νλ‘κ·Έλλ° μμ μ΄λ€.
μλ° 8μ Listμλ sort λ©μλκ° ν¬ν¨λμ΄ μλ€.
λ€μκ³Ό κ°μ μΈν°νμ΄μ€λ₯Ό κ°λ java.util.Comparator
κ°μ²΄λ₯Ό μ΄μ©νμ¬
sort μ λμμ νλΌλ―Έν°νν μ μλ€.
1
2
3
public interface Comparator<T> {
int compare(T o1, T o2);
}
μ΄λ₯Ό μ΄μ©ν΄μ 무κ²κ° μ μ μμλ‘ μ¬κ³Όλ₯Ό μ λ ¬ν μ μλ€.
1
2
3
4
5
inventory.sort(new Comparator<Apple>() {
public int compare(Apple a1, Apple a2) {
return a1.getWeight().compareTo(a2.getWeight());
}
}
λλ€λ₯Ό μ¬μ©ν΄μ κ°λ¨νκ² μ½λλ₯Ό ꡬνν μ μλ€.
1
2
inventory.sort(
(Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight()));
2.4.2 Runnableλ‘ μ½λ λΈλ‘ μ€ννκΈ°
μλ° μ€λ λλ₯Ό μ΄μ©νλ©΄ λ³λ ¬ μ½λ λΈλ‘ μ€νμ΄ κ°λ₯νλ€.
μλ° 8κΉμ§λ Thread μμ±μμ κ°μ²΄λ§μ μ λ¬ν μ μμκΈ° λλ¬Έμ λ³΄ν΅ κ²°κ³Όλ₯Ό λ°ννμ§ μλ void run λ©μλλ₯Ό ν¬ν¨νλ μ΅λͺ ν΄λμ€κ° μΈν°νμ΄μ€λ₯Ό ꡬννλλ‘ νλ κ²μ΄ μΌλ°μ μ΄μλ€.
μλ°μμλ Runnable μΈν°νμ΄μ€λ₯Ό μ΄μ©νμ¬ μ€νν μ½λ λΈλ‘μ μ§μ ν μ μλ€.
1
2
3
public interface Runnable {
void run();
}
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μ κ²°κ³Όλ‘ λ°ννκΈ°
μλ° 5λΆν° μ§μνλ ExecutorService
μΈν°νμ΄μ€λ νμ€ν¬ μ μΆκ³Ό μ€ν κ³Όμ μ μ°κ΄μ±μ λμ΄μ€λ€. μ΄λ₯Ό μ΄μ©νλ©΄ νμ€ν¬λ₯Ό μ€λ λ νλ‘ λ³΄λ΄κ³ κ²°κ³Όλ₯Ό Future
λ‘ μ μ₯ν μ μλ€.
1
2
3
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
Buttin button = new Button("Send");
button.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {
label.setText("Sent!!");
}
});
λλ€λ₯Ό μ¬μ©νλ©΄
1
button.setOnAction((ActionEvent event) -> label.setText("Sent!!"));