본문 바로가기
수업(국비지원)/Java

[Java] chap10 : 내부 클래스 - 람다(Lambda)

by byeolsub 2023. 4. 16.
  • 람다(Lambda)
  람다 예제 : jdk8 이후 버전에 사용 가능함
    람다에서 사용되는 인터페이스는 FunctionalInterface 여야함.
    FunctionalInterface : 추상메서드가 한개만 존재하는 인터페이스.
    
  매개변수,리턴타입이 없는 경우 
  () -> {...}; 구현.

  람다식 내부에 구현되는 문장이 한개인 경우는 {} 생략 가능.

 

📌

package chap10;

@FunctionalInterface //어노테이션. 반드시 써야할 필요는 없다. 
interface LambdaInterface1 {
	void method(); 
}
public class LambdaEx1 {
	public static void main(String[] args) {
		int num = 100;
		//이름없는 내부클래스 
		LambdaInterface1 fi = new LambdaInterface1() {
			@Override
			public void method() {
//				num =200; //Local variable num defined in an enclosing scope must be final or effectively final 오류
				System.out.println("기존방식으로 코딩:num="+num);
			}
		};
		fi.method();
		//람다 방식 코팅
		fi = () -> {System.out.println("람다방식으로 코팅1:num="+num);
		}; //실제 그때그때 내용을 변경 할 수 있음
		fi.method();
		fi = () -> System.out.println("람다방식으로 코팅1:num="+num); // 중가로 생략 할 수도 있다.
		fi.method();
	}
}

  • 람다(Lambda) - 매개변수로 사용하기

📌

package chap10;

public class LambdaEx2 {
	public static void main(String[] args) {
		LambdaInterface1 f = ()-> System.out.println("람다 방식 코딩 1");
		execute(f);
		execute(()-> System.out.println("람다 방식 코딩 2"));
		System.out.println("======================");
		//1부터 100까지의 합 출력하기
		f = () -> {
			int sum=0;
			for(int i=1;i<=100;i++) sum += i;
			System.out.println("람다 방식 코딩 1");
			System.out.println("1부터 100까지의 합:"+sum);
		};
		execute(f);
		execute(()->{
			int sum=0;
			for(int i=1;i<=100;i++) sum += i;
			System.out.println("람다 방식 코딩 2");
			System.out.println("1부터 100까지의 합:"+sum);
		});
	}
	static void execute(LambdaInterface1 f) {
		f.method();
	}
}

  • 람다(Lambda) - 매개변수가 있는 메서드
  매개변수가 있는 메서드
   (매개변수명,매개변수명)-> {   }
  매개변수 명이 한개인 경우 () 생략 가능  

 

📌

package chap10;

interface LambdaInterface3 {
	void method(double d);
}
public class LambdaEx3 {
	public static void main(String[] args) {
		LambdaInterface3 f = new LambdaInterface3() {
			@Override
			public void method(double d) {
				System.out.println(d*5);
			}
		};
		f.method(10); //50.0
		f = (x)->System.out.println(x*10);
		f.method(10); //100.0
		calc(f,10); //100.0
		calc(f,20); //200.0
		//입력값의 제곱값 출력하기
		calc((x)->System.out.println(x*x),100); //10000.0
		calc((x)->System.out.println(x+x),100); //200.0
	}
	static void calc(LambdaInterface3 f,double x) {
		f.method(x);
	}
}

 

 

 


  • 람다(Lambda) - 매개변수, 리턴값이 있는경우
매개변수, 리턴값이 있는 경우
      (매개변수, 매개변수) -> {return 리턴값};
 리턴값 : 추상메서드의 리턴타입인 값

구현 가능 문장이 return 값인 경우는 return 구문을 생략가능

 

📌

package chap10;

interface LambdaInterface4 {
	int method(int x, int y);
}
public class LambdaEx4 {
	public static void main(String[] args) {
		LambdaInterface4 f = (x,y)-> {
			return x+y;
		};
		System.out.println(f.method(10, 20));
		f = (x,y)->x+y;
		System.out.println(calc(f,10,20));
		System.out.println("두수의 곱:"+calc((x,y)->x*y,10,20));
		System.out.println("두수의 차:"+calc((x,y)->x-y,10,20));
		System.out.println("두수의 몫:"+calc((x,y)->x/y,100,20));
		System.out.println("두수의 나머지:"+calc((x,y)->x%y,10,20));
		System.out.println("두수 중 큰수:"+calc((x,y)->(x>y)?x:y,10,20));
		System.out.println("두수 중 작은수:"+calc((x,y)->(x<y)?x:y,10,20));
		//LambdaInterface4를 이용하여 배열 중 최소/최대 값을 구해주는 함수 calc 함수
		int [] arr = {1,21,3,45,5,0,7,8,91,10};
		System.out.println("arr배열 중 최대값:"+calc(arr,(x,y)->(x>y)?x:y)); 
		System.out.println("arr배열 중 최소값:"+calc(arr,(x,y)->(x<y)?x:y)); 
	}
	static int calc(LambdaInterface4 f,int x,int y) {
		return f.method(x, y);
	}
	static int calc(int [] arr,LambdaInterface4 f) {
		//(x,y)->(x>y)?x:y
		int result = arr[0]; //1
		for(int i : arr) result = f.method(result, i);
		return result;
	}
}

  • 람다(Lambda) - 지역변수 사용 시 주의
함수 객체에서 지역변수 사용시 지역변수는 상수화 되어야 한다.

 

📌

package chap10;

class Outer4 {
	public int iv=10;
	void method() {
  		int iv=20;
//오류:	iv++;// why? 지역내부 클래스안의 메서드이기 때문에
		LambdaInterface1 f =()-> {
			System.out.println("iv="+iv); 
			System.out.println("this.iv="+this.iv); //외부 클래스에 있는 멤버에 접근가능
			System.out.println("Outer4.this.iv="+Outer4.this.iv);//외부클래스의 멤버
		};
		f.method();
	}
}
public class LambdaEx5 {
	public static void main(String[] args) {
		new Outer4().method();
	}
}