자바 - SEALED 클래스와 인터페이스

안녕하세요, 미래의 자바 개발자 여러분! 오늘은 자바에서 SEALED 클래스와 인터페이스의 세계로 흥미진진한 여행을 떠날 거예요. 프로그래밍에 새로운 사람이라도 걱정 마세요 - 기본부터 시작해서 점점 더 복잡한 내용으로 이어질 거예요. 그럼, 커피 한 잔 (또는 좋아하는 음료)을 들고 같이 탐험해볼까요?

Java - Sealed Classes

SEALED 클래스와 인터페이스란?

자신의 트리하우스에 방을 추가할 수 있는 사람을 제어하려고 한다고 상상해보세요. 이는 자바에서 SEALED 클래스와 인터페이스가 하는 일과 비슷합니다 - 어떤 클래스가 자신을 확장하거나 구현할 수 있는지 제어할 수 있습니다. 이는 코드에 VIP 명단을 가지는 것과 같아요!

SEALED 클래스가 해결하는 문제

SEALED 클래스가 등장하기 전에는 누구나 자신의 클래스를 확장하거나 인터페이스를 구현할 수 있었습니다. 이는 파티를 열었는데 누가 올지 모를 때와 같았죠! SEALED 클래스는 이 게스트 명단을 제어할 수 있게 해줍니다.

SEALED 클래스 생성 방법

간단한 예제를 통해 시작해보겠습니다:

public sealed class Animal permits Dog, Cat, Bird {
// Animal 클래스 코드
}

이 예제에서, Animal은 우리의 SEALED 클래스입니다. permits 키워드는 바운서처럼 동작하여 Dog, Cat, Bird 클래스만 Animal을 확장할 수 있게 합니다.

SEALED 클래스 확장하기

이제 Animal 클래스를 확장하는 클래스를 생성해보겠습니다:

public final class Dog extends Animal {
// Dog 클래스 코드
}

public final class Cat extends Animal {
// Cat 클래스 코드
}

public non-sealed class Bird extends Animal {
// Bird 클래스 코드
}

finalnon-sealed 키워드는 중요합니다:

  • final: 이 클래스는 더 이상 확장될 수 없음을 의미합니다. "이 파티는 여기까지!"라고 말하는 것과 같습니다.
  • non-sealed: 이 클래스는 다른 어떤 클래스에도 확장될 수 있음을 의미합니다. "들어와, 더 많은 사람이 더 좋아!"라고 말하는 것과 같습니다.

SEALED 인터페이스

클래스와 마찬가지로 인터페이스도 SEALED 될 수 있습니다. 예제를 보겠습니다:

public sealed interface Vehicle permits Car, Motorcycle, Bicycle {
// Vehicle 인터페이스 코드
}

이 인터페이스를 구현하는 방법은 다음과 같습니다:

public final class Car implements Vehicle {
// Car 클래스 코드
}

public final class Motorcycle implements Vehicle {
// Motorcycle 클래스 코드
}

public non-sealed class Bicycle implements Vehicle {
// Bicycle 클래스 코드
}

SEALED 클래스와 인터페이스 사용 이유

  1. 타입 안전성: 자신의 SEALED 클래스나 인터페이스를 확장하거나 구현할 수 있는 클래스를 정확히 알 수 있습니다.
  2. 더 나은 설계: 더 구조화된 고의적인 클래스 계층 구조를 만들어주는 데 도움이 됩니다.
  3. 패턴 매칭: 스위치 표현식에서 패턴 매칭과 잘 작동합니다 (다른 날에 다룰 주제지만, 신뢰하셔요, 재미있어요!).

실제 예제

더 복잡한 예제를 만들어보겠습니다. 간단한 게임을 만들고, 다양한 유형의 캐릭터가 있는 것을 상상해보세요:

public sealed abstract class GameCharacter permits Warrior, Mage, Archer {
protected String name;
protected int health;

public GameCharacter(String name, int health) {
this.name = name;
this.health = health;
}

public abstract void attack();
}

public final class Warrior extends GameCharacter {
public Warrior(String name) {
super(name, 100);
}

@Override
public void attack() {
System.out.println(name + "는 강력한 검을 휘둘러!");
}
}

public final class Mage extends GameCharacter {
public Mage(String name) {
super(name, 75);
}

@Override
public void attack() {
System.out.println(name + "는 강력한 주문을 시전합니다!");
}
}

public non-sealed class Archer extends GameCharacter {
public Archer(String name) {
super(name, 80);
}

@Override
public void attack() {
System.out.println(name + "는 정확한 화살을 쏩니다!");
}
}

이 예제에서, 우리는 SEALED 추상 클래스 GameCharacter을 세 개의 허용된 서브클래스 Warrior, Mage, Archer와 함께 생성했습니다. 각 서브클래스는 자신만의 attack() 메서드 구현을 가지고 있습니다.

이 클래스들을 어떻게 사용할 수 있는지 보겠습니다:

public class Game {
public static void main(String[] args) {
GameCharacter[] characters = {
new Warrior("콘안"),
new Mage("간달프"),
new Archer("레고拉斯")
};

for (GameCharacter character : characters) {
character.attack();
}
}
}

이 코드를 실행하면 다음과 같은 결과를 볼 수 있습니다:

콘안은 강력한 검을 휘둘러!
간달프는 강력한 주문을 시전합니다!
레고拉斯는 정확한 화살을 쏩니다!

결론

SEALED 클래스와 인터페이스는 자바에서 더 kontrol된고 고의적인 클래스 계층 구조를 만들어주는 강력한 도구입니다. 이들은 코드의 바운서처럼, 오직 올바른 클래스만 파티에 참여할 수 있도록 해줍니다!

기억하세요, 프로그래밍은 문제를 해결하고 구조를 만드는 것입니다. SEALED 클래스와 인터페이스는 더 깨끗하고 유지보수하기 쉬운 코드를 작성하는 데 도움이 되는 도구 중 하나입니다.

연습하고, 코딩하고, 가장 중요한 것은 즐기세요! 알고보면 프로처럼 SEALED 클래스를 닫는 데에 걸릴 시간이 없을 거예요. 다음에 뵙겠습니다, 즐거운 코딩하세요!

메서드 설명
permits 어떤 클래스가 SEALED 클래스를 확장하거나 SEALED 인터페이스를 구현할 수 있는지 지정합니다
sealed 클래스나 인터페이스를 SEALED으로 선언합니다
non-sealed SEALED 클래스의 서브클래스가 어떤 클래스에도 확장될 수 있도록 합니다
final 클래스가 더 이상 확장될 수 없도록 합니다

Credits: Image by storyset