개발/JAVA

[JAVA] JAVA 11 에서 JAVA 17 으로

seopport 2023. 10. 4. 22:35
728x90
반응형

들어가기 앞서

' 자바 최신 버전이 무조건 좋아? '라는 질문에 필자는 '응'이라고 대답하기는 어려울 것 같습니다. 물론 기능이 추가되고 편의성을 위해 여러 가지를 제공해 주는 것은 부정할 수 없고 너무나도 감사한 일입니다. 실무에서 자바 버전에 대해 라이브러리나 플러그인 호환성을 고려하지 않고 마음대로 올려버리면, 빨간 줄의 지옥을 맛볼 수 있습니다. 아직도 실무에서는 자바 8 버전을 사용하는 곳이 많고, 운영하시는 시니어분들의 마음과 안전을 고려하였을 때 자바의 업그레이드와 마이그레이션을 시도하기에는 어려운 상황입니다.

 

그럼에도 필자는 이번에는 자바 17에 대해서 알아보고 사이드 프로젝트를 자바 17 로 진행할 예정입니다. 자바 17 은 여러 가지 의미로 중요합니다. '자바' 하면 떠올리는 프레임워크는 '스프링'과 '스프링부트'입니다. 2022년 11월 Spring Frame 6.0와 Springboot 3 이 정식 릴리즈 되었습니다. 중요한 부분은 Springboot 3 버전은 Spring Frame 6.0 기반이며, 자바 17 이상 버전을 지원합니다. 

 

JAVA 11 과 JAVA 17
JAVA 11 과 JAVA 17

 

JAVA 11 그리고 JAVA 17

Pattern Matching for switch

기존의 스위치 문을 강화하고 보다 표현력 있는 코드를 작성할 수 있습니다. 람다 표현식(->)을 활용하여 조금 더 가독성 있는 코드를 작성할 수 있습니다.

 

예제 1) 타입 별로 case 문에 넣고 람다 표현식을 활용하여 보여 줄 수 있는 기본적인 예제입니다.

public class TypePatternMatchingExample {
    public static void main(String[] args) {
        Object input = "문자열"; // 다른 타입으로 시도해보세요.

        String result = switch (input) {
            case Integer i -> "정수 값: " + i;
            case Double d -> "실수 값: " + d;
            case String s -> "문자열: " + s;
            default -> "알 수 없는 타입";
        };

        System.out.println("결과: " + result);
    }
}

 

예제 2) 객체 별로 case 문에 넣어 람다 표현식을 활용하여 나타낼 수도 있습니다.

Object obj = new Circle(5);

double area = switch (obj) {
    case Circle c -> Math.PI * c.getRadius() * c.getRadius();
    case Rectangle r -> r.getLength() * r.getWidth();
    default -> 0.0;
};

System.out.println("도형의 면적은: " + area);

 

텍스트 블록 (JAVA 15 ~)

  • 텍스트를 줄 바꿈과 서식을 포함한 텍스트를 표현할 수 있어 더욱 쉽게 작성할 수 있고 유지보수에도 도움을 주는 기능입니다. 
  • 삼중 따옴표로 시작하고 삼중 따움표로 끝납니다.
String htmlDocument = """
    <!DOCTYPE html>
    <html>
    <head>
        <title>텍스트 블록 예시</title>
    </head>
    <body>
        <h1>환영합니다!</h1>
        <p>텍스트 블록을 사용하면 HTML을 더 쉽게 작성할 수 있습니다.</p>
    </body>
    </html>
    """;

 

Sealed Class(Sealed 클래스)

  • JAVA 17 에 도입된 Sealed Class(Sealed 클래스)는 클래스들의 상속 관계를 조절하기 위한 새로운 기능입니다.
  • 특정 클래스의 하위 클래스를 명시적으로 제한하고, 어떤 클래스가 해당 클래스를 상속하거나 구현할 수 있는 지를 제어하는 데 사용합니다.
  • 무결성을 강력하게 유지할 수 있고, 예상치 못한 하위 클래스의 생성을 방지할 수 있다.
sealed class Alpha permits A, B, C {
    // ...
}

final class A extends Alpha {
    // A 클래스의 구현
}

final class B extends Alpha {
    // B 클래스의 구현
}

final class C extends Alpha {
    // C 클래스의 구현
}

final class D extends Alpha {
	// 컴파일 오류
}

 

Record Data Class

  • 자바 14 버전에서 Preview 기능으로 추가 되었습니다.
  • 자바 16 버전에서 정식적으로 기능이 추가 되었습니다.
  • 기존 toString, equals, hashCode 메소드를 자동으로 구현해주며, 모든 인스턴스 필드를 초기화해주는 생성자가 생성이 됩니다
  • 불변 데이터 객체를 쉽게 생성할 수 있도록 만든 새로운 유형의 클래스입니다.
  • 불필요한 코드를 제거할 수 있고, 명확한 의도를 적은 코드로 나타낼 수 있습니다.

 

Record 클래스를 사용하지 않은 경우

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    public String setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
    
    public int setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }
}

 

Record 클래스를 사용한 경우

public record Person(String name, int age) {
    // 이곳에 추가적인 메소드나 필드를 정의할 수 있지만,
    // 일반적으로 레코드는 간단한 데이터 컨테이너로 사용됩니다.
}

 

참고 사이트

Spring-Boot-3.0-Migration-Guide

 

Spring Boot 3.0 Migration Guide

Spring Boot. Contribute to spring-projects/spring-boot development by creating an account on GitHub.

github.com

 

스프링 부트 2에서 스프링 부트 3로 업그레이드 가이드- 블로그

 

스프링 부트 2에서 스프링 부트 3로 업그레이드 가이드

0. 시작하며 22년 11월 스프링 부트 3가 정식 릴리즈 되었습니다. 18년 3월 1일 스프링 부트 2가 나온 이후 3년 9개월의 시간이 지난 오랜만의 메이저 업데이트 입니다. 기존의 프로젝트를 스프링 부

covenant.tistory.com

 

우리팀이-jdk-17을-도입한-이유 - 여기어때 블로그

 

우리팀이 JDK 17을 도입한 이유

안녕하세요, T플랫폼개발실 개발3팀 제이든입니다. 이번 포스팅에서는 저희팀에서 Java 17 버전을 도입하게 된 이유와 개발자 입장에서 주요하다 생각되는 업데이트 내용 및 사용사례를 소개드리

techblog.gccompany.co.kr

 

preparing-for-spring-boot-3-0

 

Preparing for Spring Boot 3.0

Spring Boot 2.0 was the first release in the 2.x line and was published on Feburary 28th 2018. We’ve just released Spring Boot 2.7 which means that, so far, we’ve been maintaining the 2.x line for just over 4 years. In total we’ve published 95 distin

spring.io

 

Dooray 포스트 - 스프링 부트 3.0으로 전환

 

스프링 부트 3.0 으로 전환 - Dooray! POST

2022년 11월에 기존의 Spring framework 5 와 Spring Boot 2.X 버전을 대체하는 Spring framework 6와 Spring Boot 3 가 릴리즈되었습니다. 어떤 변화가 있고, 어떻게 설정해야 할지 알아봅니다

post.dooray.io

 

여기 저번에 왔던 것 같은데? 블로그

 

Java 8, 11, 17 버전별 추가된 기능 (+ 무슨 버전을 써야할까?)

java 8, 11, 17 버전이 많이 사용되는 이유와 버전별 추가된 기능 최근 몇 년 동안 java에서 가장 많이 사용되는 버전은 'java 8'으로 저 역시 실무에서는 java 8만 계속 사용하고 있는데요. 자바는 2021년

wildeveloperetrain.tistory.com

 

728x90
반응형