[인프런 BE 0기] 익명 클래스와 람다식

HeeYeon Kim·2024년 2월 21일
0

STUDY

목록 보기
9/15
post-thumbnail

인프런 워밍업 클럽 스터디 0기
BE 3일차

익명 클래스

  • 내부 클래스 일종으로 단어 그대로 이름이 없는 클래스
  • 프로그램에서 일시적으로 한번만 사용되고 버려지는 객체

특징

  • 클래스 정의와 동시에 객체 생성 가능
  • 부모 클래스의 자원을 상속받아 재정의하여 사용할 계획이라면 지역 변수처럼 익명 클래스를 정의하는 것이 좋음
  • 오버라이딩 한 메소드만 사용 가능하고 새로 정의한 메소드는 외부에서 사용이 불가능함
    • 새로 정의한 메소드는 익명 클래스 내에서만 호출 가능
  • 이름이 없기 때문에 생성자를 가질 수 없고 가질 필요도 없음

예시

class Animal{
  public String bark(){
    return "동물이 웁니다";
  }
}

public class Main{
  public static void main(String[] args){
    Animal dog = new Animal(){
       @Override
       public String bark(){
          return "개가 짖습니다";
       }
    };
    dog.bark();
  }
}



람다

  • 익명 함수(Anonymous functions)를 지칭하는 용어

특징

  • 이름을 가질 필요가 없음
  • 코드가 간결해진다는 장점이 있지만 호출이 까다롭고 람다 stream 사용 시 성능이 떨어질 수 있음
  • 함수를 변수로 다룰 수 있음

기본 문법

  • 기본 문법
    (타입 매개변수) -> {실행문}
  • 매개변수 : 오른쪽 중괄호 블록을 실행하기 위해 필요한 값을 제공
    • 매개변수 타입은 일반적으로 언급하지 않음
    • 매개변수가 하나일 경우엔 소괄호 생략 가능
  • -> : 매개 변수를 이용해 중괄호 블록을 실행한다는 뜻
  • 만약 return문만 중괄호에 있을 경우 중괄호와 return문 제거하고 사용하는 것이 일반적
  • 예시
    (int a) -> {System.out.println(a);}
    a -> System.out.println(a);
    (x,y) -> x+y;



@FunctionalInterface

  • 람다식은 인터페이스 변수다?

    • 람다식의 형태가 자바의 메소드를 선언하는 것처럼 보임
    • 그러나 자바의 메소드는 단독 선언 불가능. 항상 클래스의 구성 멤버
    • 즉, 람다식은 메소드를 가지고 있는 객체를 생성하는 것
    • 이때 객체의 타입은 인터페이스
    • 람다식이 익명 구현 클래스를 생성하고 객체화함

람다식과 @FunctionalInterface 예시

@FunctionalInterface
public interface MyFunctionalInterface{
  public int sum(int x,int y);
}

//Main 
MyFunctionalInterface mi = (x,y) -> x+y;
System.out.println(mi.sum(3,6));

Java에서 제공하는 FunctionalInterfaces

함수형 인터페이스DescripterMethod
PredicateT->booleanboolean test(T t)
ConsumerT->voidvoid accept(T t)
Supplier()->TT get()
Function<T, R>T->RR apply(T t)
Comparator(T,T)->intint compare(T o1, T o2)
Runnable()->voidvoid run()
Callable()->TT call()



스트림 API

  • 데이터를 추상화하고 처리하는데 자주 사용되는 함수들을 정의함

특징

  • 자바에서 배열이나 컬렉션을 사용할 때 원래는 반복문, 반복자 사용
  • 가독성이 떨어지고 코드 재사용이 불가능하다는 단점 존재
  • 이를 극복하기 위해 나온 API
  • 원본 데이터를 변경하지 않음
  • 필터, 맵 기반의 API를 사용해 지연 연산을 수행하여 성능을 최적화함

구현

  1. 컬렉션
  • Collections 인터페이스에는 stream() 메소드가 정의되어 있음
  • 컬렉션 프레임워크 중 Map 역시 stream 메소드 사용 가능
Map<String,Integer>map = new HashMap<>();
map.entrySet().stream()
  .filter(e->e.getKey().contains("it"))
  .filter(e->e.getValue()>150)
  .forEach(e->System.out.println(e.getKey()+e.getValue()));
  1. 람다 표현식
Stream stream = Stream.iterate(2,n->n+2);
stream.forEach(System.out::println);





참고

https://steady-coding.tistory.com/304
https://www.codelatte.io/courses/java_programming_basic/O2PZAC2T82LKBXAY
https://bcp0109.tistory.com/313


강의

자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지!

0개의 댓글