Java Academy · 강의

봉인된 타입 선언

타입을 확장할 수 있는 대상을 제한합니다

레슨 1/413개 단계

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

봉인 타입이란

봉인된 클래스 또는 인터페이스는 자신을 상속하거나 구현할 수 있는 다른 타입을 제한합니다. 이를 통해 컴파일러가 추론할 수 있는 닫힌 가능성 집합을 모델링할 수 있습니다.

해결하는 문제

일반적인 public 클래스는 누구나 어디서든 하위 클래스로 만들 수 있습니다. 때로는 예기치 않은 확장 없이 정확히 세 가지 도형이나 두 가지 결제 유형만 허용하고 싶을 수 있습니다. 봉인 기능을 사용하면 이러한 의도를 명시하고 강제할 수 있습니다.

봉인 키워드

타입을 sealed로 표시하고 permits를 사용하여 허용되는 하위 타입을 나열합니다. 허용된 각 하위 타입은 자체 상속 지정자를 선언해야 합니다.

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

    public static void main(String[] args) {
        Shape s = new Circle(2.0);
        System.out.println(s);
    }
}

하위 타입 지정자

허용된 각 하위 타입은 다음 중 하나여야 합니다. final은 더 이상의 하위 클래스 생성을 막고, sealed는 제한을 계속 적용하며, non-sealed는 다시 자유로운 확장을 허용합니다. 레코드는 암시적으로 final입니다.

final 하위 클래스

하위 클래스를 final로 표시하면 해당 가지에서 계층 구조가 닫힙니다.

public class Main {
    sealed interface Animal permits Dog, Cat {}
    static final class Dog implements Animal {
        public String toString() { return "Dog"; }
    }
    static final class Cat implements Animal {
        public String toString() { return "Cat"; }
    }

    public static void main(String[] args) {
        Animal a = new Dog();
        System.out.println(a);
    }
}

비봉인 하위 클래스

non-sealed 하위 타입은 의도적으로 확장을 다시 허용하므로, 알려지지 않은 클래스가 이를 다시 상속할 수 있습니다. 한 가지가 계속 열려 있어야 할 때만 신중하게 사용하십시오.

public class Main {
    sealed interface Plugin permits CorePlugin, ExternalPlugin {}
    static final class CorePlugin implements Plugin {}
    static non-sealed class ExternalPlugin implements Plugin {}
    static class ThirdParty extends ExternalPlugin {}

    public static void main(String[] args) {
        Plugin p = new ThirdParty();
        System.out.println(p.getClass().getSimpleName());
    }
}

클래스도 봉인할 수 있습니다

봉인 기능은 인터페이스에만 제한되지 않습니다. 추상 sealed class도 같은 방식으로 작동하며 공유 상태와 동작을 담을 수 있습니다.

public class Main {
    sealed static abstract class Expr permits Num, Add {}
    static final class Num extends Expr {
        final int value;
        Num(int value) { this.value = value; }
    }
    static final class Add extends Expr {
        final Expr left, right;
        Add(Expr left, Expr right) { this.left = left; this.right = right; }
    }

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

같은 모듈 또는 패키지

허용된 하위 타입은 봉인 타입과 같은 모듈에 있어야 하며, 코드가 모듈화되지 않았다면 같은 패키지에 있어야 합니다. 이렇게 하면 닫힌 집합을 한곳에 모아 검증할 수 있습니다.

컴파일러의 강제 적용

클래스가 permits에 나열되지 않은 상태로 봉인 타입을 상속하려고 하면 코드가 컴파일되지 않습니다. 닫힌 집합은 컴파일 시점에 보장됩니다.

중요한 이유

컴파일러는 모든 하위 타입을 알고 있으므로 봉인 타입을 대상으로 하는 switch가 모든 경우를 처리하는지 확인할 수 있습니다. 이것이 모든 경우를 처리하는 패턴 매칭의 기반이며, 이후 과정에서 다룹니다.

완전한 계층 구조

다음은 값을 모델링하는 데 사용하는 작은 닫힌 계층 구조입니다.

public class Main {
    sealed interface Json permits JsonNull, JsonNumber, JsonString {}
    record JsonNull() implements Json {}
    record JsonNumber(double value) implements Json {}
    record JsonString(String value) implements Json {}

    public static void main(String[] args) {
        Json[] values = { new JsonNull(), new JsonNumber(3.5), new JsonString("hi") };
        for (Json j : values) {
            System.out.println(j);
        }
    }
}

빠른 확인

봉인 선언에 대한 이해도를 테스트해 보십시오.

복습

봉인 타입을 선언하는 방법을 배웠습니다.

  • sealed는 타입을 상속하거나 구현할 수 있는 대상을 제한합니다.
  • permits 절은 허용된 하위 타입을 나열합니다.
  • 각 하위 타입은 final, sealed 또는 non-sealed여야 합니다.
  • 하위 타입은 같은 모듈 또는 패키지에 있으며, 컴파일러가 이를 강제합니다.
무료로 시작

AI 튜터와 함께 Java을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
104
레슨
374

자주 묻는 질문

“봉인된 타입 선언” 강의는 무료인가요?

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

“봉인된 타입 선언”에서 뭘 배우나요?

타입을 확장할 수 있는 대상을 제한합니다 브라우저에서 직접 실행하는 실습 코드로 Java Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

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

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

“봉인된 타입 선언” 강의는 얼마나 걸리나요?

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

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

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

이 강의의 모든 강의

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