본문 바로가기
Language/Java

자바 람다(Lambda) 기초부터 사용방법 정리

by wakestand 2020. 12. 6.
반응형

자바에서 람다(Lambda)는 기존의 클래스에 메소드를 만들고

객체화 한 뒤에 끌어쓰는 방식이 아니라

그때 바로 만들어서 사용하는 식인데

 

위 예제를 보면 인터페이스를 통해

메소드를 만들 수 있도록 만들어 두고

인터페이스명 메소드명 = (파라미터) -> {수행할 코드;};

를 람다 메소드를 만들고 사용하는 것이 보이는데

 

딱 보면 알겠지만 저거 쓰느니

그냥 일반 메소드 끌어다 쓰는 게 나아 보일거다

 

람다의 핵심은

(파라미터) -> {수행할 코드}

를 통해 메소드를 정의하지 않고도

메소드처럼 사용할 수 있다는 것인데

 

메소드와 같은 기능이지만

정의하지 않고도 사용하는 것이

람다의 핵심이 되겠다

 

다음 예제를 보면

list와 map에 값을 넣어놓고

forEach를 이용해 코드를 수행하는 형태인데

 

파라미터, 코드가 하나일 경우에는

파라미터 -> 코드

이렇게 사용해도 되지만

파라미터나 코드가 늘어날수록

(파라미터1, 파라미터2) -> {코드..}

이런 식으로 사용하게 된다

 

Lambda는 아무 곳에서나 사용이 불가능하기 때문에

대부분은 스트림(Stream), forEach 등을 사용할 때

람다를 주로 사용하게 되는데

 

자바 스트림(Stream) 예제부터 사용법까지 정리

자바에서 스트림이라고 하면 대부분 엄청나게 어려운 기술인 줄 알고 시작도 전에 포기하는 경우가 많은데 스트림은 엄청 간단하고 유용한 기술이다 다만 설명하는 사람들이 쉬운 걸 너무 어렵

wakestand.tistory.com

이때는 한번만 쓰면 되는 경우가 대부분이라

한번 쓰자고 메소드를 만드는 것보다

람다 함수를 한번 쓰고 버리는 형태가 훨씬 편하기 때문에

이런 경우에 람다식을 주로 사용하게 된다

 

정리해보자면

람다식을 통해 메소드를 정의하지 않고

메소드와 동일한 기능을 하게 만들 수 있고

파라미터 -> 코드

이런 식으로 동작하고

대부분은 자바 스트림(Stream) 혹은 forEach 사용 시

같이 사용하게 된다

 

마지막으로 예제에 사용한 코드는 아래와 같다

 

public class Test2 {
	// 람다 메소드 사용 시 
	interface methodIf {
		public String call(String val); // 반환 안하려고 void
	}
	
	// 일반 메소드 사용 시
	public String call(String val) {
		return val;
	}
	
	public static void main(String[] args) {
		// LAMBDA 
		// (파라미터명) -> { 수행할 코드 }
		methodIf Lambda = (val) -> { return val; };	// 메소드 내용 정의	
		//System.out.println(Lambda.call("람다를 이용한 메소드 호출")); // 람다 메소드 호출
		
		Test2 t2 = new Test2(); // 객체화
		//System.out.println(t2.call("일반 메소드 호출")); // 일반 메소드 호출
		
		List<Integer> list = new ArrayList<Integer>();
		list.add(1);
		list.add(2);
		list.add(3);
		list.forEach(val -> System.out.println(val)); // 람다를 이용한 List 출력
		
		Map<String, Integer> map = new HashMap<>();
		map.put("zebra", 30);
		map.put("dog", 10);
		map.put("bird", 20);
		
		// 람다를 이용한 map 출력
		map.forEach((name, number) -> 
		{
			if(number > 20) {
				System.out.println(name + " is 20 over!");
			} else {
				System.out.println(name + " number : " + number);
			}
		});
	}
}

 

반응형

댓글