Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

Super Coding Addict

Ch12. 람다식 (1) 본문

JAVA 문법

Ch12. 람다식 (1)

밍응애 2021. 2. 6. 00:03

* 람다식

- 자바8부터 지원

- 자바에서 함수형 프로그래밍을 구현하는 방식

- 클래스 생성X, 함수의 호출만으로 기능 수행

 

* 함수형 프로그래밍

- 순수 함수를 구현, 호출 --> 외부변수 사용X

==> 매개변수만을 사용, 따라서 외부 자료에 부수적 영향(side effect) 발생X

==> 외부에 영향 미치지 않으므로 병렬처리등 가능, 안정적인 확장성 있는 프로그램 방식

 

* 람다식 문법

- 매개변수가 1개인 경우 괄호 생략 가능 (두 개인 경우 생략불가)

str -> {System.out.println(str);}

- 중괄호 안의 구현부 한 문장입면 중괄호 생략가능

str -> System.out.println(str);

- 중괄호 안의 구현부가 한 문장이더라도 return문이면 중괄호 생략불가

str -> return str.length();	//오류!!

- 중괄호 안의 구현부가 반환문 하나라면 return과 중괄호 모두 생략 가능

(x, y) -> x + y		//두 값 더하여 반환
str -> str.length()		// 문자열 길이 반환

 

* 예제1

# MyMaxNumber 인터페이스

package ch12.lambda;

@FunctionalInterface	//함수형 인터페이스는 메서드 2개 이상 선언X
public interface MyMaxNumber {
	int getMaxNumber(int x, int y);
	//void add(int x, int y);	//익명함수이기 때문에 어떤 것인지 알 수 없다
}

--> @FunctionalInterface : 함수형 인터페이스임을 나타내는 어노테이션

--> 함수형 인터페이스에는 메서드를 1개만 선언할 수 있는데, 이는 람다식이 익명함수를 구현하기 때문에 매개변수를 2개인 메서드가 2개 있다면 어떤 메서드인지 알 수 없기 때문이다

 

# TestMyNumber 클래스

package ch12.lambda;

public class TestMyNumber {

	public static void main(String[] args) {
		MyMaxNumber max = (x, y)->  (x >= y) ? x : y;
		System.out.println(max.getMaxNumber(10, 20));

	}

}

//실행 결과 : 20

--> MyMaxNumber 인터페이스에서 선언한 getMaxNumber함수를 오버라이딩하지만, 람다식은 익명함수로 이를 처리한다.

 

 

* 예제2

- 예제1에서도 사실 객체가 내부적으로 생성되지만 보이지 않을 뿐이기에, 람다식이 구현되는 원리를 좀 더 풀어서 보여주기

 

# StringConcat 인터페이스

package ch12.lambda;
@FunctionalInterface
public interface StringConcat {
	
	public void makeString(String s1, String s2);
}

 

# StringConcat 클래스 - 상속한 StringConcat클래스의 추상메서드인 makeString 오버라이딩

package ch12.lambda;

public class StringConImpl implements StringConcat{

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

 

# TestStringConcat 클래스 (메인)

package ch12.lambda;

public class TestStringConcat {

	public static void main(String[] args) {
		StringConImpl impl = new StringConImpl();
		impl.makeString("hello", "world");
		
		StringConcat concat = (s, v)->System.out.println(s + "," + v);
		// --> 람다식으로 구현을 하지만, 사실 내부에 익명객체가 생성됨
		// --> 함수인데, 마치 변수가 어떤 변수에 대입되듯이 사용되고 있음
		concat.makeString("hello", "world");

		StringConcat concat2 = new StringConcat() {
			
			@Override
			public void makeString(String s1, String s2) {
				System.out.println(s1+ "," + s2);
				
			}
		};
		
		concat2.makeString("hello", "newWorld");
	}

}

--> 인터페이스를 구현한 StringConImpl 객체를 생성한 뒤 메서드를 호출

--> 인터페이스인 StringConcat 객체를 생성하면서 그 안에서 메서드 오버라이딩을 한 뒤 메서드를 호출 할 수 있다

 

'JAVA 문법' 카테고리의 다른 글

Ch12. 스트림 (1)  (0) 2021.02.06
Ch12. 람다식 (2)  (0) 2021.02.06
Ch07. 상속과 다형성 (1)  (0) 2021.01.22
Ch06. 배열(2)  (0) 2021.01.20
Ch06. 배열(1)  (0) 2021.01.19