본문 바로가기
IT 개발자 면접 준비

JAVA 8 새로 추가된 기능! 개발자 면접 대비

by 워니 wony 2021. 5. 12.

 

개발자 면접에서 물어보는 질문 하나인 자바 8 특징 대해 정리를 해보려고 한다.

 

 

예전 개발자 면접에서 면접관이 이렇게 물어본 적이 있다.

 

면접 질문 1) java 버전은 어떤걸 사용했는지?
면접 질문 2) java 8에서 새롭게 추가된 것들이 있는데, 어떤것들이 있는지 아는가?

 

 

해당 질문에 대해 명확히 대답할 있도록

JAVA 8 새로운 기능, 변경 사항을 제대로 알아보자.

 

JAVA 8 2014년에 출시 되었다.

출시 된지 오래 되었지만 자바 8 새로운 기능을 물어보는 이유는 현재도 많이 쓰는 기능이기도 하고, 해당 기능을 지금도 제대로 알지 못하는 개발자도 있고, 실무에서는 자바 8을 사용하는 경우가 많기 때문이라 생각된다.

 

 

 

람다식 (Lambda)

 

람다는 익명 함수로, 이름과 식별자가 없는 함수를 말한다.

람다를 사용하면 코드를 간결하게 작성할 수 있다.

 

아래와 같은 -> 화살표를 쓰는 코드를 본적이 있다면 이것이 람다식을 쓴 코드라고 할 수 있다.

 

 

 

일반적인 람다식 구문은 아래와 같다.

(parameters) -> expression

 

예를 들어 아래와 같이 사용할 수 있다.

(x, y) -> x +y

 

 

 

참고 할 수 있도록 람다식 규칙에 대해 알아보자

 

람다 표현식 작성 규칙

  • 람다 식에는 매개변수가 0 개, 1개 이상 있을 수 있음 (매개변수 없어도 됨)
( ) -> expression
  • 매개 변수가 여러개이면 괄호로 묶고, 쉼표로 구분
( param1, param2, param3, param4 ) -> expression
  •  매개 변수가 1개인 경우 괄호를 반드시 쓰지 않아도 됨
x -> x + x
  • 람다 식의 본문이 단일 문인 경우 중괄호는 필수가 아니지만, 둘 이상의 명령문이 있는 경우 중괄호를 사용해야 함
(param1, param2) -> {
    param1 = param1 + 1;
    param2 = param2 + 2;
}

 

 

Optional

 

Optional을 사용하면 NullPointException을 걱정하지 않아도 된다.

기존에 null을 체크하기 위해서 if 문을 많이 사용했지만 Opitonal을 사용하면 Null을 핸들링 할 수 있게 된다.

 

옵셔널은 null이나 null이 아닌 값을 담을 수 있는 클래스이다.

옵셔널을 사용하면 DB를 조회하고 null인 경우 orElseThrow 메소드를 사용하여 에러를 던지거나 ifpresent 메소드로 분기처리를 하는 등 null 처리를 세련되게 할 수 있게 된다.

 

 

옵셔널 코드는 아래와 같다.


// 일반 Null 처리
String str = "name";

if (str != null) {
	System.out.println("name : " + str);
}


// Optional 처리 
String str2 = "name";

Optional<String> opt = Optional.ofNullable(str);
opt.ifPresent(s -> System.out.println("name : " + str));


 

 

 

 

Stream API

 

필터링, 변환 등 다양한 방식으로 배열이나 컬렉션 (List, Map 등) 을 반복적으로 처리하는 스트림 API 추가되었다.

컬렉션을 다루기 위한 API로 컬렉션의 요소를 람다식으로 처리하여 복잡한 구조의 데이터 처리를 간단하게 해주어 코드의 복잡도를 낮출 수 있다.

 

기존에 for 문을 돌리면서 처리하던 것을 Stream으로 변환하고, mapping, sorting, filtering 등 을 메서드로 할 수 있게 해준다.

 

스트림 API를 사용하면 기존 코드보다 가독성이 좋게 데이터 처리, 가공이 가능하다.

 

 

이해하기 쉽게 아래 비교 예시 코드를 보자.

자바 8 이전 버전에서는 반복문 for으로 처리하지만 자바 8 버전 부터는 test2의 코드처럼 스트림으로 가독성 좋게 처리할 수 있게 되었다.

@Test
void test() {
    // java 7
    List<String> nameList = Arrays.asList("apple", "pie", "banana", "cake", "coffee", "latte");
    List<String> aNameList = new ArrayList<>();

    for (String name : nameList) {
        if (name.contains("a")) {
            aNameList.add(name);
        }
    }

    for (String a : aNameList) {
        System.out.println(a);
    }
}


@Test
void test2() {
    // java 8
    List<String> nameList = Arrays.asList("apple", "pie", "banana", "cake", "coffee", "latte");
    nameList.stream()
            .filter(name -> name.contains("a"))
            .forEach(a -> System.out.println(a));
}

 

 

default method 디폴트 메소드

 

예전에 자바를 배울 때 인터페이스에는 추상 메서드만 사용할 수 있다고 배웠다.

하지만 이건 자바 버전에 따라 틀린 말이 될 수도 있다.

 

인터페이스와 추상클래스의 큰 차이점 중 하나가 인터페이스는 추상메서드만 사용할 수 있다고 배웠었다.

하지만 java 8 이후 버전에서는 인터페이스에서도 default와 static 메소드로 구현체를 만들 수 있게 되었다.

 

인터페이스에 아래와 같이 default method가 있어도 된다.

public interface DefaultInterFace {

    default void print(String name) {
        System.out.println("print name:" + name);
    }

}

 

Default Methods 참고 사이트

 

 

 

 

Funtional Interface

함수형 인터페이스는 SAM Interface (Single Abstract Method Interface) 라고도 한다.

단 1개의 추상 메소드를 가지고 있는 인터페이스를 말하며, @FuntionalInterface 어노테이션을 이용해 만들 수 있다.

 

아래와 같이 만들 수 있다.

@FunctionalInterface
public interface WorkFunctionalInterface {
    public void work();
}

 

 

Date/Time API

 

자바 8은 날짜와 시간에 대한 API가 변경되었다.

Date 클래스가 아니라 LocalDate, LocalTime, LocalDateTime 클래스를 사용하게 된다.

 

기존에 직관적이지 않던 date 처리가 자바 8에서 Date, time API 변경으로 직관적으로 변경되었다.

날짜 TimeZone 설정, 날짜 계산 등 편리하게 이용 가능해졌다.

LocalDate localDate = LocalDate.now();

System.out.println(localDate.toString());                // 2021-05-12
System.out.println(localDate.getDayOfWeek().toString()); // WEDNESDAY
System.out.println(localDate.getDayOfMonth());           // 12
System.out.println(localDate.plusDays(12).toString());   // 2021-05-24

 

Date Time 관련 API 참고 url

 

 

 

Method references

 

메서드 참조는 메서드의 참조를 전달한다는 의미로, 이것을 활용하면 람다 표현식에서 하나의 메소드만을 호출하는 경우 불필요한 매개변수를 제거하고 더 간단하게 코드를 줄여서 사용할 수 있다.

 

아래와 같은 문법으로 사용 가능하다.

클래스이름::메소드이름
참조변수이름::메소드이름

 

람다와 메서드 참조를 비교한 코드이다.

@Test
void test() {
    // lambda
    List<String> list = Arrays.asList("a", "b", "c", "d");
    list.forEach(x -> System.out.println(x));
}

@Test
void test1() {
    // method references
    List<String> list = Arrays.asList("a", "b", "c", "d");
    list.forEach(System.out::println);
}

 

 

간단하게 java 8에서 새롭게 추가된 기능에 대해 정리해 봤다.

  • Lambda
  • Optional
  • Stream API
  • Default Method
  • Funtional Interface
  • Date/Time API
  • Method references

이 외에도 추가된 기능이 있으니 추가적으로 궁금한 부분은 아래 링크에 들어가서 봐도 좋을 듯하다.

https://www.javatpoint.com/java-8-features

https://howtodoinjava.com/java8/lambda-method-references-example/

 

반응형

댓글