기본적으로 Kotlin에서 모든 클래스, 메서드 및 속성은 final입니다. 즉, 명시적으로 open 수정자를 사용하지 않으면 상속하거나 재정의할 수 없습니다.
open 키워드는 클래스의 상속이나 메서드의 재정의를 허용합니다. 이것은 기본적으로 Java와의 근본적인 차이점입니다. Java에서는 클래스가 기본적으로 상속에 열려 있습니다.
예시:
open class Animal { open fun sayHello() { println("Hello from Animal!") } } class Dog : Animal() { override fun sayHello() { println("Woof!") } }
Animal 클래스에서 open을 제거하면 상속 시 컴파일 오류가 발생합니다.override가 필요합니다.interface 키워드를 통해 구현되며 open이 필요하지 않습니다.Kotlin에서 Java와 마찬가지로 모든 클래스를 상속할 수 있습니까?
답변: 아니요, open(또는 abstract)로 표시된 클래스만 상속할 수 있습니다. 일반 클래스는 final로 선언되어 상속할 수 없습니다. 이는 코드의 안전성과 예측 가능성을 높이기 위해 설계되었습니다.
잘못된 코드 예시:
class Animal class Dog : Animal() // 컴파일 오류: "Animal" is final
이야기
Android 플랫폼 프로젝트에서 한 신입 개발자가 사용자 정의 컴포넌트를 커스텀 View 클래스에서 상속하려다 open을 추가하는 것을 잊었습니다. 빌드가 실패했지만 원인은 명확하지 않았고, 기한이 연장되었습니다. 컴파일러 메시지를 주의 깊게 읽은 후에야 문제가 발견되었습니다.
이야기
SDK를 개발할 때 사양에서는 확장 가능한 기반 클래스를 요구했으나, open 없이 선언되었습니다. 고객에게 배포한 후에는 소스 코드를 수정하지 않고는 라이브러리를 확장할 수 없다는 것이 밝혀졌습니다. 업데이트를 출시해야 했습니다.
이야기
한 프로젝트에서 기존 Java 코드를 Kotlin으로 마이그레이션하는 과정에서 클래스가 기본적으로 닫혀 있다는 것을 잊어버렸습니다. 모킹(mocking)을 사용한 대부분의 유닛 테스트가 컴파일되지 않아 릴리스 과정이 지연되었습니다. open을 대규모로 추가한 후에야 문제가 해결되었습니다.