본문 바로가기

JAVA

2022.12.01 인터페이스, 람다, 스트림, Optional

춥다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
interface Practice {
    // 상수
    (final/static : 지우라고뜸) 타입 상수명(대문자 convention) = 값;
    String HI = "Hi~";
 
    // 추상 메서드
    List<String> findAllName();
 
    // Default 메소드
    default 타입 메소드명(파라미터,...) {...}
    default void printHi() {
        System.out.println(HI);
    }
 
    // static 메소드
    static void printHi() {
        System.out.println(HI);
    }
}
cs

필드 구성가능

상수만 가능, 클래스 로드 시점에서 public static fianl이 붙음

  • 기본 메서드 제공
    • 자바는 단일 상속, 인터페이스는 다중 구현이 가능하다. → 충돌나는 메서드시그니처는 오버라이딩을 강제한다.
    • 오버라이딩 가능.
    • 기본 public . 생략시 컴파일 과정에서 붙음.
  • static 메소드 → 헬퍼 또는 유틸리티 메소드를 제공할 때 사용
    • static 블록 작성 불가.

다형성 구현

상속 또는 인터페이스의 자동 형변환 (Promotion)

 

Service service = new DefaultService();

DefaultService serviceExtend = new DefaultServiceExtend();

Service serviceExtend = new DefaultServiceExtend();

 

상위 인터페이스, 클래스, 추상 클래스로 Upcasting 가능

 

 

함수형 인터페이스와 람다 표현식

  1. 함수형 인터페이스
    1. 추상 메소드를 하나만 가지고있는 인터페이스
    2. @FuntionalInterface 애노테이션을 인터페이스에 선언하면 컴파일 시점에서 추상메소드를 하나만 갖는지 체크해 준다.
1
2
3
4
@FunctionalInterface
public interface Sum {
    int intSum(int x, int y);
}
cs
  1. 람다 표현식 (Lambda Expression)람다식은 익명 객체, 간단히 말해 메소드를 하나의 식으로 표현한 것.

인텔리제이가 메소드 레퍼런스로 추천해줌

기본적으로 있는 메서드에 대해서 인텔리제이가 추천해준다.

 

스트림

배열이나 컬렉션에 담긴 데이터를 다룰 때, 반복문이나, iterator를 사용하면 코드가 길어지고, 가독성이 떨어진다. 이 문제를 해결하기위해 Stream API 등장.

  • 특징
    • 스트림은 데이터를 변경하지 않는다. → Immutable
    • 스트림은 재사용이 불가. → 최종 연산이 실행된 후 재사용 불가.
  • 스트림 파이프라인
    • 0 ~ N 개의 중개 연산과 1개의 종료 연산으로 구성.
  • 중개 연산
    • Stream을 리턴.
  • 종료 연산
    • Stream을 리턴하지 않는다.
  1. 대표 스트림
    • 중개 연산자
      • 필터링 : filter , distinct
      • 변환 : map , flatMap
      • 제한 : limit , skip
      • 정렬 : sorted
    • 최종 연산
      • 요소 출력 : forEach
      • 요소 검색 : findFirst, findAny
      • 요소 통계 : count, min, max
      • 요소 연산 : sum, average
      • 요소 수집 : collect

Optional

  1. Optional 이란?⚠️ 잘못 사용하면 오히려 코드가 오히려 지저분해지고, 의미 없는 동작, Side-Effect 유발이 많이 발생할 수 있음.null 을 반환하면 오류가 발생할 가능성이 매우 높은 경우에 “결과 없음”을 명확하기 드러내기 위해 메소드의 반환 타입으로 사용되도록 매우 제한적인 경우로 설계됨.
    • Java 언어 아키텍트 Brian Goetz
    ✅ Optional은 메소드 반환 타입으로만 사용해야한다.
  2. ➕ Optional은 Wrapper Class 이다.
  3. → NPE은 물론이고, NoSuchElementException이 발생함. → 잘못된 Optional 사용으로 새로운 문제들이 발생함. → 코드의 가독성을 파괴 → 시간, 공간적 비용이 증가함

NPE(Null Pointer Exception) 예외를 Optional이 제공하는 메소드로 간단하게 회피할 수 있다.

1
2
3
Optional<String> opt = Optional.ofNullable("Optional은 Wrapper Class");
 
System.out.println(opt.get());
cs