면접에서 진짜 자주 나오는 자바 질문 - 섹션 4. 자바 8 핵심 기능
1. 람다 표현식 (Lambda Expressions)
람다(Lambda)는 익명 함수(Anonymous Function)를 표현하는 방식으로, 간결한 코드 작성과 컬렉션 처리 간소화에 큰 기여를 했다.
// 기존 방식
Comparator<String> comp = new Comparator<>() {
public int compare(String a, String b) {
return a.compareTo(b);
}
};
// 람다 표현식
Comparator<String> comp = (a, b) -> a.compareTo(b);
- 장점: 익명 객체 작성의 번거로움 제거, 가독성 향상
- 실무 활용: 정렬, 이벤트 처리, Stream 내부 처리 등
람다는 함수형 인터페이스를 구현하는 데 사용되며, 코드의 명확성과 유연성을 높여준다.
2. 함수형 인터페이스 (Functional Interface)
자바 8에서는 @FunctionalInterface를 도입하여, **단일 추상 메서드(SAM)**를 가지는 인터페이스를 명확히 표시했다.
대표적인 자바 내장 함수형 인터페이스:
인터페이스 | 설명 |
Function<T, R> | T → R 형태의 변환 |
Predicate<T> | boolean 반환 조건 검사 |
Consumer<T> | T를 소비하고 반환 없음 |
Supplier<T> | T를 반환, 매개변수 없음 |
Function<String, Integer> strLength = s -> s.length();
Predicate<Integer> isEven = x -> x % 2 == 0;
스트림, 람다, 메서드 참조와 밀접하게 연결되어 자바 8의 다른 기능들과 함께 자주 쓰인다.
3. Stream API
Stream API는 컬렉션에 대한 반복 처리, 필터링, 매핑, 집계 등을 선언형 방식으로 처리할 수 있게 해준다. 코드가 깔끔해지고, 병렬 처리도 쉽게 구현 가능하다.
List<String> names = Arrays.asList("Tom", "Jerry", "Alice");
List<String> filtered = names.stream()
.filter(n -> n.startsWith("A"))
.map(String::toUpperCase)
.collect(Collectors.toList());
- 중간 연산: filter, map, sorted, distinct 등
- 최종 연산: collect, forEach, reduce, count
내부 반복을 통해 성능 최적화 가능하며, 특히 병렬 스트림(parallelStream())을 활용하면 대용량 데이터 처리 시 유리함.
4. Optional 클래스
Optional<T>는 null을 직접 다루지 않도록 도와주는 컨테이너 객체다. NullPointerException 방지에 유리하며, 값이 있을 수도 있고 없을 수도 있는 상황을 안전하게 처리할 수 있게 해준다.
Optional<String> name = Optional.ofNullable(getName());
name.ifPresent(System.out::println);
- 주요 메서드:
- isPresent(), ifPresent()
- orElse(), orElseGet(), orElseThrow()
- map(), flatMap()
단순히 null 체크 대신, 함수형 방식으로 우아한 처리가 가능하다는 점에서 실무에서도 점점 사용이 늘고 있다.
5. 메서드 참조 및 디폴트 메서드
메서드 참조 (Method Reference)
람다 표현식에서 이미 존재하는 메서드나 생성자를 참조할 수 있는 문법
List<String> list = Arrays.asList("a", "b", "c");
list.forEach(System.out::println); // 람다: x -> System.out.println(x)
형태:
- ClassName::staticMethod
- object::instanceMethod
- ClassName::instanceMethod
디폴트 메서드 (Default Method)
인터페이스에 구현부가 있는 메서드를 정의할 수 있게 해준다.
interface MyInterface {
default void log() {
System.out.println("기본 로그");
}
}
자바 8부터는 다중 상속 문제 해결과 인터페이스 확장성 강화를 위해 디폴트 메서드를 지원함.
마무리
자바 8은 함수형 프로그래밍의 강력한 도입과 함께, 코드의 생산성과 가독성 모두를 끌어올렸다. 면접에서는 다음과 같은 포인트에 주목해야한다.
- 람다/스트림을 이용한 실용 코드 작성 능력
- Optional 사용에 대한 철학적 이해 (null-safe 프로그래밍)
- 함수형 인터페이스와 고차 함수 설계
섹션5. 예외 처리, 로깅, 설계 패턴 ↓
면접에서 진짜 자주 나오는 자바 질문 - 섹션 5. 예외 처리, 로깅, 설계 패턴
1. 자바에서 예외(Exception)와 오류(Error)의 차이점Exception: 개발자가 처리 가능한 문제 (예: 파일 누락, 네트워크 오류)Error: JVM 레벨의 심각한 문제로 일반적으로 복구 불가 (예: OutOfMemoryError)Exception
biesil.tistory.com