[인프런 워밍업 클럽 1기 BE] 과제3. 익명 클래스와 람다식

none_null·2024년 5월 3일
1

Java

목록 보기
5/10
post-thumbnail

익명 클래스란?

Inner class, 이름이 없는 클래스를 말함
클래스 정의와 동시에 객체 생성 가능
Java의 Interface와 Class 모두 익명 함수로 객체를 만들 수 있음

익명 함수를 사용하는 이유

  • 프로그램 내에서 한 번만 객체로 만드는 데 사용되는 클래스의 경우 클래스를 정의하고 생성하는 것이 비효율적이기 때문에
  • 익명 함수로 클래스 정의와 구현을 동시에 하여 코드 길이를 줄일 수 있다
  • Runnanle이나 Event Listener 객체를 생성하는데 주로 사용

람다식이란?

Java 8에 도입되었으며, 함수형 인터페이스 객체를 표현
즉, 람다식은 추상 메소드(인터페이스)를 구현하는데, 이름이 없기 때문에 익명 함수(Anonymous Function)와 비슷함

람다식은 익명 함수(클래스, 객체)를 사용하는 것보다 더 적은 코드로 동일한 내용 구현 가능

[질문1] 람다가 등장한 이유
-> 함수형 프로그래밍을 할 때 람다식으로 코드를 간결하게 하고 가독성을 향상시킬 수 있음!

함수형 인터페이스 (Funtaional Interface)

함수형 인터페이스는 1개의 추상 메소드를 갖고 있는 인터페이스
Single Abstract Method(SAM) 이라고 불림

public interface FunctionalInterface {
	public abstract void doSomething(String text);
}

함수형 인터페이스를 사용하는 이유는 자바의 람다식은 함수형 인터페이스로만 접근이 되기 때문

자바에서 기본적으로 제공하는 함수형 인터페이스

  • Runnable
    : 인자를 받지 않고 리턴값도 없는 인터페이스
public interface Runnable {
	public abstract void run();
}
  • Supplier
    :<T>는 인자를 받지 않고 T 타입의 객체를 리턴
public interface Supplier<T> {
	T get();
}
  • Consumer
    :<T>는 T 타입의 객체를 인자로 받고 리턴 값은 없다
public interface Consumner<T> {
	void accept(T t);
    
    default Consumer<T> andThen(Consumer<? super T> after) {
    	Objects.requireNonNull(after);
        return (T t) -> { accept(t); after.accept(t); };
    }
}

Stream API

Stream API는 자바8 부터 추가된 기능으로 컬렉션, 배열 등의 저장 요소를 하나씩 참조하며 함수형 인터페이스(람다식)를 적용하며 반복적으로 처리할 수 있도록 해주는 기능

기존 코드 보다 가독성이 좋고 사용하기 편하게 되어 있음

Stream은 세 가지 단계를 거쳐 동작

  • 스트림 생성
    -> 컬렉션, 배열, 가변 매개변수, 지정된 범위의 연속된 정수, 람다 표현식 등에 생성 가능

  • 중개 연산
    -> 자료를 거르거나 변경해 또 다른 자료를 내부적으로 생성

    • filter() : 조건을 넣고 그 조건에 맞는 참인 요소만을 추출
    • distinct() : 중복된 요소가 제거된 새로운 스트림 반환(내부적으로 Object 클래스의 equals() 메서드를 사용하여 요소의 중복을 비교함)
    • map() : 조건에 맞는 요소 반환
    • sorted() : 데이터를 조건에 따라 정렬
  • 최종 연산
    -> 최종 연산으로 중간 연산 결과를 출력한다.(마지막에 한 번 호출됨)
    최종 연산은 스트림의 자료를 소모하면서 연산을 수행하기 때문에 최종 연산이 수행된 이후 해당 스트림은 사용할 수 없음

메소드 참조(Method Referenace)

실행하려는 메소드를 참조해서 매개 변수의 정보 및 리턴 타입을 알아내어, 람다식에서 굳이 선언이 불필요한 부분을 생략하는 것

(x, y) -> Math.max(x, y)

도 간단한 람다식이지만 더 간단히 메소드 참조를 해서

Math::max; // (x, y) -> Math.max(x, y)

로 표현할 수 있다!

[질문2] 람다와 익명클래스의 차이점

  1. 익명클래스의 this와 람다에서의 this는 의미가 다르다. 익명클래스의 this는 익명클래스 자신을 가리키지만 람다에서의 this는 선언된 클래스를 가리킨다.

  2. 익명 클래스는 인터페이스 타입과 메서드를 반복해야해서 코드가 길어지지만 람다를 사용하면 불필요한 반목문을 삭제할 수 있고 복잡한 식을 단순하게 표현할 수 있다.

참고
익명 클래스와 람다식
https://yummy0102.tistory.com/661
함수형 인터페이스
https://yummy0102.tistory.com/660
stream API 관련 https://velog.io/@blwasc/%EC%8A%A4%ED%8A%B8%EB%A6%BC
메소드 참조 관련
https://inpa.tistory.com/entry/JAVA8-%E2%98%95-%EB%9E%8C%EB%8B%A4%EC%8B%9D%EC%9D%84-%EB%8D%94-%EC%A7%A7%EA%B2%8C-%EB%A9%94%EC%86%8C%EB%93%9C-%EC%B0%B8%EC%A1%B0Method-Reference

profile
초보개발자

0개의 댓글

관련 채용 정보