[Java] Records

Jerry·2021년 9월 7일
0

language & framework study

목록 보기
19/28
  • 값의 집합으로 이루어진 간단한 객체를 심플하게 개발하기위해 고안되었습니다.

  • immutable data를 다룰 class 구현에 최적화되어있습니다.

  • 웹서비스 구현에서 많이 사용되는 DTO 개념에 적용하면 유용합니다.

  • 생성자, accessors(getter), equals(), hashCode(), toString() 등 DTO 특성의 클래스를 개발할때 매번 개발자가 직접 구현해주어야 했던 반복적인 작업이 불필요하게 됩니다.

  • 또한, "이 클래스는 data carrier 용도이다"를 명시적으로 나타낼 수 있으므로 코드에 대한 이해를 돕고 해당 클래스의 목적에 맞지 않는 구현을 하지 않도록 방지합니다.

Record 클래스의 생성자

  • 암시적 생성자
public record BasicRecord(
    int id,
    String name,
    int age
){}
  • 명시적 생성자
public record BasicRecord(
    int id,
    String name,
    int age
){
    // type1
    public BasicRecord(int id, String name, int age){
      	if(age<10){
            throw new IllegalArgumentException("age는 10 이상이어야 합니다.");
        }
        this.id=id;
        this.name=name;
        this.age=age;
    }
  
  	// type2
      public BasicRecord{ // 생성자에 parameter 생략 가능
        if(age<50){
            throw new IllegalArgumentException("age는 50 이상이어야 합니다.");
        }
        name="kim"; 
    }
}

Record 클래스 특징

  • final 클래스이므로 다른 클래스가 상속할 수 없습니다.

  • 다른 클래스를 상속할 수도 없습니다.

  • 자동생성 accessor 함수는 인스턴스 멤버 변수의 이름과 동일합니다.

  • Record 클래스의 접근제어자는 public, package-private 만 가능합니다.

  • Record 생성자의 접근제어자는 클래스의 접근제어자보다 제한된 수준이어서는 안됩니다.

    • (컴파일 오류 예시) default 접근제어자인 package-private은 public 보다 제한된 수준이므로 불가
  public record BasicRecord(...){
     BasicRecord(...){ // -> package-private
       
     }
  }
  • (컴파일 성공 예시)
  record BasicRecord(...){
     public BasicRecord(...){
       
     }
  }
public record BasicRecord(...){
   public BasicRecord(...){
     
   }
}

예제 테스트 1#

// BasicRecord.java
public record BasicRecord(
    int id,
    String name,
    int age
){

    public BasicRecord{ // 생성자에 parameter 생략 가능
        if(age<50){
            throw new IllegalArgumentException("age는 50 이상이어야 합니다.");
        }
        age=10; // 인스턴스 변수에 할당됨.
    }
}

// RecordTest.java
public final class RecordTest {

    public static void main(String[] args){
        BasicRecord basicRecord1 = new BasicRecord(1,"jerry",51);
        System.out.println(basicRecord1);
        BasicRecord basicRecord2 = new BasicRecord(2,"kim",30);
        System.out.println(basicRecord2);
    }
}

[output]

BasicRecord[id=1, name=jerry, age=10]
Exception in thread "main" java.lang.IllegalArgumentException: age는 50 이상이어야 합니다.

..

Process finished with exit code 1

예제 테스트 2#

// BasicRecord.java
public record BasicRecord(
    int id,
    String name,
    int age
){

    public BasicRecord{ // 생성자에 parameter 생략 가능
        if(age<10){
            throw new IllegalArgumentException("age는 10 이상이어야 합니다.");
        }
    }
}

// RecordTest.java
public final class RecordTest {

    public static void main(String[] args){
        BasicRecord basicRecord2 = new BasicRecord(2,"kim",30);
        System.out.println(basicRecord2);
        BasicRecord basicRecord3 =new BasicRecord(2,"kim",30);

        System.out.println("name is "+ basicRecord2.name());
        System.out.println("hashcode test : "+ basicRecord2.hashCode());
        System.out.println("equals test :"+ basicRecord2.equals(basicRecord3));
    }
}

[output]

BasicRecord[id=2, name=kim, age=30]
name is kim
hashcode test : 3293873
equals test :true

Records - JDK Release
  • JDK 14 : Preview feature
  • JDK 15 : (Second) Preview feature
  • JDK 16 : 정식 Release

[참고]

profile
제리하이웨이

0개의 댓글