객체지향 프로그래밍(55강 - 60강)

내부클래스

  • 클래스 내부에 구현한 클래스(중첩된 클래스)
  • 클래스 내부에서 사용하기 위해 선언하고 구현하는 클래스
  • 주로 외부 클래스 생성자에서 생성
종류 구현 위치 사용 가능한 외부 클래스 변수 생성 방법
인스턴스 내부 클래스 외부 클래스 멤버 변수와 동일 외부 인스턴스 변수
외부 전역 변수
외부 클래스 먼저 만들고 생성
정적 내부 클래스 외부 클래스 멤버 변수와 동일 외부 전역 변수 외부 클래스와 무관하게 생성
지역 내부 클래스 메서드 내부 외부 인스턴스 변수
외부 전역 변수
메서드 호출할 때 생성
익명 내부 클래스 메서드 내부에 구현
변수에 대입하여 직접 구현
외부 인스턴스 변수
외부 전역 변수
메서드를 호출할 때 생성되거나 인터페이스 타입 변수에 대입할 때 new 예약어 사용하여 생성

Lambda

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

함수형 프로그래밍

  • 순수 함수를 구현하고 호출
  • 매개 변수만을 사용하도록 만든 함수로, 외부 자료에 부수적인 영향이 발생하지 않도록 함
  • 입력 받은 자료를 기반으로 수행하고 외부에 영향을 미치지 않으므로 병렬 처리 가능
  • 안정적이고 확장성 있는 프로그래밍

문법

  • 매개 변수가 하나인 경우 괄호 생략 가능

    str -> {System.out.println(str);}
    
  • 중괄호 안의 구현부가 한 문장인 경우 중괄호 생략

    str -> System.out.println(str);
    
  • 중괄호 안의 구현부가 한 문장이라도 return 문은 중괄호를 생략할 수 없음

    str -> return str.length();
    
  • 중괄호 안의 구현부가 반환문 하나이면 return과 중괄호 모두 생략 가능

    (x, y) -> x+y
    str -> str.length()
    

####

Stream

  • 자료의 대상과 관계없이 동일한 연산을 수행할 수 있는 기능(자료의 추상화)
  • 배열, 콜렉션에 동일한 연산이 수행되어 일관성있는 처리 가능
  • 한 번 생성하고 사용한 스트림은 재사용 불가
  • 스트림 연산은 기존 자료를 변경하지 않음
  • 중간 연산과 최종 연산으로 구분
  • 최종 연산이 수행되어야 모든 연산이 적용되는 지연 연산

중간 연산

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

  • 조건에 맞는 요소를 추출하거나 변환

  • 예제

    // 문자열의 길이가 5 이상인 요소만 출력
      
    sList.stream().filter(s -> s.length() >= 5).forEach(s -> System.out.println(s));
    
    // 고객 클래스에서 고객 이름만 가져오기
      
    customerList.stream().map(c -> c.getName()).forEach(s -> System.out.println(s));
    

최종 연산

  • 스트림의 자료를 소모하며 연산 수행
  • 최종 연산 후에 스트림은 더이상 다른 연산을 적용할 수 없음
  • forEach() : 요소 하나씩 꺼내오기
  • count(): 요소의 개수
  • sum() : 요소의 합

reduce() 연산

  • 정의된 연산이 아닌 개발자가 직접 지정하는 연산 적용

  • 최종 연산으로 스트림의 요소를 소모하며 연산 수행

  • 두번째 요소로 전달되는 람다식에 따라 다양한 기능 수행

    // 배열의 모든 요소의 합을 구하는 연산
      
    Arrays.stream(arr).reduce(0, (a, b) -> a + b);