개발/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
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
스프링 부트 2에서 스프링 부트 3로 업그레이드 가이드- 블로그
우리팀이-jdk-17을-도입한-이유 - 여기어때 블로그
728x90
반응형