본문 바로가기
Programming Language/Java

[자바] 람다식 활용

by ggyongi 2021. 10. 27.
반응형

- 람다식으로 인터페이스 구현

람다식으로 인터페이스를 구현할 때 클래스를 따로 생성할 필요 없이 바로 메서드를 구현함.

람다식을 활용한 경우와 그렇지 않은 경우를 비교해보자.

package first_project;

public interface StringConcat {
	public void makeString(String s1, String s2);
}

 

1. 람다식 사용하지 않고 클래스에서 인터페이스 구현

package first_project;

public class StringConCatImpl implements StringConcat {

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

 

package first_project;

public class TestStringConcat {

	public static void main(String[] args) {
		String s1 = "Hello";
		String s2 = "World";
		StringConCatImpl concat1 = new StringConCatImpl();
		concat1.makeString(s1, s2);
	}

}

 

2. 람다식으로 인터페이스 구현

람다식을 활용하면 인터페이스 구현 클래스를 따로 생성할 필요가 없다. 

package first_project;

public class TestStringConcat {

	public static void main(String[] args) {
		String s1 = "Hello";
		String s2 = "World";
		StringConcat concat2 = (s, v) -> System.out.println(s+", "+v);
		concat2.makeString(s1, s2);
	}

}

 

! 꼭 알아두어야 할 점

람다식으로 구현하려면 메서드를 하나만 포함하는 함수형 인터페이스만 가능하다. 람다식은 이름이 없는 익명 함수로 구현하기 때문에 인터페이스에 메서드가 여러개면 어떤 메서드를 구현한 것인지 애매해지기 때문.

따라서 아래와 같은 예시는 함수형 인터페이스가 아님.

public interface MyNumber{
    int getMax(int num1, int num2);
    int add(int num1, int num2);
}

 

 

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

람다식은 객체없이 인터페이스 구현만으로 메서드를 호출할 수 있다. 자바는 객체 생성없이 메서드 호출이 일어날 수 없는데 이게 어떻게 가능할까?

우리는 앞서 익명 내부 클래스를 배웠다. 익명 내부 클래스는 클래스 이름 없이 인터페이스 자료형 변수에 바로 메서드 구현부를 생성하여 대입할 수 있다. 

즉 람다식으로 메서드를 구현해서 호출하면 컴퓨터 내부에서는 다음처럼 익명 클래스가 생성되고 이를 통해 익명 객체가 생성되는 것이다. 

StringConcat concat3 = new StringConcat(){
    @override
    public void makeString(String s1, String s2){
        System.out.println(s+", "+v);
    }
};

 

 

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

프로그램에서 변수를 사용하는 경우는 크게 세 가지.

1. 특정 자료형으로 변수 선언 후 값 대입하여 사용 ex) int a = 10;

2. 매개변수로 전달하기 ex) int add(int x, int y);

3. 메서드의 반환 값으로 반환하기 ex) return num;

람다식으로 구현된 메서드도 변수에 대입하여 사용할 수 있고, 매개변수로 전달하고 반환할 수 있다.

 

1. 인터페이스형 변수에 람다식 대입하기

앞서 해본 것과 같다.

interface PrintString {
    void showString(String str);
}

 

PrintString lambdaStr = s -> System.out.println(s); // 인터페이스형 변수에 람다식 대입
lambdaStr.showString("hello lamda_1");

 

2. 매개 변수로 전달하는 람다식

람다식을 변수에 대입하면 이를 매개변수로 전달할 수 있음. 이때 전달되는 매개변수의 자료형은 인터페이스형.

package first_project;

interface PrintString{
	void showString(String str);
}

public class TestLambda {

	public static void main(String[] args) {
		PrintString lambdaStr = s -> System.out.println(s);
		lambdaStr.showString("hello lamda_1");
		showMyString(lambdaStr); // 메서드의 매개변수로 람다식을 대입한 변수 전달
	}
	
	public static void showMyString(PrintString p) { // 매개변수를 인터페이스형으로 받음
		p.showString("hello lamda_2");
	}
}

결과

hello lamda_1
hello lamda_2

 

3. 반환 값으로 쓰이는 람다식

메서드의 반환형을 람다식의 인터페이스형으로 선언하면 구현한 람다식을 반환할 수 있음

package first_project;

interface PrintString{
	void showString(String str);
}

public class TestLambda {

	public static void main(String[] args) {
		PrintString lambdaStr = s -> System.out.println(s);
		lambdaStr.showString("hello lamda_1");
		showMyString(lambdaStr);
		
		PrintString reStr = returnString(); // 변수로 반환받기
		reStr.showString("hello ");  // 메서드 호출
	}
	
	public static void showMyString(PrintString p) {
		p.showString("hello lamda_2");
	}
	
	public static PrintString returnString() {  //람다식을 반환하는 메서드
		return s -> System.out.println(s + "world");
	}
}

결과

hello lamda_1
hello lamda_2
hello world
 

비전공자 네카라 신입 취업 노하우

시행착오 끝에 얻어낸 취업 노하우가 모두 담긴 전자책!

kmong.com

댓글