JAVA 버전 차이

Muzi·2023년 3월 18일
0

JAVA

목록 보기
1/4

학습

멀티코어 CPU 대중화 등 하드웨어의 발전은 자바의 변화를 부추겼다

특정 자바 버전의 학습

  • 자바는 하위 호환성이 매우 높다
    • python2에서 3과 같이 릴리스 사이에 심각한 문제(문자열처리)가 있는것과 달리
  • 즉, Java 5 또는 8 프로그램이 Java 8-17 가상 머신에서 실행되도록 보장된다.
  • 반대로 Java 8 JVM에서는 사용할 수 없는 Java 17 기능을 의존한다면 컴파일안됨
    • java.lang.UnsupportedClassVersionError 발생

Java 8 이전

  • 병렬성을 얻기위해 멀티스레드를 이용
  • 공유 객체, 변수에 접근하게되면 여러가지 문제가 발생할 수 있어 synchronized를 이용
    • 데드락같은
  • synchronized의 남발은 심각한 퍼포먼스 저하를 불러일으킴
    • 멀티코어 cpu를 이용하는 것보다 오버헤드가 큼

Java 8

대규모 릴리스

  1. 메소드에 코드를 전달하는 기법(메소드 참조, 람다)
  2. 스트림 API
  3. 인터페이스의 디폴트 메소드
  4. Optional

1. 메소드와 람다

프로그래밍 언어의 핵심은 값(=시민)을 바꾸는것
자바언어의 다양한 구조체(메서드,클래스 등)은 프로그램을 실행하는동안 자유롭게 전달할 수는 없다(= 2급시민)

자바8은 2급시민을 1급 시민으로 바꾸는 기능을 추가함
메서드에 코드를 전달하는 기법은 동적 파라미터화를 구현할 수 있다.

동적 파라미터화(Behavior Parameterization)

예를 들어, 비슷하지만 다른 동작을 하는 두 메소드를 각각 작성하는 것보다는

파라미터에 따라 다른 동작을 하도록 구현하는 것이 코드의 길이와 에러를 줄이는데에 더 바람직하다
스트림 API는 연산의 동작을 파라미터화 할 수 있는 코드를 전달한다는 사상에 기초한다는 점에서 중요함.

코드를 API로

// 디렉토리 내 모든 숨겨진 파일을 필터링하는 메소드
// 이미 isHidden 메소드를 가지고 있음에도 FileFilter라는 객체를 이용해야 필터링이 가능
// 가독성도 좋지않다.
File[] hiddenFiles = new File(".").listFiles(new FileFilter(){
	public boolean accept(File file){
    	return file.isHidden();
    }
});

// java 8에서 동일한 기능 수행
File[] hiddenFiles = new File(".").listFiles(File::isHidden);

메소드 전달에서 람다로

  • 람다를 이용하여 더욱 간결하고 직관적인 구현
// before
Runnable runnable = new Runnable(){
   @Override
   public void run(){
     System.out.println(*"Hello world !"*);
   }
 };

// after
Runnable runnable = () -> System.out.println(*"Hello world two!"*);

2. 스트림 API

스트림 API는 파이프라인을 만드는데 필요한 많은 메소드를 제공

이는 작업을 고수준으로 추상화해 일련의 스트림으로 만들어 처리가능하고 스레드라는 복잡한 작업을 사용하지 않으면서도 파이프라인을 이용해 입력부분을 여러 CPU 코어에 쉽게 할당 가능해 공짜로 병렬성을 얻을 수 있다

// 모호함과 반복적인 코드문제 또한, 멀티코어 활용의 어려움을 해결함
List<String> list = Arrays.asList("franz", "ferdinand", "fiel", "vom", "pferd");
list.stream()
    .filter(name -> name.startsWith("f"))
    .map(String::toUpperCase)
    .sorted()
    .forEach(System.out::println);
// 기존의 컬렉션은 어떻게 데이터를 저장하고 접근할지를 중점적으로 보고
// 스트림은 데이터에 어떤 계산을 할 것인지 묘사하는 것을 중점적으로 본다
import static java.util.stream.Collectors.toList;

// 순차 처리
List<Apple> heavyApples = inventory.stream().filter((Apple a) -> a.getWeight() > 150)
                                            .collect(toList());
                                            
// 병렬 처리
List<Apple> heavyApples = inventory.parallelStream().filter((Apple a) -> a.getWeight() > 150)
                                                    .collect(toList());

병렬성과 공유 가변데이터

x라는 변수를 A와 B 메소드가 사용한다고 생각해보자. 병렬로 실행되지 않을 때는 어렵지 않게 원하는 x 값을 구할 수 있지만, 병렬로 실행될 경우 A와 B의 실행 순서를 보장하기 어렵고, 그에 따라 원하는 결과를 얻을 수 없을 확률이 더 높을 것이다.

이 때, x를 공유된 가변 데이터라고 부르며, 여기에 접근을 하지 않도록 코드를 작성해야 한다. 기존의 자바에서는 synchronized키워드를 통해 보장이 가능하지만 성능상 그리 좋지 않았다.

JAVA 8에서는 스트림을 이용하여 쉽게 사용할 수 있다.


3. 인터페이스의 디폴트 메소드

인터페이스에 메소드를 추가할때마다 인터페이스를 구현한 모든 클래스에도 메소드를 추가해야한다는건 매우 고통스럽다.

Java 8에서는 구현하지 않아도 되는 메소드를 인터페이스에 추가할 수 있는 기능을 제공하는데 이것이 바로 디폴트 메소드

  • 실제로 List 인터페이스에 디폴트 메소드가 정의되어있기 때문에 우리는 List에서 직접 sort 메소드를 호출할 수 있으며 default sort를 구현하지 않아도 된다
  • 디폴트 메소드는 클래스 구현이 아니라 인터페이스의 일부로 포함된다

자바에서 다중 상속이 허용되지 않는 이유 - 다이아몬드 상속

  • 디폴트 메소드의 경우에는 우선순위를둬 충돌 피함 but, 우선순위도 같아 충돌이 발생시 다중상속을 지원하지 않거나 새롭게 오버라이딩하여 사용

4. Optional

null 참조를 만든 것은 10억 달러짜리 실수였다 - Tony Hoare

  • Java 8에서는 NullPointer 예외를 피할 수 있도록 Optional 클래스를 제공해 값이 없는 상황을 어떻게 처리할지 구현하는 메소드를 포함한다

Java 9

모듈 시스템 등장

Jigsaw(직소) 프로젝트 기반하에 개발된 Java9 Module 시스템은
안정적인 구성과 강력하고 유연한 캡슐화를 제공

1. 모듈 시스템
2. 컬렉션
3. 스트림
4. optional
5. 인터페이스

Jigsaw 프로젝트의 목표

  • 라이브러리와 규모가 큰 시스템을 모듈화하여 강력한 접근 제어
    • 캡슐화를 통한 느슨한 결합으로 유지관리 향상
    • 불필요하고 비인가된 모듈간 결합 방지를 통한 올바른 사용 유도
    • 보안성 향상
  • JPMS(Java Platform Module System)의 일환으로 JRE를 작은 단위의 모듈로 쪼갬
    • 기존에는 사용하지 않더라도 XML, SQL, SWING 같은 패키지는 항상 같이 배포함
    • 어플리케이션에서 실제로 사용하는 모듈만 패키징하여 배포 가능
  • JVM은 모듈 dependency graph를 이용해 애플리케이션에서 어떤 모듈을 필요로 하는지 체크해서 필요한 모듈을 못 찾으면 missing module을 report하고 종료해서 런타임 오류 방지
    • JPMS 이전에는 missing class를 실제로 사용하려 할때(런타임 시점)에 오류를 발견함

1. Module이란

code - type을 포함하고 있는 packages (class, interface 등)
data - resources 등 정적 정보

Class는 field와 method를 포함
Package는 Class와 Enum, Interface, 설정파일등을 포함
Module은 Package와 다른 데이터 자원들을 포함

  • 모듈 시스템은 Module이 다른 Module을 읽거나 다른 Module에서 접근할 수 있는 방법을 제어하는 가독성과 접근성 제공

2. Collection

list, set, map을 쉽게 구성할 수 있는 몇 가지 기능 추가

List<String> list = List.of("one", "two", "three");
Set<String> set = Set.of("one", "two", "three");
Map<String, String> map = Map.of("foo", "one", "bar", "two");

3. Stream

takeWhile, dropWhile, iterate 메서드의 형태로 기능 추가

List<Integer> list = List.of(1, 2, 3, 4, 5);
List<Integer> result = list.stream()
                           .takeWhile(x -> x < 4)
                           .collect(Collectors.toList());
// result = [1, 2, 3]
List<Integer> list = List.of(1, 2, 3, 4, 5);
List<Integer> result = list.stream()
                           .dropWhile(x -> x < 4)
                           .collect(Collectors.toList());
// result = [4, 5]
Stream<Integer> stream = Stream.iterate(0, x -> x + 1);
List<Integer> result = stream.limit(5)
                             .collect(Collectors.toList());
// result = [0, 1, 2, 3, 4]

4. Optional

ifPresentOrElse 기능 추가

user.ifPresentOrElse(this::displayAccount, this::displayLogin);

5. 인터페이스

  • 인터페이스에 private method 사용 가능
    • 코드 중복을 피함
    • 유지보수 높이기 위해서
// calculate 메서드는 getSpeed에만 사용되는 메서드로 인터페이스
// 외부에 표시되지 않으며 Vehicle 인터페이스를 구현하는 모든 클래스에서 구현할 필요가 없다
  
public interface Vehicle {
    void drive();
    
    default double getSpeed(double distance, double time) {
        double speed = calculateSpeed(distance, time);
        return speed;
    }
    
    private double calculateSpeed(double distance, double time) {
        return distance / time;
    }
}

Java 10

  • var 키워드

    • 지역변수에서만 사용 가능
    • 클래스 멤버 변수, 메서드 파라미터, 메서드 리턴타입으로 사용 불가
  • 병렬처리 가비지 컬렉션 도입으로 성능 향상

  • Java 10부터는 소스파일을 먼저 컴파일하지 않고도 실행할 수 있다.
    - local-variable type inference at compile time
    - 스크립팅을 향한 한 걸음

    	`var name = "John";`

Java 11

  • lambda 지역변수 사용법 변경(var 사용가능)
    • (var firstName, var lastName) -> firstName + lastName

Reference

아래 게시글들을 토대로 작성하였습니다

https://www.oracle.com/java/technologies/javase/8-whats-new.html
https://jyukki.tistory.com/19
https://siyoon210.tistory.com/125
https://zorba91.tistory.com/339
https://girawhale.tistory.com/127
https://www.baeldung.com/java-when-to-use-parallel-stream

profile
좋아하는걸 열심히

0개의 댓글