0Pricing
Java Academy · 강의

레코드와 봉인

폐쇄형 계층 구조를 모델링합니다

레코드와 봉인은(는) CoddyKit의 무료 Java Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Java Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

봉인 타입과 레코드의 조합

봉인 인터페이스와 레코드는 완벽하게 어울립니다. 봉인 인터페이스는 닫힌 경우의 집합을 정의하고, 각 레코드는 하나의 구체적이고 변경 불가능한 경우가 됩니다. 함께 사용하면 대수적 데이터 타입을 모델링할 수 있습니다.

레코드는 암시적으로 final입니다

레코드는 자동으로 final이 되므로, 허용된 하위 타입은 final, sealed 또는 non-sealed여야 한다는 규칙을 충족합니다. 별도의 지정자가 필요하지 않습니다.

닫힌 도형 계층 구조

도형을 봉인 인터페이스를 구현하는 레코드로 모델링하고, 각 레코드가 자체 데이터를 갖도록 만들 수 있습니다.

public class Main {
    sealed interface Shape permits Circle, Rectangle {}
    record Circle(double radius) implements Shape {}
    record Rectangle(double width, double height) implements Shape {}

    public static void main(String[] args) {
        Shape s = new Rectangle(3, 4);
        System.out.println(s);
    }
}

동작 추가하기

봉인 인터페이스에 모든 레코드가 구현할 메서드를 선언하여 닫힌 집합 전체에 다형성을 적용할 수 있습니다.

public class Main {
    sealed interface Shape permits Circle, Rectangle {
        double area();
    }
    record Circle(double radius) implements Shape {
        public double area() { return Math.PI * radius * radius; }
    }
    record Rectangle(double width, double height) implements Shape {
        public double area() { return width * height; }
    }

    public static void main(String[] args) {
        Shape s = new Circle(2);
        System.out.printf("Area: %.2f%n", s.area());
    }
}

동등성과 toString 자동 제공

레코드는 equals, hashCode, toString을 자동으로 생성합니다. 동일한 구성 요소를 가진 두 레코드는 서로 같으므로 값을 모델링하는 데 적합합니다.

public class Main {
    sealed interface Shape permits Circle {}
    record Circle(double radius) implements Shape {}

    public static void main(String[] args) {
        Circle a = new Circle(5);
        Circle b = new Circle(5);
        System.out.println(a.equals(b));
        System.out.println(a);
    }
}

결과 모델링

일반적인 패턴은 성공 레코드와 실패 레코드를 포함하는 봉인된 결과 타입을 사용하는 것입니다. 이를 통해 예상 가능한 결과에 대해 널 반환이나 예외를 대신할 수 있습니다.

public class Main {
    sealed interface Result permits Ok, Err {}
    record Ok(int value) implements Result {}
    record Err(String message) implements Result {}

    static Result parse(String s) {
        try { return new Ok(Integer.parseInt(s)); }
        catch (NumberFormatException e) { return new Err("bad number: " + s); }
    }

    public static void main(String[] args) {
        System.out.println(parse("42"));
        System.out.println(parse("oops"));
    }
}

검증을 위한 간결한 생성자

레코드는 간결한 생성자에서 입력을 검증할 수 있으므로 각 경우가 생성될 때부터 올바른 상태를 유지하게 할 수 있습니다.

public class Main {
    sealed interface Shape permits Circle {}
    record Circle(double radius) implements Shape {
        Circle {
            if (radius < 0) throw new IllegalArgumentException("radius must be >= 0");
        }
    }

    public static void main(String[] args) {
        try { new Circle(-1); }
        catch (IllegalArgumentException e) { System.out.println(e.getMessage()); }
    }
}

재귀적 데이터 모델

레코드는 봉인 인터페이스를 참조할 수 있으므로 표현식 트리나 연결 리스트 같은 재귀적 구조를 만들 수 있습니다.

public class Main {
    sealed interface Expr permits Num, Add {}
    record Num(int value) implements Expr {}
    record Add(Expr left, Expr right) implements Expr {}

    public static void main(String[] args) {
        Expr e = new Add(new Num(1), new Add(new Num(2), new Num(3)));
        System.out.println(e);
    }
}

불변성의 장점

레코드는 얕은 수준에서 변경할 수 없으므로 레코드로 구성된 봉인 계층 구조는 추론하기 쉽고 안전하게 공유할 수 있으며 동시성에도 적합합니다. 레코드 자체를 방어적으로 복사할 필요가 없습니다.

전환문과 함께 사용하기

봉인 레코드는 패턴 일치 switch와 함께 사용할 때 특히 유용합니다. 각 경우에서 레코드의 구조를 분해할 수 있고, 컴파일러가 모든 경우를 처리했는지 확인합니다. 이 내용은 패턴 과정에서 다룹니다.

모델에 대한 계산

재귀적인 레코드 트리를 순회하는 메서드로 인터프리터를 작성할 수 있습니다.

public class Main {
    sealed interface Expr permits Num, Add {}
    record Num(int value) implements Expr {}
    record Add(Expr left, Expr right) implements Expr {}

    static int eval(Expr e) {
        if (e instanceof Num n) return n.value();
        Add a = (Add) e;
        return eval(a.left()) + eval(a.right());
    }

    public static void main(String[] args) {
        Expr e = new Add(new Num(4), new Add(new Num(5), new Num(6)));
        System.out.println(eval(e));
    }
}

빠른 확인

봉인 레코드에 대한 이해도를 테스트해 보십시오.

복습

봉인 타입을 레코드와 결합하는 방법을 배웠습니다.

  • 레코드는 암시적으로 final이므로 허용된 하위 타입으로 사용할 수 있습니다.
  • 봉인 인터페이스는 공유 메서드를 선언할 수 있습니다.
  • 레코드는 동등성, 해시 처리, toString을 자동으로 제공합니다.
  • 함께 사용하면 닫혀 있고 변경할 수 없으며 필요에 따라 재귀적인 데이터를 모델링할 수 있습니다.

자주 묻는 질문

“레코드와 봉인” 강의는 무료인가요?

네 — “레코드와 봉인” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Java Academy 강의 전체를 잠금 해제할 수 있습니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“레코드와 봉인”에서 뭘 배우나요?

폐쇄형 계층 구조를 모델링합니다 브라우저에서 직접 실행하는 실습 코드로 Java Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Java Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Java Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“레코드와 봉인” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Java Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Java Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 봉인된 타입 선언
  2. permits 절
  3. 레코드와 봉인
  4. 봉인된 타입의 완전한 switch
← Java Academy(으)로 돌아가기