Java 7 vs Java 8 뭐가 달라졌나?

maketheworldwise·2022년 3월 5일
0
post-custom-banner


이 글의 목적?

가장 많은 변화가 이루어진 Java 7과 8 버전을 간단하게 정리해보자.

Java 7

1️⃣ 숫자 표시 방법

// 2진수
int bin = 0b10001010010;

// 8진수
int oct = 02122;

// 10진수
int dec = 1106;

// 16진수
int hex = 0x452

// 숫자 가독성 보완
int million = 1_000_000;

2️⃣ switch문 String 사용

해당 내용은 생략!

3️⃣ 제네릭을 쉽게 사용할 수 있는 Diamond

해당 내용은 생략!

4️⃣ 달라진 예외 처리 (다중 처리, 리소스 처리)

// AutoCloseable 인터페이스로 close() 호출 생략
// Catch문 다중 예외 처리
try (Scanner scanner = new Scanner(new File(filename),encoding)) {
	System.out.println(scanner.nextLine());
} catch (IlleagalArgumentException || FileNotFoundException || NullPointerException exception) {
	exception.printStackTrace();
}

5️⃣ Fork/Join 기능 추가

이전 포스트에서 정리했으니 생략!

6️⃣ NIO2 추가

  • Paths, Files, FileSystems, FileStore로 File 클래스 대체
  • WatchService로 파일 변경 여부를 확인하는 클래스 추가 (lastModified() 메소드는 내부적으로 연계된 메소드가 많아 성능에 영향을 주기 때문에 이를 개선함)

Java 8

1️⃣ Lambda 표현식, 함수형 인터페이스

이 표현식은 인터페이스에 메소드가 하나인 것들만 적용이 가능하다. 이러한 인터페이스를 함수형 인터페이스라고 하는데, @FunctionalInterface 어노테이션을 이용해 명시적으로 선언해놓는다.

@FunctionalInterface
interface Calculate {
	int add(int a, int b);
}
Calculate cal = (a, b) -> a + b;
System.out.println(cal.add(1,2));

Java 8에서 제공하는 함수형 인터페이스는 java.util.function 패키지에 정의되어있다. 이 내용은 뒤에서 다시 정리해보자.

  • Predicate
  • Supplier
  • Consumer
  • Function
  • UnaryOperator
  • BinaryOperator

💡 람다는 왜 등장했을 까?

이전에는 CPU에는 하나의 코어만을 가지고 있었고, 멀티 태스킹 환경에서 사용하기 위해 시분할과 같은 기술들을 사용해왔다. 하지만 시간이 지나면서 데이터의 규모가 커지게 되고, 이러한 빅데이터를 처리하기 위한 방법으로 CPU를 다수 사용하거나 다수의 하드웨어를 사용하는 형태로 발전되었다. 즉, 일반 프로그래머의 영역을 벗어나게 되었다는 의미다.

하지만 이제 하나의 CPU에는 다수의 코어를 삽입하여 멀티 코어 프로세스가 등장하게 되었고, 병렬화 프로그래밍에 대한 필요성이 생기게 되었다. 이러한 추세에 대응하기 위해 자바 8에서는 병렬화를 위한 컬렉션(리스트, 배열, 맵)을 강화하고, 이를 효율적으로 사용하기 위한 스트림도 강화하게 되었다. 그리고 스트림을 효율적으로 이용하기 위해 람다가 도입되고 람다를 위한 함수형 인터페이스의 변화가 수반되었다.

2️⃣ Stream

연속된 정보를 처리할 때 사용한다. 이 개념에는 스트림 생성, 중개 연산, 종단 연산 3가지로 구분된다. 스트림 생성은 말 그대로 Collection 인터페이스에 선언된 stream() 메소드를 이용하여 스트림 객체로 만들어주는 단계, 중개 연산은 결과를 반환하지 못하지만 생성된 스트림 객체를 사용하여 필터링해주는 단계, 종단 연산은 중개 연산에서 작업된 내용을 바탕으로 결과를 반환해주는 부분이다.

스트림을 보다 빠르게 처리하려면 parallelStream()를 이용하면 되지만, CPU를 많이 사용하고 몇 개의 스레드로 처리될지 보장되지 않아 일반적인 웹 프로그램에서는 stream()만을 사용하는 것을 권장한다고 한다.

3️⃣ Optional

해당 내용은 생락!

4️⃣ 인터페이스 기본 메소드 추가

예를 들어 오픈 소스 코드를 작성했다고 했을 때, 전세계 사람들이 해당 소스 이용중에 새로운 메소드가 생성된다면, 문제가 발생할 수 있다. 이렇듯, 하위 호환성을 제공하기 위해서 기본 메소드가 추가되었다.

5️⃣ 날짜 관련 클래스 추가

해당 내용은 생락!

6️⃣ 병렬 배열 정렬

  • binarySearch(): 배열 내에서의 검색
  • copyOf() : 배열의 복제
  • equals() : 배열의 비교
  • fill() : 배열 채우기
  • hashCode() : 배열의 해시코드 제공
  • sort() : 배열의 정렬 (단일 스레드)
  • parallelSort() : 배열의 병렬 정렬 (Fork/Join 프레임워크가 내부적으로 사용되며, 여러 개의 스레드로 나뉘어 작업하기 때문에 CPU를 더 많이 사용하지만 처리 속도는 빠름)
  • toString() : 배열 내용을 출력

7️⃣ StringJoiner 추가

순차적으로 문자열을 나열할 때 사용한다. 예를 들어, 주로 콤마를 구분자로 문자열 사이에 넣어 출력하는 코드에서 사용한다. 대부분 각 문자열 뒤에 콤마를 붙여서 처리를 하게 되면 마지막 문자열의 뒤에서 콤마가 붙는 상황이 발생한다.

따라서 배열의 구성 요소 사이에 콤마와 같이 구분자를 넣고자 할 때 사용되는 클래스다.

8️⃣ 메소드 참조

메소드 참조는 ::를 의미한다. 자세한 내용은 생략!

이 글의 레퍼런스

  • 없음
profile
세상을 현명하게 이끌어갈 나의 성장 일기 📓
post-custom-banner

0개의 댓글