• 분류 전체보기 (512)
    • 개발남노씨(Coding Test) (6)
    • 고농축 백엔드 (17)
    • 재귀함수 DFS 총정리 (1)
    • 프론트엔드 날개달기:Vuejs.React (1)
    • 훈훈한 javascript (5)
    • 렛츠기릿 자바스크립트 (18)
    • 나도코딩 (1)
      • 웹 스크래핑 (1)
    • 프로그래머스(자바스크립트) (41)
      • LV.0(자바스크립트) (41)
    • 프로그래머스(자바) (121)
      • LV.0(자바) (56)
      • LV.1(자바) (41)
      • LV.2(자바) (23)
    • 프로그래머스(파이썬) (127)
      • LV.0(파이썬) (46)
      • LV.1(파이썬) (51)
      • LV.2(파이썬) (30)
    • 임시저장소 (31)
    • 프로젝트 (0)
    • 자바 알고리즘 (13)
      • 알고리즘 직빵 자바 문법 (10)
      • String(문자열) (3)
    • 파이썬 알고리즘 (93)
      • 알고리즘 직빵 파이썬 문법 (20)
      • 알고리즘 백준 (2)
      • 파이썬 알고리즘(사고력기르기) (6)
      • 파이썬 탐색 & 시물레이션 (8)
      • 이분탐색 & 그리디 알고리즘 (10)
      • 스택, 큐, 해쉬, 힙 (10)
      • 완전탐색과 DFS기초 (12)
      • DFS, BFS 활용 (19)
      • 동적계획법 (6)
    • 자바 (27)
      • Java TPC(생각하고, 표현하고, 코딩하고) (17)
      • Java (중요하고, 이해 안 되고, 어려운) (10)
    • 스프링 (5)
      • 스프링 MVC 패턴 2편 (5)
hELLO · Designed By 정상우.
@@#@@

기록용 블로그

람다 Lambda
자바/Java (중요하고, 이해 안 되고, 어려운)

람다 Lambda

2022. 10. 30. 17:49

람다 Lambda

 

사전 지식

  1. 익명 객체(=익명 클래스)

 

  2. 익명 클래스  

        1)   new 조상클래스 ( ) {  구현부  }

        2)   new 인터페이스 ( )  {  구현부  }

 

  3. 익명 객체가 메서드의 매개변수로 통째로 들어 가는 경우

        ex. a.method( );   →  a.method(    new 조상클래스 (  )  {    }     );

 

  4.  함수형 인터페이스의 의미 : "추상메서드를 1개만 가지고 있는 인터페이스"를 의미한다.

 

  5.  람다함수(람다 메서드)를 "익명함수"라고 부르나 실제로는 함수가 아니다.  엄격히 말해서

 익명객체이다.

 

       그 이유는 익명객체를 람다함수로 전환가능하며, 람다함수를 익명객체로 전환하기 때문에 람다함수의 레벨은 

       함수(method)가 아니라 클래스(객체)이다. - 자바의 정석

 

  7. 람다식(익명객체)를 다루기 위한 참조변수(f)의 타입은 함수형 인터페이스로 한다. 

 

  8. 람다식에는 메서드 이름이 생략되어 있지만, 참조변수f가  람다식 안에 있는 메소드를 호출하기 위해서는 

       메서드의 이름을 알아야 한다. ex - f.max(3,5)

 

자바의 정석

 

함수형 인터페이스

interface MyFunction {
	public abstract int max(int a, int b) //추상메서드
}

 

 

함수형 인터페이스에 있는 int max() 메서드를 익명클래스(익명객체)를 이용해서 오버라이딩을 해 보자 

class noneLambda {
	public static void main(String[] args) {
		MyFuction f = new MyFunction(){
					@Overriding   // 추상메서드가 오버라이딩 됨
					 public int max(int a, int b) {
                    			return a > b? a: b; 
                    }
              };

int big = f.max(5, 3); //익명객체(익명클래스)의 max메소드를 호출
	}

}

 

 

 

익명클래스(익명객체)를 람다식으로 대체해 보자 

class Lambda {
	public static void main(String[] args) {
		MyFuction f = (int a, int b) -> a > b? a: b; //익명객체를 람다식으로 대체
                    
int big = f.max(5, 3);//람다식의 max함수가 호출된다. (람다식에 max 메서드명이 생략되었을지라도)
	}
}

 

똑같은 것 한번더 

 

함수형인터페이스

@FunctionalInterface
public interface MyFunction {
	void myMethod(); // 매개변수 없음, 리턴값이 없음
}

 

 

함수형 인터페이스에 있는 void myMethod() 메서드를 익명클래스(익명객체)를 이용해서 오버라이딩을 해 보자

class noneLambda {
	public static void main(String[] args) {

		MyFunction f = new MyFunction() {

			@Override //추상메서드가 오버라이딩 됨
			public void myMethod() {
				System.out.println("myMethod오버라이딩");
			}
						
		};

		f.myMethod(); //익명객체의 myMethod메서드를 호출
	}

}

 

 

익명클래스(익명객체)를 람다식으로 대체해 보자 

class noneLambda {
	public static void main(String[] args) {

	  MyFunction f = () ->System.out.println("myMethod오버라이딩");
				
		f.myMethod(); //람다식의 myMethod를 호출함 (람다식에 myMethod 메서드명이 생략되었을지라도)

	}

}

 

 

결론 :

   함수형 인터페이스의 추상메서드 → 익명객체를 이용해서 오버라이딩 → 함수를 포함한 익명객체를 람다식으로 변환

   → 람다식을 참조하는 참조변수 f는 람다식을 호출  ex) f.max(3,5);  ,  f.myMethod();

 

 

매개변수의 타입이 함수형 인터페이스인 경우 

@FunctionalInterface
public interface MyFunction {
	void run(); // 매개변수 없음, 리턴값이 없음
}

class Lambda {
	static void execute(MyFunction f) { //참조변수f는 람다식을 받음
		f.run(); //매개변수로 받은 람다식을 호출함
	}
	
	public static void main(String[] args) {

	  MyFunction f1 = () ->System.out.println("run메서드 오버라이딩");
				
		execute(f1);
		execute( () -> System.out.println("매개변수로 람다식을 줌") );

	}

}

 

출력결과

매개변수로 받은 람다식을 호출

저작자표시 비영리 변경금지 (새창열림)

'자바 > Java (중요하고, 이해 안 되고, 어려운)' 카테고리의 다른 글

Optional <T>  (0) 2022.10.30
메서드 참조  (0) 2022.10.30
Comparable  (0) 2022.10.27
생성자  (0) 2022.10.26
객체변수와 객체  (0) 2022.10.26
    '자바/Java (중요하고, 이해 안 되고, 어려운)' 카테고리의 다른 글
    • Optional <T>
    • 메서드 참조
    • Comparable
    • 생성자
    @@#@@
    @@#@@
    자바, 스프링, 알고리즘, 깃허브, 파이썬

    티스토리툴바