톡방에서 이야기를 나누다가 record 클래스가 최신 자바 버전에 도입되었다는 것을 알게 되었습니다. 이것을 써 보려고 jdk 17을 깔고, intellij 버전을 2021.x 버전까지 올리게 되었습니다. 제가 설치했던 버전에서는 language level 선택에 17이 없었거든요. 하튼, 간단하게만 써 보고, 코딩 테스트를 푸실 때 어떻게 쓰시면 좋을지 정도만 보도록 하겠습니다.

 


 먼저, record data는 요래 정의했습니다. 그냥 int형 x, int형 y로 이루어진 레코드 (직역하면 구조체) 정도라고 생각하면 좋겠네요.

 

 

 그러면 이 친구들은 어떤 특성을 가질까요? 먼저, 필드들이 final field로 구성되어 있어요. 그렇다는 이야기는 한 번 값이 정해지면 바뀌지 않는 immutable한 특성을 가진다는 의미입니다. 물론, field가 ref type이고 해당 레퍼런스가 가리키는 객체의 상태가 바뀐다면 이야기는 달라지겠지만요.

 

 

 다음에 어딜 봐도 setter를 찾아볼 수 없음을 알 수 있어요. 코딩 테스트에서는 immutable한 객체를, 예를 들자면 변하지 않는 모델의 특성을 가지는 객체를 만들 때 유용하게 쓰일 수 있습니다. 예를 들어서, 이 문제나 이 문제에서 카드의 속성은 변하지 않습니다. 중간에 막 갑자기 카드에 적혀져 있는 문자열이 바뀔 일이 전혀 없어요. 따라서, 이런 얘들은 record로 선언해 주면 깔끔하게 코딩할 수 있을 거에요.

 

 


 예제 몇 개를 보겠습니다.

 

 record data를 선언해 주었습니다. 5번째 줄에서 d.toString()을 호출합니다. 이 때, 모든 필드들을 돌면서 해당 필드들에 대한 정보를 출력하게 됩니다. 다음에 hashCode도 마찬가지입니다. 모든 필드들을 돌면서 적절하게 가공 처리를 한 hashCode 값을 뽑아냅니다.

 

 equals도 마찬가지입니다. 2개의 필드인 x, y값을 비교해서 둘이 같으므로 true를 돌려주게 됩니다.

 

 

 결과를 보면 요래 나옵니다.

 

 

 이제 다른 예제를 생각해 봅시다. 필드 x와 y에는 음수가 들어가면 안 됩니다. 즉, 0보다 작은 수가 들어 있으면 안 됩니다. 생성 단계나 초기화 단계에서 이를 걸러줄 법한 예외는 IllegalArgumentException가 있는데요. 부적절한 인수가 들어온 경우에 이를 처리해 주고 싶어요. 어떻게 하면 좋을까요?

 

 이 답변을 보면 어떻게 해야 할지 대강 유추할 수 있는데요.

 

 

 3번째 줄과 4번째 줄을 보시면 x가 0보다 작을 때와 y가 0보다 작을 때 예외를 던져주는 것을 볼 수 있어요.

 

 

 디버그를 돌려 보면, Object가 initialized가 되고 있는 상황에서,  x가 -2이고 y가 3인 정보가 들어옵니다.

 

 

그런데 x가 0보다 작으므로 예외가 throw 됩니다.

 

 


 필드에는 어떻게 접근하면 될까요? 필드 x와 y가 있었는데요.

 

 

 간단합니다. 필드 x에 접근하기 위해서 d.x(), y에 접근하기 위해서 d.y()를 쓰면 됩니다.

 

 

 1과 3이 잘 출력되었음을 알 수 있습니다.