! 프로젝트 진행하면서 코드를 좀더 간결하게 짜고 싶은 마음에 다시 코틀린 공부를 시작하고 있다.(미리미리좀 해놓을걸...) 앱잼도 끝났고 릴리즈 및 버전 업에도 쓰일만한 것들을 위주로 공부하고 있는데 그 중 하나가 Sealed Class이다.
값이 제한된 집합의 유형 중 하나를 가질 수 있지만 다른 유형을 가질 수 없는 제한된 클래스 계층 구조를 나타내는데 사용하는 클래스이다.
클래스를 상속받는 하위 클래스들이 여러 파일에 있을 경우 컴파일러가 클래스에 대해 얼마나 많은 하위 클래스들이 있는지 알지 못한다.
하지만 Sealed Class의 경우 동일한 파일에서 선언해야 하기 때문에
"이 파일에서 쓰인게 아닌 다른 파일에서 쓰이는 하위 클래스는 없어!!"라는 것을 컴파일러에게 알려줄 수 있다.
예를 들면, Shape라는 상위 클래스를 만들고, 같은 파일에 이 클래스를 상속하는 Rectangle, Circle의 클래스를 만들었다고 생각해보면,
Sealed Class는 이 두가지의 클래스 외에 상속을 받는 하위 클래스가 없다는 것을 컴파일러에게 알려주는 것이다!
그럼 이것이 왜 중요하냐?!! 바로 when 문 사용시 else부분이 필요가 없다.
추상 클래스로 작성한 코드에 경우 맨 밑에 else를 반드시 넣어줘야 한다. 넣어주지 않을 경우
다음과 같이 오류가 발생한다. 즉 컴파일러가 Shape를 상속 받는 하위 클래스들을 정확하게 모르기 때문이다.
하지만 이를 Sealed Class로 변환하면 컴파일러가 하위 클래스들을 정확하게 알 수 있기 때문에 else를 쓰지 않아도 되고,
빠진 부분에 대해서도 체크가 가능하다.
Sealed class 키워드를 사용
하위 클래스가 상속 받도록 한다.
위의 사진과 같이 정의가 가능하고
중첩 클래스로 적용이 가능하다.
class, data class, object class로도 정의가 가능하다!
enum class의 이점과 동일하지만, enum class의 경우에는 1개의 객체만 생성 가능하고 복수의 객체를 생성하는 것이 불가능하다.
하지만 sealed class의 경우 복수의 객체를 생성하는 것이 가능하다!
참고 : codechacha