2018-6-10 람다와 익명클래스

익명클래스

익명클래스의 형태로 정의하면, 클래스의 정의와 인스턴스의 생성을 하나로 묶을 수 있다.

public Printable getPrinter() {
	return new Printable() { // 익명 클래스의 정의와 인스턴스 생성
    	public void print() {
        	System.out.println(con);
        }
    }
}
package yoon;

interface Printable3 {
    void print();
}

class Papers3 {
    private String con;
    public Papers3(String con) {
        this.con = con;
    }

    public Printable3 getPrinter() {
        return new Printable3() {
            public void print() {
                System.out.println(con);
            }
        };
    }
}

public class UseAnonymousInner {
    public static void main(String[] args) {
        Papers3 p = new Papers3("서류 내용 : 익명클래스 테스트");
        Printable3 prn = p.getPrinter();
        prn.print();
    }
}
//result
서류 내용 : 익명클래스 테스트

람다

package yoon;

interface Printable4 {
    void print(String s);
}

class Printer4 implements Printable4 {
    public void print(String s) {
        System.out.println(s);
    }
}

public class Lambda1 {
    public static void main(String[] args) {
        Printable4 prn = new Printer4();
        prn.print("What is Lambda?");
    }
}
//result
What is Lambda?
  • 여기서는 Printable4과 이를 구현하는 클래스 Printer4의 정의가 핵심이다. 익명클래스를 사용하면 아래와 같이 정의가 된다.

interface Printable5 {
    void print(String s);
}

public class Lambda3 {
    public static void main(String[] args) {
        Printable5 prn = (s) -> { System.out.println(s); };
        prn.print("What is Lambda?");
    }
}
//result
What is Lambda?
  • Printable5 prn = (s) -> { System.out.println(s); }; 이 문장이 바로 람다식이다.
  • 람다와 익명클래스는 다르다. 하지만 둘 다 인스턴스의 생성으로 이어진다.

람다식의 인자 전달

package yoon;
interface Printable6 {
    void print(String s);
}

public class Lambda4 {
    public static void ShowString(Printable6 p, String s) {
        p.print(s);
    }

    public static void main(String[] args) {
        ShowString((s) -> { System.out.println(s); }, "What is Lambda?");
    }
}
//result
What is Lambda?
Written on June 10, 2018