Record

1. Record λž€?

Record λŠ” λ‹¨μˆœνžˆ 데이터λ₯Ό λ‹΄κΈ° μœ„ν•œ 클래슀λ₯Ό κ°„λ‹¨νžˆ μ •μ˜ν•  수 μžˆλ„λ‘ λ„μž…λœ μƒˆλ‘œμš΄ ꡬ쑰

기쑴의 λ³΄μΌλŸ¬ν”Œλ ˆμ΄νŠΈ μ½”λ“œ(μƒμ„±μž, getter, equals, hashCode, toString λ“±) λ₯Ό μžλ™μœΌλ‘œ 생성해 μ£ΌλŠ” 데이터 쀑심 ν΄λž˜μŠ€μž„.


2. Record 의 νŠΉμ§•

1. κ°„κ²°μ„±

  • 데이터λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ μƒμ„±μž, getter, equals, hashCode, toString λ©”μ„œλ“œκ°€ μžλ™μœΌλ‘œ 생성됨.

  • 기쑴의 Java Bean μŠ€νƒ€μΌκ³Ό 달리 λ³΄μΌλŸ¬ν”Œλ ˆμ΄νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•  ν•„μš”κ°€ μ—†μŒ.

2. λΆˆλ³€μ„±

  • Record 클래슀의 ν•„λ“œλŠ” 기본적으둜 final 둜 선언됨.

  • setter λ©”μ„œλ“œκ°€ μ—†μœΌλ©°, κ°’ 변경이 λΆˆκ°€λŠ₯함.

3. λͺ©μ 

  • 주둜 데이터λ₯Ό μ „λ‹¬ν•˜κ±°λ‚˜ μ €μž₯νž‰ μœ„ν•œ μš©λ„λ‘œ μ„€κ³„λ˜μ—ˆμŒ.

  • λ³΅μž‘ν•œ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ ν¬ν•¨ν•˜κΈ°μ—” μ ν•©ν•˜μ§€ μ•ŠμŒ.

4. 클래슀 상속 λΆˆκ°€

  • Record λŠ” μ•”λ¬΅μ μœΌλ‘œ final 둜 μ„ μ–Έλ˜λ―€λ‘œ 상속할 수 μ—†μŒ.


3. Record μ‚¬μš©λ²•

기본 ꡬ쑰

Record 클래슀λ₯Ό μ •μ˜ν•˜λ €λ©΄ record ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•¨.

public record Person(String name, int age){}

2. Record μΈμŠ€ν„΄μŠ€ 생성

Person person = new Person("Alice", 25);
System.out.println(person.name()); // Alice
System.out.println(person.age()); // 25

3. μžλ™ 생성 λ©”μ„œλ“œ

  • Getter : ν•„λ“œλͺ…을 λ©”μ„œλ“œλ‘œ μ‚¬μš©ν•΄ 값을 λ°˜ν™˜

  • toString(): ν•„λ“œ 이름과 값을 ν¬ν•¨ν•œ λ¬Έμžμ—΄ 생성

  • equals(): 두 객체가 λ™μΌν•œ 값을 κ°€μ§€λ©΄ true

  • hashCode(): 객체λ₯Ό κ³ μœ ν•˜κ²Œ μ‹λ³„ν•˜λŠ” ν•΄μ‹œμ½”λ“œ

Person person1 = new Person("Alice", 25);
Person person2 = new Person("Alice", 25);

System.out.println(person1); // Person[name=Alice, age=25]
System.out.println(person1.equals(person2)); // true
System.out.println(person1.hashCode()); // λ™μΌν•œ ν•΄μ‹œμ½”λ“œ λ°˜ν™˜

4. Record 의 μΆ”κ°€ κΈ°λŠ₯

1. μ»€μŠ€ν…€ λ©”μ„œλ“œ

Record 에도 μ»€μŠ€ν…€ λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•  수 있음.

public record Person(String name, int age){
    public String greeting() {
        return "Hello, my name is " + name + " and I am " + age + " years old.";
    }
}
Person person = new Person("Alice", 25);
System.out.println(person.greeting()); // Hello, my name is Alice and I am 25 years old.

2. μƒμ„±μž μ˜€λ²„λΌμ΄λ”©

  • Record λŠ” μ••μΆ•λœ Canonical Constructor λ₯Ό μžλ™μœΌλ‘œ 생성함.

  • μƒμ„±μžλ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ •μ˜ν•˜κ±°λ‚˜, μž…λ ₯값을 검증할 수 있음.

public record Person(String name, int age){
    public Person{
        if(age < 0) {
            throw new IllegalArgumentException("Age must be non-negative");
        }
    }
}

5. Record 의 μ œμ•½ 사항

1. 상속 λΆˆκ°€

  • Record λŠ” μ•”λ¬΅μ μœΌλ‘œ final 둜 μ„ μ–Έλ˜λ―€λ‘œ 상속할 수 μ—†μŒ.

  • λŒ€μ‹  μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•  수 있음.

public record Person(String name, int age) implements Comparable<Person> {
    @Override
    public int compareTo(Person other){
        return this.name.comapreTo(other.name);
    }
}

2. κ°€λ³€ ν•„λ“œ μ‚¬μš© λΆˆκ°€

  • ν•„λ“œλŠ” λ°˜λ“œμ‹œ final 이어야 ν•˜λ©°, κ°€λ³€ 데이터λ₯Ό 포함할 수 μ—†μŒ.

  • λ°°μ—΄ 같은 경우, ν•„λ“œκ°€ final μ΄μ§€λ§Œ λ‚΄λΆ€ 값은 λ³€κ²½ κ°€λŠ₯함.

public record DataHolder(int[] data){}

DataHolder holder = new DataHolder(new int[]{1,2,3});
holder.data()[0] = 42; // λ‚΄λΆ€ 데이터 λ³€κ²½ κ°€λŠ₯

3. λ³΅μž‘ν•œ 둜직 포함 λΆˆκ°€

  • Record λŠ” κ°„λ‹¨ν•œ 데이터 μ €μž₯μš©λ„λ‘œ μ„€κ³„λ˜μ—ˆμœΌλ―€λ‘œ λ³΅μž‘ν•œ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ—λŠ” μ ν•©ν•˜μ§€ μ•ŠμŒ.

Last updated

Was this helpful?