[Java & SpringBoot로 시작하는 웹 프로그래밍] 4주차 학습 - 3 (내부 클래스, 람다식, 스트림)

진문장·2021년 9월 11일
0

내부 클래스, 람다식, 스트림

내부 클래스란?

  • 클래스 내부에 구현한 클래스 (중첩된 클래스)
  • 클래스 내부에서 사용하기 위해 선언하고 구현하는 클래스
  • 주로 외부 클래스 생성자에서 내부 클래스를 생성

내부 클래스 유형

종류구현 위치사용할 수 있는 외부 클래스 변수생성 방법
인스턴스 내부 클래스외부 클래스 멤버 변수와 동일외부 인스턴스 변수 / 외부 전역 변수외부 클래스를 먼저 만든 후 내부 클래스 생성
정적 내부 클래스외부 클래스 멤버 변수와 동일외부 전역 변수외부 클래스와 무관하게 생성
지역 내부 클래스메서드 내부에 구현외부 인스턴스 변수 / 외부 전역 변수메서드를 호출할 때 생성
익명 내부 클래스메서드 내부에 구현 / 변수에 대입하여 직접 구현외부 인스턴스 변수 / 외부 전역 변수메서드를 호출할 떄 생성되거나, 인터페이스 타입변수에 대입할 때 new 예약어를 사용하여 생성

람다식이란?

  • 자바에서 함수형 프로그래밍을 구현하는 방식
  • 클래스를 생성하지 않고 함수의 호출만으로 기능을 수행
  • 함수형 인터페이스를 선언함
  • 자바 8부터 지원되는 기능

함수형 프로그래밍이란?

  • 순수 함수(pure function)를 구현하고 호출

  • 매개 변수만을 사용하도록 만든 함수로 외부 자료에 부수적인 영향(side effect)가 발생하지 않도록 함

  • 입력 받은 자료를 기반으로 수행되고 외부에 미치지 않으므로 병렬처리등에 가능 안정적인 확장성 있는 프로그래밍 방식

    람다식 문법

  • 매개 변수 하나인 경우 괄호 생략가능 ( 두 개인경우는 괄호를 생략할 수 없음)

  • 익명 함수와 매개 변수만으로 구현되믈 단 하나의 메서드만을 선언해야 함
    ( 두개이상의 메서드가 선언되면 어느 메서드의 호출인지 모호해 짐 )

  • @FunctionalInterface 애노테이션 사용

    @FunctionalInterface
    interface Math {
      public int Calc(int first, int second);
    }
    
    public static void main(String[] args) {
      Math plus = (num1,num2) -> first + second; // 람다식!
      int n1 = 2;
      int n2 = 3;
      int sum = plus(n1,n2);
    }

    스트림(Stream)

  • 자료의 대상과 관계없이 동일한 연산을 수행할 수 있는 기능(자료의 추상화)

  • 배열, 컬렉션에 동일한 연산이 수행되어 일관성 있는 처리 가능

  • 한번 생성하고 사용한 스트림은 재사용할 수 없음

  • 스트림 연산은 기존 자료를 변경하지 않음

  • 중간 연산과 최종 연산으로 구분 됨

  • 최종 연산이 수행되어야 모든 연산이 적용되는 지연 연산

    스트림 연산 - 중간 연산

  • 중간 연산 - filter(), map()

  • 조건에 맞는 요소를 추출( filter() ) 하거나 요소를 변환 함(map())

  • 문자열의 길이가 5 이상인 요소만 출력 하기

/* 문자열의 길이가 5 이상인 요소만 출력 하기 */
 strings.stream() // 스트림 생성
      .filter( str -> str.length() >= 5) // 중간 연산
      .forEach( str -> System.out.println(str));  // 최종 연산
/* 고객 클래스에서 고객 이름만 가져오기 */
 customers.stream() // 스트림 생성
      .map( customer -> customer.getName() ) // 중간 연산
      .forEach( name -> System.out.println(name) );  // 최종 연산

스트림 연산 - 최종 연산

  • 스트림의 자료를 소모 하면서 연산을 수행
  • 최종 연산 후에 스트림은 더 이상 다른 연산을 적용할 수 없음
    • forEach(): 요소를 하나씩 꺼내 옴
    • count(): 요소의 개수
    • sum(): 요소의 합
  • 이 외도 여러가지 최종연산이 있음

reduce() 연산

  • 정의된 연산이 아닌 프로그래머가 직접 지정하는 연산을 적용
  • 최종 연산으로 스트림의 요소를 소모하며 연산 수행
/* 배열의 모든 요소으 합을 구하는 reduce() 연산 */
Arrays.stream(arr)
      .reduce(0,( a, b ) -> a + b ) );

0개의 댓글