개요

JAVA 8 에서 17 로 넘어가려는 움직임이 보인다. 간략하게나마 이유를 알아보고 진짜 넘어갈 필요가 있는지 한번 생각해 보자.
자세한 내용이 궁금하면 다른 사람의 글을 참고하자.

  • 목차
    • 아직도 JAVA 8을 사용하는 이유?
    • java 9 ~ 17 까지의 변경점들

 

아직도 JAVA 8을 사용하는 이유?


  • 호환성
    JAVA8이 나왔을 당시만 해도 JAVA 1.6, 1.7에서 자연스럽게 8(공식적으로 JAVA 1.8 버전부터 JAVA8로 표기하기로 함)로 업그레이드 했다. 이전 버젼들과 호환성이 좋았고 업그레이드에 큰 문제가 거의 없어서 자연스럽게 1.8을 선택했던 것 같다.
  • LTS
    JAVA8 은 LTS(Long Term Support) 버전이다. 말 그대로 Oracle사에서 오랜기간 지원해주는 버젼이라는 뜻이다. JAVA17 이 나오기 전까지 LTS버젼은 JAVA11 이 있었지만, 8보다도 지원 기간이 짧았기 때문에 시스템 운영면에서 굳이 11로 넘어가는 모험을 할 필요가 없었을 것이다. 그래서 아직까지도 8 버젼을 쓰는 곳이 많을 수 밖에 없다.
  • LTS 버젼별 지원 기간
  •   JAVA 8 : 2030년 12월
      JAVA 11 : 2026년 9월
      JAVA 17 : 2029년 9월
    

그렇다면 17도 8보다 지원기간이 짧은데 왜 넘어가야 할까?

 

JAVA 9~17 까지의 변경점들


JAVA17은 이전 버젼들의 변화들을 포함하고 있다.
내가 주목하는 점은 개발시의 이점이 있을만한 편의성 개선에 있다.
어떤 것들이 쓸모가 있을지 알아보자.

개발시 사용될 변경점들

  • Stream Class - iterate (JAVA 9)
    • 1.6 때 JAVA를 공부해서 그런가 개인적으로는 iterate 같은 함수 형태의 반복문을 비 선호하는 편이다. 물론 필요에 따라 사용하긴 했다.
      JAVA 9 에서는 iterate() 를 Override 하여 파라미터 3가지를 받는 형태의 메서드가 추가되었다.
      기존 for문 처럼 초기값, 반복될 범위, 증가값을 파라미터로 전달 할 수 있게 되었다. 그것도 반복 범위와 증가값을 람다 형태로 말이다.아니 이럴거면 기존 for문을 쓰라고 경우에 따라 JAVA 9 버젼의 iterate()를 쓸 일이 있을 것 같다.
  • interface private method (JAVA 9)
    • JAVA 8의 interface default Method에 이어 interface private Method 가 추가되었다. 인터페이스 상에서 정의해 둔 것을 상속한 클래스에서 구현할 수 없도록 하여 변경할 수 없도록 강제하는 것이 가능해졌다.
  • var (JAVA10) 타입추론 개념으로 var라는 형태를 사용할 수 있다.
    var는 몇가지 제약사항이 있다.
    • 지역변수로만 사용가능
    • 초기화 필수, null 불가
      • 타입 추론을 위해서는 초기화가 필수겠지? 그러니 null도 사용할 수 없다.

        C#을 안해봐서 그런지 JAVA에 꼭 필요한가 의문이 든다. 람다식이 나온 후로 적응하기 힘들어하는 내가 문제겠지..
        뭔가 편리할 것 같긴 한데 큰 변화라고 하긴 힘들어보인다. 오히려 사용하기 위해 공부를 해야하는 느낌이지만 일단 알아두고 나중에 써먹자.
  • switch~case문의 변화 (Java 12 ~ 17)
    기존에는 ‘case’마다 하나의 값만 지정이 가능했기 때문에 ‘break’문을 적절히 사용하면서 로직을 구성해야 해서 가독성이 떨어지는 경우가 많고 로직이 지저분해짐을 느껴 그냥 ‘if ~ else if’문으로 처리해버리는 경우가 많았다.
    switch~case문에 많은 변화가 생겼는데 JAVA17 이전까지는 ‘case’에 여러 값을 지정할 수 있게 되고, 화살표로 리턴값을 지정할 수 있게 되는 등 기존에 불편했던 case문의 기능상 편의성 개선이 많았고 JAVA17 에서는 패턴 매칭 기능, Gaurded Patterns, Null Cases 도 추가되어 기능을 확장시키려는 노력이 엿보인다. 이로써 더욱 깔끔한 코딩이 가능해지고 가독성이 향상되었지만 더 머리아파질 것 같다.
    • case 문에 여러 값 적용
      String java_lts = switch (version) {
          case 8, 11, 17 -> "LTS";
          default -> "NOT LTS";
      };
      
    • 패턴 매칭
      return switch (obj) {
          case Integer i -> "It is an integer";
          case String s -> "It is a string";
          case Employee s -> "It is a Employee";
          default -> "Unknown";
      };
      
    • Gaurded Patterns & Null Cases
      return switch (obj) {
          case Integer i -> "It is an integer";
          case String s -> "It is a string";
          case Employee employee && employee.getDept().equals("IT") -> "IT Employee";
              // case 문에 이런 로직도 사용 가능하리라고는 생각지도 못했다.
          case null -> "It is a null object";	// null case 가 가능해졌다.
          default -> "It is none of the known data types";
      };
      

 

  • Sealed Classes, Sealed Interface (JAVA 15, 17)
    • Sealed 는 ‘봉인된’ 이라는 뜻으로, 지정된 클래스만 상속 혹은 구현이 가능하고 다른 클래스에서는 상속이나 구현이 불가능하다.
    • sealed, final, non-sealed 세 가지 상태가 있다.
	/* 
	 * Game.java 파일
	 * permits 로 선언된 Nintendo, Sony class 만 Game class 를 상속할 수 있다.
	 */
	public sealed class Game permits Nintendo, Sony {}
	...
	
	/* 
	 * Nintendo.java 파일
	 * final 로 선언된 Nintendo Class. 다른 클래스에서 Nintendo 클래스를 상속할 수 없다.
	 */
	public final class Nintendo extends Game {} 	// Game Class 상속가능
	...


	/* 
	 * Sony.java 파일
	 * non-sealed 선언되었기 때문에 Sony class는 아무 클래스에서나 상속 가능하다.
	 */
	public non-sealed class Sony extends Game {}	// Game Class 상속가능
	...


	/* 
	 * Playstation.java 파일
	 * Nintendo 가 final 로 선언된 class 이기 때문에 상속할 수 없다.
	 */
	public class Playstation extends Nintendo {} // Nintendo Class 상속불가
	
	
	/* 
	 * Vita.java 파일
	 * non-sealed class 인 Sony.java 상속이 가능하다
	 */
	public class Vita extends Sony {} // 상속가능
	...
	

 

그 외 변경점들

  • JAVA17은 가장 최신의 LTS 버젼
  • Garbage Collector(GC) 병렬 처리 도입으로 인한 성능 향상 (Java 10)
  • JVM heap 영역을 시스템 메모리가 아닌 다른 종류의 메모리에도 할당 가능 (Java 10)
  • 유니코드 12.1 지원 (Java 13) …
    등등 기술하지 않은 많은 변화들이 있다.

내가 환경 구성을 선택할 수 있는 위치가 아니다보니 새로운 JAVA 버전이 나와도 특별히 관심을 기울이지 않았었다. 이번 기회로 JAVA 버젼별 특징을 정리하고 보니 몇몇 변경점에 관심이 생겼다. 특히 heap 영역을 시스템 메모리가 아닌 다른 종류의 메모리에도 할당 가능한 기능이 눈에 띄는데 이건 더 자세히 공부할 필요가 있을 것 같고, 변경된 switch~case 문 만으로도 JAVA 17 버전을 적용해보고 싶다는 생각이 든다.
회사에서는 우선 새로 구축될 시스템에서 JAVA17을 적용하고 그 이후에 레거시 시스템을 업그레이드 하는 게 작은 위험요소라도 줄일 수 있을 것 같다.

+ Recent posts