학교나 학원에서 Java를 배울 때 멤버변수는 private으로 선언하며 getter, setter 등으로 접근 가능하게 하라고 배운다.
이는 객체의 캡슐화를 위해 당연히 해야할 일이다.
캡슐화 (encapsulation)
객체의 속성과 메서드를 하나로 묶고, 외부에서 직접 접근하지 못하도록 제한한다.
setter 함수를 통해서만 데이터를 수정하도록 해서 유효성 방지를 통해 잘못된 데이터 수정을 방지하고,
내부 필드가 바뀌어도 getter/setter만 유지하면 외부 코드에는 영향이 없기에 유지보수와 확장성이 좋으며, 객체의 독립성이 유지된다.
또한 getter만 제공함으로써 읽기 전용으로 활용도 가능하다.
객체를 만들 때 getter, setter는 당연히 기재하고, 상황과 필요에 toString, equals, hashCode 등도 종종 기재를 한다. 만약 베이직 하게 생성하면 아래와 같은 코드가 도출될 것이다.
*생성자는 제외했다.
public class Student {
private String name;
private int age;
public void setName(String name) { this.name = name; }
public void setAge(int age) { this.age = age; }
public String getName() { return name; }
public int getAge() { return age; }
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Student student = (Student) obj;
return age == student.age && name.equals(student.name);
}
@Override
public int hashCode() {
return java.util.Objects.hash(name, age);
}
@Override
public String toString() {
return "Student{name='" + name + "', age=" + age + "}";
}
}
위 코드는 만약 롬복을 사용한다면 아래와 같이 간단하게 생성할 수 있다.
import lombok.Data;
@Data
public class Student {
private String name;
private int age;
}
그런데 위에 나온 설명 중 이 문구에 주목해보자.
객체중는 불변 객체가 존재한다. 즉, 최초 선언할 때 값을 입력해놓고, 입력한 값이 바뀌는 일 없이 사용되는 객체 말이다.
Record
오늘의 주제인 Record는 이러한 불변 객체를 선언할 때 사용되는 불변 데이터 클래스이다. record 사용 시 불변 객체를 간결하게 정의할 수 있다.
* JAVA 14에서 프리뷰로 도입되었으며, 16부터 정식으로 추가된 기능이다.
그런데 굳이 왜 써야할까? 그냥 생성자랑 getter, 그리고 toString이나 equals같은 것만 써서 사용하면 되는 것 아닐까?
결론적으로 맞긴 하다. 하지만 위에서 나열한 작업 자체가 반복적인 코드 (boilerplate code) 이다. 비록 간단한 코드일 지언정 어쨌든 코드는 코드이니 작성하다보면 실수가 발생할 수도 있고, 의도가 혼용될 가능성도 있다.
하지만 애초에 Record로 선언을 해버리면 반복적인 코드를 쓸 필요가 없어 실수가 없을 뿐더러 읽는 사람이 "아 이건 불변 객체구나" 하고 바로 이해도 되니 의도의 혼용이 사라진다.
대충 개념을 알았으니 이제 사용법을 알아보자.
그런데 사실 사용법을 설명할 것도 없다. 그냥 아래와 같이 옮기면 끝이다.
public record Student(String name, int age) {
}
보면 알다시피, 그냥 클래스 파일 옆에 선언되어야 할 멤버 변수들을 선언해주기만 하면된다.
그리고 생성자를 쓸 때처럼 나열된 변수 순서에 맞춰 객체를 생성해주기만 하면 된다.
Student student = new Student("LMW", 31);
그러면 아래와 같이 아무것도 선언하지 않았음에도 자동으로 여러 개의 메서드들이 생성되었음을 확인할 수 있다.
*불변이므로 setter 같은 변수를 수정하는 클래스는 생성되지 않는다.
그리고 일반 클래스와 마찬가지로 추가적인 함수를 설정할 수 있다.
다만 잊지 말아야 할 점은 record는 불변의 객체이다. 고로 자동으로 생성되는 변수들은 전부 final로 생성이 되고, 이로 인해 멤버 변수를 수정하는 함수를 만들어도 아래와 같이 정상적으로 동작하지 못한다.
'언어 > JAVA' 카테고리의 다른 글
Checked Exception과 Unchecked Exception (0) | 2024.05.08 |
---|---|
[JAVA] 코테용 함수들 (0) | 2023.07.08 |
1970년 01월 01일 00시 00분 00초 (0) | 2023.03.17 |
JDBC 사용법 (0) | 2022.07.25 |
리눅스 OS에 명령어 보내기 (0) | 2022.07.21 |