Java Record
자바 14에서 preview로 등록되었고 자바 16 버전에 정식으로 새로운 기능으로 Record Type이 추가되었습니다.(나모찾기님 수정) 내용을 간단하게 설명하자면 기존의 POJO 객체를 만들 때 get~, set~ 이런 식으로 잡다하게 붙여줘야 할 일을 줄여주는 Type입니다.
기능
- 모든 프로퍼티를 포함한 생성자 제공
- 모든 프로퍼티에 private final 적용
- 모든 프로퍼티의 getter 메소드 생성
- toString, equals, hashCode 메소드 생성
- 프로퍼티들에게 annotation을 붙일 수 있도록 허용
사용법
//Record를 사용하지 않은 클래스
public class Car {
private final String name;
private final int power;
public Car(String name, int power) {
this.name = name;
this.power = power;
}
public String getName() {
return this.name;
}
//setter는 Record에서 제공하지 않음
public void setName(String name) {
this.name = name;
}
public int getPower() {
return this.power;
}
//setter는 Record에서 제공하지 않음
public void setPower(int power) {
this.power = power;
}
}
기본적으로 모델 객체를 만들 때 위와 같이 코드를 작성합니다. getter, setter를 작성하여서 사용하거나 setter를 제외하고 생성자만을 사용해서 인스턴스를 만들기도 합니다.
하지만 우리는 매번 이러한 작업을 하기 귀찮기 때문에 IDE에서 getter, setter, constructor를 만들어주는 기능이 있기도 하고 아니면 Lombok이라는 플러그인을 사용하기도 합니다.
//Lombok을 사용한 클래스
@Value
public class Car {
String name;
int power;
}
Lombok을 사용하면 매우 간단하게 위의 기본적인 Native Java로 만들어진 클래스와 동일하게 작동하지만 코드 양은 극단적으로 줄일 수 있습니다.
이것을 Java에서는 뭔가 꼭 필요한 기능이라고 생각했던 것 같습니다. 그래서 Native Java에서 지원하도록 추가된 거겠죠. 그럼에도 Java 15에서야 나온 걸 보면 Lombok을 사용하는데 불편함이 없었기 때문일 것 같습니다. 단 하나의 불편함 Lombok을 사용하려면 dependency 추가를 해줘야 한다는 점이 있었죠.
//record 사용
public record Car(String name, int power) {}
//record 객체 사용 방법
Car car = new Car("SuperCar", 500);
Car car2 = new Car("BigCar", 300);
Car car3 = new Car("SuperCar", 500);
System.out.println(car.name()); // SuperCar
System.out.println(car.power()); // 500
System.out.println(car.toString()); // Car[name=SuperCar, power=500]
System.out.println(car.equals(car2)); // false
System.out.println(car.equals(car3)); // true
Record는 위와같이 사용합니다. Dependecy도 추가할 필요없이 매우 간단히 사용할 수 있습니다. 그리고 형태를 보면 Kotlin의 Data 클래스와 매우 유사한 모습을 보여줍니다. 이렇게 보면 언젠간 Java가 Kotlin과 매우 유사해지고 그 이후엔 천천히 Java는 사라지고 Kotlin으로 모두 바뀌는 것이 순서일지도 모르겠습니다.
'기초 지식 > Java' 카테고리의 다른 글
[Java] this 키워드에 관해서 (0) | 2021.09.14 |
---|---|
[Java] HashMap에서 잠시 헷갈렸던 부분! (0) | 2021.09.09 |
JVM에 관하여 (0) | 2021.07.24 |
[Java] Checked Exception, Unchecked Exception (0) | 2021.05.18 |
[Java] String 선언 방식에 따른 차이 (0) | 2021.05.08 |