개발자 미니민의 개발스터디

[JAVA] 자바 - 람다식 (Lambda) / Consumer<T>, Supplier<T>

by mini_min
[JAVA]
자바 - 람다식 (Lambda) / Consumer<T>, Supplier<T>

✔️ 람다식 (Lambda) - 자바 8부터 제공

람다식은 메소드를 하나의 식으로 표현한 것이다.

객체 지향 언어보다는 함수 지향 언어에 가깝다.

메소드를 간략하면서도 명확한 식으로 표현할 수 있다!

✨ 람다식으로 메소드를 표현하면 이름 및 반환 값이 없어져서 익명 함수라고도 한다.

✨ 하나의 추상 메소드를 가진 인터페이스는 람다식 사용이 가능하다. 

💡 작성형식 : (타입 매개변수) -> {실행문};

 

📓 반환 값 있는 메소드의 경우, return 대신 표현식만 있어도 된다.

📓 매개변수 타입이 추론 가능하면 생략 가능하다.

📓 매개변수가 하나면 () 생략이 가능하다.

📓 {} 문장이 하나이면 {} 를 생략이 가능하다.

public static void main(String[] args) {
		//매개변수 없고, 리턴 타입이 void 인 lambda 식!
		//함수에 이름이 없음
		//아래 write 메소드를 재정의한 것임.
		//{} 안에 문장이 하나인 경우, {} 를 생략해도 괜찮다. 
		User2 obj = () -> {System.out.println("람다식...");};
		
		obj.write();

	}

}


interface User2 {
	public void write();
}

 

 

🔒 하나의 매개변수가 있고, 리턴 타입이 void 인 람다식!

-- 조건✨✨ : 인터페이스 안에 메소드가 하나 있어야한다.

하나의 메소드만 선언된 경우만 람다식이 가능하다.

	public static void main(String[] args) {
		// 하나의 매개 변수가 있고, 리턴 타입이 void 인 lambda 식!!!!!!!
		User3 obj3 = (int a) -> {int n = a +10; System.out.println(n);};
		//int 생략 가능. 어차피 아래에서 명시되어잇어서 
		// 매개변수 하나일 때, 가로도 생략 가능하다.int a / a 
        
		obj3.sub(5);
		
	}

}

// 조건 : 인터페이스 안에 메소드가 하나 있어야한다!
//하나의 메소드만 선언된 경우에만 람다식이 가능

//@FunctionalInterface : 람다식으로 구현가능한지 검증함 / 이걸 쓰면 람다식 가능한지 판별해줌
@FunctionalInterface 
interface User3 {
	public void sub(int a);

}
💡 @FunctionalInterface : 람다식으로 구현가능한지 검증함 / 이걸 쓰면 람다식 가능한지 판별해줌!

 

 

🔒 매개변수가 두개이고 리턴 타입이 int인 람다식

	public static void main(String[] args) {
		// 매개변수가 두개이고 리턴 타입이 int인 람다식
		
		//User4 obj = (x,y) -> {int z = x+y; return z;};
		//User4 obj = (x,y) -> {return x+y;};
		User4 obj = (x,y) -> x+y; //생략 가능
		
		
		
		int s = obj.add(10, 5);
		System.out.println(s);

	}

}


@FunctionalInterface
interface User4 {
	public int add(int a, int b) ;
	
}

 

 

✔️ 람다식에서 this

람다식에서 this 는 익명 객체가 아니라, 람다식을 구현한 클래스를 this 라고 한다.

public static void main(String[] args) {
		Test5 t= new Test5();
		t.using();
		

	}
}


interface User5 {
	public void sub();
}

class Test5 {
	int x= 10;
	
	class Demo5 {
		int y = 20;
		
		public void disp() {
			int x = 100;
			int z = 30;
			
			//람다식
			User5 obj = () -> {
				//주의 : 람다식에서의 this 는 익명객체가 아니라 람다식을 구현한 클래스(Test5$Demo5)
				//람다를 구현한 클래스를 this 라고 한다. 
				System.out.println(this); 
				System.out.println(Test5.this.x);
				System.out.println(y);
				System.out.println(this.y);
				
				System.out.println(z);

			};
			// 에러. 람다에서 사용된 로컬변수는  final 속성이다.  
			//z = 50;
			
			obj.sub();
			
		}
	}
	
	public void using() {
		Demo5 d = new Demo5();
		d.disp();
	}
	
}
💡 Test5 클래스의 int x 값을 출력하고 싶으면, Test5.this.x

 

 

✔️ 표준 API의 함수적 인터페이스

자바 8에서부터 빈번하게 사용하는 함수적 인터페이스는 java.util.function 표준 API 패키지로 제공한다.

✨ Consumer<T>

: 대개, 매개변수가 있고 리턴 값이 없는 추상 메소드를 가진 인터페이스다.

✨ Supplier<T>

: 서플라이어는 매개변수는 없고❌ 리턴 값이 있는 추상 메소드를 가진 인터페이스이다.

✨ Function<T>

: 매개변수 값이 있고, 리턴 값이 있는 추상 메소드를 가진 인터페이스이다.

 

🔒 Consumer<T> / IntSupplier

	public static void main(String[] args) {
		// 매개변수가 있고, void 추상 메소드를 가진 인터페이스
		
		// 매개변수 :a 
		Consumer<Long> c = a -> {System.out.println(a);};
		c.accept(100L);
		
		// 매개변수가 없고 리턴값이 있는 (int) 메소드를 가진 인터페이스 
		IntSupplier obj = () -> (int)(Math.random()*10)+1;
		int n = obj.getAsInt();
		System.out.println(n);
		
	}
💡 Consumer<T>
추상메소드 : accept() 객체 매개변수로 가짐 ...~ 

💡 IntSupplier : 매개변수가 없고 리턴값이 있는 (int) 메소드를 가진 인터페이스
추상메소드 : getAsInt() : int 형을 리턴

 

 

 

 

 

 

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기