[Java] 람다식

2024. 8. 27. 09:01·Java
목차
  1. 람다식
  2. 매개변수가 없는 람다식
  3. 리턴값이 존재하는 람다식
반응형

람다식

  • 자바 8 이후 생긴 문법
  • 리액트, 자바스크립트에서 사용
  • 익명객체를 만드는 문법
  • 함수적 인터페이스의 구현 객체를 생성하는 간소화 문법
  • 함수적 인터페이스의 추상메소드를 클래스 없이 구현하는 방법
  • () : 선언부. 변수 들어감
  • 함수적 인터페이스 : 구현해야 하는 추상메소드가 단 하나만 존재하는 인터페이스를 의미
  • 만약 함수적 인터페이스로 선언한 후 이미 람다식을 이용하여  구현 객체를 사용하고 있는 경우 추후 추상메소드 추가시 문법 오류가 발생할 수 있다. 이를 방지하기 위하여 어노테이션 @FunctionalInterface 을 사용하면 강력한 컴파일을 통하여 반드시 하나의 추상메도스만 갖는 함수적 인터페이스를 구현할 수 있다
  • 인터페이스의 익명 구현 클래스 영역에서 생성자를 제외하고 클래스 구성요소들 구현 가능
    단, 추상메소드를 제외한 구성요소들은 중괄호 안에서만 사용 가능
  • 매개변수가 하나만 존재할 때는 괄호를 생략할 수 있다
  • 실행문이 하나이면 중괄호 생략가능
  • 실행문이 return 한줄 밖에 없는 경우 중괄호와 return을 생략할 수 있다
  • 람다식은 추상메소드의 정의부이기 때문에 매개변수의 타입이 이미 정해져있으므로 var 키워드를 사용하여 매개변수를 선언할 수 있다. (var : 변수 선언이라는 키워드)

 

 

1) 

@FunctionalInterface
public interface FunctionalService {
	void method1(int a, int b);
	//void method2(int a, int b);
}

 

public class Main1 {
	public static void main(String[] args) {
		//익명 객체를 활용하여 인터페이스의 익명 구현객체 대입하기
		FunctionalService fs = new FunctionalService() {
			//FunctionalService 인터페이스의 익명 구현 클래스 영역
			//생성자를 제외하고 클래스 구성요소들 구현 가능
			//단, 추상메소드를 제외한 구성요소들은 중괄호 안에서만 사용 가능
			public String field = "안녕";
			
			
			@Override
			public void method1(int a, int b) {
				System.out.println(field);
			}
		};
		
		fs.method1(0, 0);
		//fs.field = "java"; FunctionalService 인터페이스에 field가 없기 때문에 오류발생
		
		
		FunctionalService fs2 = (a,b) -> {
			System.out.println(a +", " + b);
		};
		
		fs2.method1(10, 5);
		
		
		fs2 = (a,b) -> {
			System.out.println(a + b);
		};
		
		fs2.method1(1, 2);
	}
}
안녕
10, 5
3

 

 

 

2)

@FunctionalInterface 
public interface Calculable {
	void calculate(int x, int y);
}

 

public class CalculableExample {
	public static void action(Calculable calculable) {
		int x = 10;
		int y = 4;
		calculable.calculate(x, y);
	}
	
	
	public static void main(String[] args) {
		/*
 		Calculable calculable = () -> {}; 
 		calculable.calculate();
		            ↓
		action(Calculable calculable);
		action(new Calculable());
		            ↓
		action(()->{});
        		    ↓
		*/
		action((x,y)->{
			int result = x + y;
			System.out.println("result:" + result);
		});
		
		
		action((x,y)->{
			int result = x - y;
			System.out.println("result:" + result);
		});
	}
}
result:14
result:6

 

 

 

매개변수가 없는 람다식

  • 매개변수가 1개만 존재할 경우 괄호 생략 가능
  • 괄호 생략시에는 매개변수의 타입은 생략한다
  • 매개변수가 없는 추상메소드는 괄호를 생략할 수 없다

 

 

매개변수가 1개만 존재할 경우

@FunctionalInterface
public interface FunctionalService3 {
	void method(int a);
}

 

//FunctionalService3 fs3_1 = (a) ->{
FunctionalService3 fs3_1 = a ->{
    System.out.println(a);
};

fs3_1.method(10);
10

 

 

 

매개변수가 없을 경우

@FunctionalInterface
public interface FunctionalService2 {
	void method();
}

 

FunctionalService2 fs2_1 = ()->{
    System.out.println("함수적 인터페이스 실행");
};

fs2_1.method();
함수적 인터페이스 실행

 

 

 

var 키워드를 사용하여 매개변수를 선언할 수 있다

fs2 = (var a, var b)-> {

};

 

 

 

매개변수가 2개인 경우, 매개변수가 1개인 경우

@FunctionalInterface
public interface Workable {
	void work(String name,String job);
}

 

@FunctionalInterface
public interface Speakable {
	void speak(String content);
}

 

public class Person {
	public void action1(Workable w) {
		w.work("홍길동", "프로그래밍");
	}
	
	public void action2(Speakable s) {
		s.speak("안녕하세요");
	}
	
	
	public static void main(String[] args) {
		Person p = new Person();
		
		//매개변수가 두 개일 경우
		p.action1((name,job)->{
			System.out.print(name+"이 ");
			System.out.println(job+"을 합니다.");
		});
		
		p.action1((name,job)->System.out.println(name + "이 " + job +"을 하지 않습니다."));
		
		//매개변수가 한 개일 경우
		p.action2(word -> {
			System.out.print("\"" + word + "\"");
			System.out.println("라고 말합니다");
		});
		
		p.action2(word -> System.out.println("\"" + word + "\"라고 외칩니다"));
	}
}
홍길동이 프로그래밍을 합니다.
홍길동이 프로그래밍을 하지 않습니다.
"안녕하세요"라고 말합니다
"안녕하세요"라고 외칩니다

 

 

 

리턴값이 존재하는 람다식

  • 리턴값이 존재하는 함수적 인터페이스의 람다식은 중괄호 안쪽에서 return 키워드를 사용하여 값을 반환할 수 있다

 

@FunctionalInterface
public interface FunctionalService4 {
	int method(String a);
}

 

FunctionalService4 fs4 = a->{
    return Integer.parseInt(a);
};

System.out.println(fs4.method("2003"));
2003

 

 

 

FunctionalService4의 구현객체를 람다식을 통하여 정의합니다
 이때 fs4.method("10"); 의 결과는 2입니다
 fs4.method("13"); 의 결과는 2입니다
 fs4.method("15"); 의 결과는 3입니다
 fs4.method("20"); 의 결과는 4입니다

fs4 = a->{
    return Integer.parseInt(a)/5;
};

System.out.println(fs4.method("10"));
System.out.println(fs4.method("13"));
System.out.println(fs4.method("15"));
System.out.println(fs4.method("20"));
2
2
3
4

 

 

실행문이 return 한줄 밖에 없는 경우 중괄호와 return을 생략할 수 있다

fs4 = a -> Integer.parseInt(a)/5;
		
System.out.println(fs4.method("10"));
System.out.println(fs4.method("13"));
System.out.println(fs4.method("15"));
System.out.println(fs4.method("20"));
2
2
3
4

 

 

람다식 실행문에 메소드 사용

public static int doubleMethod(String s) {
    return Integer.parseInt(s)*2;
}
fs4 = a -> doubleMethod(a);

System.out.println(fs4.method("10"));
System.out.println(fs4.method("13"));
System.out.println(fs4.method("15"));
System.out.println(fs4.method("20"));
20
26
30
40

 

 

 

실행문이 2개 이상일 경우

리턴문이 하나만 있을 경우(연산식)

리턴문이 하나만 있을 경우(메소드 호출)

@FunctionalInterface 
public interface Calc {
	double calc(double x, double y);
}

 

public class Person2 {
	
	public void action(Calc c) {
		double result = c.calc(10, 4);
		System.out.println("결과:" + result);
	}
	
	public static double sum(double x, double y) {
		return x + y;
	}
	
	public static void main(String[] args) {
		Person2 p2 = new Person2();
		
		//실행문이 2개 이상일 경우
		p2.action((x,y)->{
			double result = x + y;
			return result;
		});
		
		//리턴문이 하나만 있을 경우(연산식)
		/*
		p2.action((x,y)->{
			return x + y;
		});
		*/
		p2.action((x,y)->x+y);
		
		//리턴문이 하나만 있을 경우(메소드 호출)
		/*
		p2.action((x,y)->{
			return sum(x,y);
		});
		*/
		p2.action((x,y)->sum(x,y));
	}
}
결과:14.0
결과:14.0
결과:14.0

 

반응형

'Java' 카테고리의 다른 글

[JSP] 모델1로 회원가입하기  (0) 2024.10.06
[JSP]모델 1  (0) 2024.10.05
[Java] Map  (0) 2024.08.25
[Java] set 연습  (0) 2024.08.24
[Java] Set, Iterator  (0) 2024.08.22
  1. 람다식
  2. 매개변수가 없는 람다식
  3. 리턴값이 존재하는 람다식
'Java' 카테고리의 다른 글
  • [JSP] 모델1로 회원가입하기
  • [JSP]모델 1
  • [Java] Map
  • [Java] set 연습
초보개발자J
초보개발자J
초보개발자J
J의 코딩 노트
초보개발자J
전체
오늘
어제
  • 분류 전체보기 (126)
    • Java (49)
    • MySQL (10)
    • HTML, CSS (8)
    • JavaScript, jQuery, Ajax (12)
    • Spring (15)
    • Python (0)
    • Baekjoon [Java] (27)
    • Git (1)
    • Spring Boot (3)
    • Visual Studio Code (1)
    • 일상 (0)
    • 영어 (0)
반응형

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

hELLO· Designed By정상우.v4.5.3
초보개발자J
[Java] 람다식

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.