λλ€ ννμ
3.1 λλ€λ 무μμΈκ°?
λ©μλλ‘ μ λ¬ν μ μλ μ΅λͺ ν¨μλ₯Ό λ¨μνν κ²
[νΉμ§]
- μ΅λͺ
보ν΅μ λ©μλμ λ¬λ¦¬ μ΄λ¦μ΄ μμΌλ―λ‘ μ΅λͺ μ΄λΌ νννλ€. - ν¨μ
λλ€λ λ©μλμ²λΌ νΉμ ν΄λμ€μ μ’ μλμ§ μμΌλ―λ‘ ν¨μλΌκ³ λΆλ₯Έλ€. νμ§λ§ λ©μλμ²λΌ νλΌλ―Έν° 리μ€νΈ, λ°λ, λ°ν νμ, κ°λ₯ν μμΈ λ¦¬μ€νΈλ₯Ό ν¬ν¨νλ€. - μ λ¬
λλ€ ννμμ λ©μλ μΈμλ‘ μ λ¬νκ±°λ λ³μλ‘ μ μ₯ν μ μλ€. - κ°κ²°μ±
μ΅λͺ ν΄λμ€μ²λΌ λ§μ μμ§κ΅¬λ ν μ½λλ₯Ό ꡬνν νμκ° μλ€.
λλ€λ₯Ό νμ©νμ¬ λ°κΎΌ μ½λ
Comparator<Apple> byWeight = new Comparator<Apple>() {
public int compare(Apple a1, Apple a2) {
return a1.getWeight().compareTo(a2.getWeight());
}
};
Comparator<Apple> byWeight =
(Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight());
보λ λ°μ κ°μ΄ κΈ°μ‘΄μ μ΅λͺ ν΄λμ€λ³΄λ€ μ½λλ₯Ό ν¨μ¬ κ°κ²°νκ² μΈ μ μλ€.
λλ€ ννμ ꡬμ±μμ
- νλΌλ―Έν° 리μ€νΈ
Comparatorμ compare λ©μλ νλΌλ―Έν°(μ¬κ³Ό λ κ°) - νμ΄ν
νμ΄ν(->)λ λλ€μ νλΌλ―Έν° 리μ€νΈμ λ°λλ₯Ό ꡬλΆνλ€. - λλ€ λ°λ
λ μ¬κ³Όμ 무κ²λ₯Ό λΉκ΅νλ€. λλ€μ λ°νκ°μ ν΄λΉνλ ννμμ΄λ€
(parameters) → expression
(parameters) → { statements; }
3.2 μ΄λμ μ΄λ»κ² λλ€λ₯Ό μ¬μ©ν κΉ?
3.2.1 ν¨μν μΈν°νμ΄μ€
μ νν νλμ μΆμ λ©μλλ₯Ό μ§μ νλ μΈν°νμ΄μ€
μλ₯Ό λ€μ΄ Comprator, Runnable μ΄ μλ€.
μ μμ½λ©μμ λ°°μΈ λ μΈν°νμ΄μ€λ μΆμλ©μλμ μ§ν©μ΄λΌκ³ νλ€.
κ·Όλ° μ¬μ€ μΈν°νμ΄μ€ μμλ λν΄νΈ λ©μλλ μκ³ λ μμλ μκΈ΄νλ°, μ΄μ°λ건 μΆμλ©μλκ° μ€μ§ νλμ΄λ©΄ ν¨μν μΈν°νμ΄μ€λΌλ κ²μ΄λ€.
μ¬κΈ°μ ν¨μν μΈν°νμ΄μ€λ μ΄λ€κ±ΈκΉ?
μ λ΅
- 1λ²
λ체 κ·ΈλΌ ν¨μν μΈν°νμ΄μ€λ‘ λ ν μ μμκΉ?
λλ€ ννμμΌλ‘ μΆμλ©μλμ ꡬνν μ½λλ₯Ό μ§μ μ λ¬ν μ μλ€.
⇒ μ 체 ννμμ ν¨μν μΈν°νμ΄μ€μ μΈμ€ν΄μ€λ‘ μ·¨κΈ
= ν¨μν μΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€μ μΈμ€ν΄μ€
// λλ€ μ¬μ© : μΆμλ©μλ ꡬν
Runnable r1 = () -> System.out.println("Hello World 1")
// μ΅λͺ
ν΄λμ€ μ¬μ©
Runnable r2 = new Runnable() {
public void run() {
System.out.println("Hello World 2");
}
};
public static void process(Runnable r) {
r.run();
}
process(r1);
process(r2);
process(() -> System.out.println("Hello World 3")); // μ§μ μ λ¬ ννμ
3.2.2 ν¨μ λμ€ν¬λ¦½ν°
λ©μλ μκ·Έλμ²λ λ©μλμ μ΄λ¦κ³Ό 맀κ°λ³μ μ΄λ¦μ μ μΈν λλ¨Έμ§μ΄λ€.
μ¦ int sum(int a, double b) , int sum2(int c, double d) μ΄ λ λ©μλλ μλ‘ μκ·Έλμ²κ° κ°λ€.
ν¨μν μΈν°νμ΄μ€μ μΆμ λ©μλ μκ·Έλμ²λ λλ€ ννμμ μκ·Έλμ²λ₯Ό κ°λ¦¬ν¨λ€.
λλ€ ννμμ μκ·Έλμ²λ₯Ό μμ νλ λ©μλλ₯Ό ν¨μ λμ€ν¬λ¦½ν°λΌκ³ νλ€.
public void process(Runnable r){
r.run();
}
process(() -> System.out.println("This is awesome!!"));
μ¬κΈ°μ Runnableμ μΈν°νμ΄μ€μ μ μΌν μΆμλ©μλμΈ runμ μΈμμ λ°νκ°μ΄ μλ€.
λ°λΌμ Runnableμ μΈν°νμ΄μ€λ μΈμμ λ°νκ°μ΄ μλ μκ·Έλμ²μΈ κ²μ΄λ€.
λ°λΌμ λλ€ ννμλ μ΄ μκ·Έλμ²μ λ°λΌ μΈμμ λ°νκ°μ΄ μλ κ²μΌλ‘ μμ±λ κ²μ΄λ€.
StatementμΈ μΆλ ₯ λΆλΆμ {}κ° μ°μ΄μ§ μμ κ²μ νλμ voidλ©μλ νΈμΆμ μ€κ΄νΈλ₯Ό μλ΅νκΈ° λλ¬Έμ΄λ€.
λλ€ ννμμ μ¬λ°λ‘ μ¬μ©ν μ½λκ° λκΉ
μ λ΅
- 1,2λ²
- μ λ΅1λ²μ μκ·Έλμ²λ () → void => Runnableμ΄ μΈμλ λ°νκ°λ μκΈ°λλ¬Έμ μΈμκ° μλμ μ΄λ€.
- 2λ²μ μκ·Έλμ²λ () → String
- 3λ²μ μκ·Έλμ²λ (Apple) → boolean
@FunctionalInterfaceλ?
ν¨μν μΈν°νμ΄μ€μμ κ°λ¦¬ν€λ μ΄λ Έν μ΄μ μ΄λ€.
μ΄κ±°λ‘ μ μΈν΄λκ³ ν¨μν μΈν°νμ΄μ€κ° μλλ©΄ μ»΄νμΌ μλ¬ λ°μνλ€.
3.3 λλ€ νμ© : μ€ν μ΄λΌμ΄λ ν¨ν΄
μμμ²λ¦¬μ μ¬μ©νλ μν ν¨ν΄ : μμμ μ°λ€(μ€μ ) → μ²λ¦¬ → λ«λλ€.(μ 리)
μ¦, μ²λ¦¬νλ μ½λλ μ€μ κ³Ό μ 리 λ κ³Όμ μ΄ λλ¬μΌ νν ⇒ μ€ν μ΄λΌμ΄λ ν¨ν΄
3.3.1 1λ¨κ³ λμ νλΌλ―Έν°νλ₯Ό κΈ°μ΅νλΌ
public String processFile() throws IOException {
try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) {
return br.readLine(); // μ€μ νμν μμ
μ νλ ν
}
}
μλ° 7μ μΆκ°λ try-with-resources ꡬ문 μ¬μ©ν μ½λ.
νμ¬ μ½λλ readLineμ μν΄ ν λ²μ ν μ€λ§ μ½μ μ μλ€
νλ²μ λ μ€μ μ½λ λ±μ λ€λ₯Έ μ²λ¦¬ κ³Όμ μΌλ‘ μ€ννκ³ μΆμ λ μ΄λ»κ² ν΄μΌν κΉ?
κΈ°μ‘΄μ μ€μ , μ 리 κ³Όμ μ μ¬μ¬μ©νκ³ , processFileλ©μλλ§ λ€λ₯Έ λμμ νλλ‘ λͺ λ Ήνλ©΄ λ κ²μ΄λ€.
μ λ§λλ‘ λ°κΏ μ μλλ‘ processFileμ λμμ νλΌλ―Έν°ννλ©΄ λ κ²μ΄λ€.
BufferedReaderλ₯Ό μ΄μ©ν΄μ λ€λ₯Έ λμμ μνν μ μλλ‘ processFile λ©μλλ‘ λμμ μ λ¬ν΄μΌνλ€.
μ€μ νμν μμ μ νλ νμ 보면 BufferedReaderμ μ΄μ©ν΄μ br.readLine()μΌλ‘ Stringμ λ°ννκ³ μλ€.
λ°λΌμ (BufferedReader) → Stringμ ννμ κ°μ λλ€κ° λμ΄μΌν κ²μ΄λ€.
κ·Έλ¬λκΉ μΈμλ‘ μ§κΈ μ무κ²λ μ λ°κ³ μλλ°, μ¬μ€μ λμ νλΌλ―Έν°νλ₯Ό μν΄μλ μΈμλ‘ BuffferedReaderκ° νμν κ²μ΄λ€.
μλ₯Όλ€μ΄ μ΅μ’ μ μΌλ‘ λ νμ μΆλ ₯νλ λλ€ ννμμ μ΄λ°μμΌλ‘ λ°κΏ μ μμ΄μΌνλ€.
String result = processFile(BufferedReader br) -> br.readLine() + br.readLine());
3.3.2 2λ¨κ³ : ν¨μν μΈν°νμ΄μ€λ₯Ό μ΄μ©ν΄μ λμ μ λ¬
κ·Όλ° μ°λ¦¬κ° λλ€λ₯Ό νμ©νλ €λ©΄ ν¨μν μΈν°νμ΄μ€μ ꡬν체λ‘μ μ΄λ€κ³ λ°°μ λ€.
public String processFile() throws IOException {
try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) {
return br.readLine(); // μ€μ νμν μμ
μ νλ ν
}
}
μ΄ μ μ½λμμ 보면 리ν΄κ°μ΄ Stringμ΄κ³ , IOExceptionμ λμ§ μλ μμ΄μΌνλ€.
λ°λΌμ (BufferedReader) → Stringκ³Ό IOExceptionμ λμ§ μ μλ μκ·Έλμ²μ μΌμΉνλ ν¨μν μΈν°νμ΄μ€λ₯Ό λ§λ€μ΄μΌ νλ€.
@FunctionalInterface
public interface BufferReaderProcessor {
String process(BufferedReader b) throws IOException;
}
// μ μν μΈν°νμ΄μ€λ₯Ό processFileλ©μλμ μΈμλ‘ μ λ¬ ν μ μλ€.
public String processFile(BufferedReaderProcessor p) throws IOException {
//...
}
3.3.3 3λ¨κ³ : λμ μ€ν
μ μ΄μ BufferedReaderProcessorμ process λ©μλμ μκ·Έλμ²μ μΌμΉνλ λλ€λ₯Ό μ λ¬ν μ μλ€.
μ΄λ κ² νλ©΄ ν¨μν μΈν°νμ΄μ€μ μΆμλ©μλμΈ processλ₯Ό λλ€λ‘ ꡬ체νν΄μ processFileμμ μ€νν μ μκ²λλ€.
public String processFile(BufferedReaderProcessor p) throws IOEXception {
try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) {
return p.process(br); // λλ€κ° λ€μνκ² κ΅¬νν΄μ λκΈΈ μ²λ¦¬μ½λ (BufferedReader κ°μ²΄ μ²λ¦¬)
}
}
3.3.4 4λ¨κ³: λλ€ μ λ¬
μ΄μ λλ€λ₯Ό μ΄μ©ν΄μ λ€μν λμμ processFile λ©μλλ‘ μ λ¬ ν μ μλ€.
// ν ν μ²λ¦¬μ½λ
String oneLine = processFile((BufferedReader br) -> br.readLine());
// λ ν μ²λ¦¬μ½λ
String twoLine = processFile((BufferedReader br) -> br.readLine()+br.readLine();
(BufferedReader br) -> br.readLine() μ΄λΆλΆμμ BufferReaderProcessorλ₯Ό ꡬννκ³ , μ΄ κ΅¬ν체λ₯Ό processFileμ λ겨μ μ€ννλ κ³Όμ μ΄ μμ±λμλ€.
μ΄λ° μμΌλ‘ λ€μν λλ€λ₯Ό μ λ¬νλλ° μ¬νμ©ν μ μλλ‘ μλ°8μ μΆκ°λ μλ‘μ΄ μΈν°νμ΄μ€λ€μ΄ μλ€.
→ λ€μμ μμ보μ.
*λͺ¨λμλ°μΈμ‘μ μ 리ν κΈμ λλ€