[lombok] @Data의 역할
@Data를 사용하는데 왜 사용하는지 알고싶어서 정리 한 글
@Data 를 사용하면 적용되는 lombok 어노 테이션 들
@Getter
@Setter
@ToString
@EqualsAndHashCode
@RequiredArgsConstructor
public class Person {
private String name;
private int age;
private String address;
}
import lombok.Data;
@Data
public class Person {
private String name;
private int age;
private String address;
}
@Data 적용 결과
public class Main {
public static void main(String[] args) {
Person person = new Person();
person.setName("John Doe");
person.setAge(30);
person.setAddress("123 Main St");
System.out.println(person.getName()); // Output: John Doe
System.out.println(person); // Output: Person(name=John Doe, age=30, address=123 Main St)
Person anotherPerson = new Person();
anotherPerson.setName("John Doe");
anotherPerson.setAge(30);
anotherPerson.setAddress("123 Main St");
System.out.println(person.equals(anotherPerson)); // Output: true
}
}
적용 되어지는 어노테이션 역할??
@RequiredArgsConstructor
클래스의 모든 final 및 @NonNull 필드에 대한 인수가 있는 생성자를 생성
개체 생성 시 초기화해야 하는 필드가 있을 때 유용
@RequiredArgsConstructor 적용 전
public class MyClass {
private final String field1;
private final int field2;
public MyClass(String field1, int field2) {
this.field1 = field1;
this.field2 = field2;
}
}
@RequiredArgsConstructor 적용 후
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
public class MyClass {
private final String field1;
private final int field2;
// RequiredArgsConstructor automatically generates the constructor
}
@AllArgsConstructor
이 주석은 최종이 아닌 필드를 포함하여 클래스의 모든 필드에 대한 인수가 있는 생성자를 생성
모든 필드를 한 번에 초기화하는 생성자를 원할 때 유용
@AllArgsConstructor 적용 전
public class MyClass {
private String field1;
private int field2;
public MyClass(String field1, int field2) {
this.field1 = field1;
this.field2 = field2;
}
}
@AllArgsConstructor 적용 후
import lombok.AllArgsConstructor;
@AllArgsConstructor
public class MyClass {
private String field1;
private int field2;
// AllArgsConstructor automatically generates the constructor
}
@NonNull
이 주석은 필드를 null이 아닌 것으로 표시하는 데 사용되며, 개체 생성 중에 null이 아닌 값을 제공해야 함
코드 가독성을 향상시키는 데 도움이 되며 사용되는 생성자 또는 메서드에서 null 검사를 생성합니다
@NonNull 적용 전
public class MyClass {
private String field1;
public MyClass(String field1) {
if (field1 == null) {
throw new IllegalArgumentException("Field1 cannot be null");
}
this.field1 = field1;
}
}
@NonNull 적용 후
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
public class MyClass {
@NonNull
private String field1;
// @NonNull generates null check and exception handling automatically
}
@NonNull 적용 전
@EqualsAndHashCode
주석이 없는 코드에서는 Person 클래스의 equals() 및 hashCode() 메서드를 수동으로 재정의
구현은 각 필드의 동등성을 개별적으로 확인하고 모든 필드를 기반으로 해시 코드를 생성합니다.
@EqualsAndHashCode 적용 전
public class Person {
private String name;
private int age;
private String address;
// Constructors, getters, setters, equals(), and hashCode() methods
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
Person other = (Person) obj;
if (age != other.age) {
return false;
}
if (name == null) {
if (other.name != null) {
return false;
}
} else if (!name.equals(other.name)) {
return false;
}
if (address == null) {
return other.address == null;
} else {
return address.equals(other.address);
}
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
result = 31 * result + (address != null ? address.hashCode() : 0);
return result;
}
}
@EqualsAndHashCode 적용 후
import lombok.EqualsAndHashCode;
@EqualsAndHashCode
public class Person {
private String name;
private int age;
private String address;
}
@EqualsAndHashCode 적용 결과
public class Main {
public static void main(String[] args) {
Person person1 = new Person();
person1.setName("John Doe");
person1.setAge(30);
person1.setAddress("123 Main St");
Person person2 = new Person();
person2.setName("John Doe");
person2.setAge(30);
person2.setAddress("123 Main St");
System.out.println(person1.equals(person2)); // Output: true
System.out.println(person1.hashCode()); // Output: 1829164700
System.out.println(person2.hashCode()); // Output: 1829164700
}
}
@EqualsAndHashCode 에서 특정 필드 제외하는법
@EqualsAndHashCode(exclude = {"address"})
public class Person {
// fields and methods
}
이 경우 address 필드는 생성된 equals() 및 hashCode() 메서드에서 제외됩니다.
참고