ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Lambda & Stream (1)람다식
    Lang/JAVA 2021. 7. 31. 23:28

    함수를 보다 단순하게 표현하는 방법.

    불필요한 코드를 줄이고, 가독성을 높이기 위함.

    https://youtube.com/playlist?list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp 

     

    자바의 정석 기초편(2020최신)

    최고의 자바강좌를 무료로 들을 수 있습니다. 어떤 유료강좌보다도 낫습니다.

    www.youtube.com

    ==========================================================================

    https://youtu.be/3wnmgM4qK30

     

    - 함수형 언어

    자바는 OOP인데

    JDK1.8부터 함수형언어의 기능을  추가함,

    python과 js도 전부다 oop언어면서 fp기능 갖고 있다.

     

    유명한 함수형 언어 Haskell, Erlang, Scala

    빅데이터가 뜨면서, 엄청난 양의 데이터를 처리하기 위해 함수형 언어가 필요했다.

     

    자바에서는 함수가 클래스 밖에 있을 수 없으니 전부 메소드

    람다식이라는게 함수형 언어에서 온거라서 함수랑 메소드를 혼용해서 쓸 것이니 헷갈리지 말기

     

    - 람다식(Lambda Expression)    *람다는 그리스어 알파벳의 열한째글자

    함수 또는 메소드를 간단한 식(expression)으로 표현하는 방법

    이런식으로

     

    메소드를 람다식으로 바꿀 때

    (1)반환타입과 이름을 지워 : 람다식은 익명함수야  --뒤에가선 또 익명객체래 왜? 자바에서는 메소드만 따로 존재할 수 없으니까. 

    (2)사이에 화살표를 넣어

     

    그럼 람다식이 돼 끝이야

    근데 람다식이라는게 함수(메소드)를 간단히 표현하기 위한 것

    그래서 좀 더 간단히 할 수 있는 규칙들이 있다.

     

    (규칙1)

    반환값이 있을 때, return과 ;를 안씀

    (규칙2)

    추론 : 안 적어도 짐작할 수 있다

    왜 생략 가능한지 앞으로 알게됨

     

    (규칙3)  인것 같은데 여기서부터 굳이 주의사항이라고 따로 잡네

     : 타입을 대부분 생략가능하다고 했는데, 그렇지 않을때는 괄호도생략할 수 없음.

     

    (규칙4)

     : 대신 세미콜론 붙이면 안됨

     

    (규칙5)

    써놓긴 했는데 대부분 return을 생략하기 때문에 가볍게 보고 넘어가세요

    ▽return문이 return 예약어를 쓴 문장 말하는 거군

     

    문제풀기

    타입지우고

    이름지우고

    화살표만 붙이면 끝인데

     

    거기서 더 간단히 할 수 있는 것임.

    - 인자 타입 지우고,

    - return 이 있을 때 return과 ; 지우고

    - { } 문장 하나면 지우고

     

    - 인자가 한개면 ( ) 지우고

     

    (정답)

    (a, b) -> a > b ? a : b
    (name, i) -> System.out.println(name+"="+1)
    x -> x * x
    () -> (int) (Math.random() * 6)

     

    =====

    왼쪽같은 람다식은 오른쪽과 같다

    오른쪽 :

    객체의 선언과 생성을 동시에 하는 익명클래스

    에 의해 만들어진걸 익명객체라고 함

     

    원래 오른쪽처럼써야 하는데

    람다식으로 쓸 수 있도록 허용 하는 것임.

     

    결국 람다식은 객체라는 것.

    !객체를 다룰 때는 = 람다식을 사용하려면, 참조변수가 필요해.

     

    그 참조변수의 타입은 뭘로 해야해?

    익명객체라면 저 오른쪽 저게 Object니까

    이렇게 할 것.

     

    근데 문제가 있다.

    람다식이 객체고

    걔를 다루려면 참조변수가 필요하고

    참조변수의 타입이 필요, 그걸 Object라고 하면 그걸 쓸 때

    호출 불가.

    그럼 어떻게 해야해? 다음 강의에서 설명한대

     

    =====

    실습

    람다식은 익명객체. 객체기 때문에 주소를 리턴함.

    람다식은 함수형 인터페이스라고 그렇게 다뤄야 한대. 다음강의에서 다룸.

    이 객체가 갖고 있는 max라는 메소드를 쓰려면?

    이렇게 하면 되겠지만 에러남. 왜?

    obj 참조변수의 타입은? Object

    Object타입의 리모컨에는 max라는 메소드가 없대.

    분명히 저 객체가 기능을 갖고 있지만 리모콘이 그 기능의 버튼을 갖고 있질 않대

     

    그럼 형변환해줘야 하는데 형변환 할 수가 없어 뭘로 형변환을 해

     

    그래서 필요한 게 함수형 인터페이스.

    다음강의에서 배움.

     

    자바에서는 규칙이 메소드만 존재할 수 없기 때문에 이렇게 익명 객체안에 넣어서 표현을 해야되고

    람다식은 이걸 간단히 표현을 해서 저렇게 됨. 이게 단순히 메소드가 아니라 객체.

    람다식은

    이 파란 부분과 똑같음.

     

    람다식을 다루려면 뭔가 필요하다 타입이

    뭔가 필요해

     

    그게 다음강의에서 배울 함수형 인터페이스.

     

    ==========================================================================

    https://youtu.be/0Sp9eFRV8gE

    함수형 인터페이스 : 단 하나의 추상 메소드만 선언된 인터페이스

    - 하나밖에 없다

    - @FunctionalInterface라고 붙이면 함수형 인터페이스를 올바르게 작성했는지 컴파일러가 확인 해줌. Override 애너테- 이션 처럼

    - 이 인터페이스는 max라는 메소드를 하나 갖고 있고

     

     

     

    'Lang > JAVA' 카테고리의 다른 글

    Enum  (0) 2021.12.31
    A bb = new C();  (0) 2021.12.26
    [JAVA] 상수와 리터럴 연산 & 컴파일러 -> final 변수  (0) 2021.12.23
    다형성  (0) 2021.11.09
Designed by Tistory.