Java & Kotlin

[Java 기능] 객체지향 프로그래밍 vs 람다식

Sue 2022. 2. 14. 22:00

예제 코드

문자열 두개를 연결하여 출력하는 예제

 

StringConcat.java
package ch04;

public interface StringConcat {	// 인터페이스
	
	public void makeString(String s1, String s2);
}

 

StringConcatImple.java
package ch04;

public class StringConcatImple implements StringConcat {	// 인터페이스 구현 클래스

	@Override
	public void makeString(String s1, String s2) {
		System.out.println(s1 +',' + s2);
	}
	
}

 

StringConcatTest.java
package ch04;

public class StringConcatTest {

	public static void main(String[] args) {
		
		String s1 = "Hello";
		String s2 = "World";
		
		StringConcatImple strConcat = new StringConcatImple();	// 클래스 객체 생성하여 메서드 사용
		strConcat.makeString(s1, s2);
		
		StringConcat strConcat2 = (st1, st2) -> System.out.println(s1 +',' + s2);	// 람다식 사용
		strConcat2.makeString(s1,s2);

}

 

 

수행 결과
Hello,World
Hello,World

 

익명 객체를 생성하는 람다식

  • 자바에서는 객체 없이 메서드가 호출될 수 없음
  • 람다식을 구현하면 내부적으로 익명 내부 클래스가 생성되고 이를 통해 익명 객체가 생성됨
  • 람다식 내부에서 외부에 있는 지역변수의 값을 변경하면 오류 발생
StringConcat strConcat3 = new StringConcat() {

    @Override
    public void makeString(String s1, String s2) {	// 익명 내부 클래스
        System.out.println(s1 + "..." + s2);
    }

};

strConcat3.makeString(s1,s2);
}

 

함수를 변수처럼 사용하는 람다식

  • 인터페이스형 변수에 람다식 대입
interface PrintString {
	void showString(String str);
}
PrintString lambdaStr = s->System.out.println(s);	// 람다식을 변수에 대입
lambdaStr.showString("hello lambda");

 

  • 매개변수로 전달하는 람다식
showMyString(lambdaStr);

public static void showMyString(PrintString p) {
	p.showString("hello lambda");
}

 

  • 반환값으로 쓰이는 람다식
public static PrintString returnString() {
	return s->System.out.println(s + "World");
}

PrintString reStr = returnString();
reStr.showString("hello ");