질문 배경:
코틀린은 자바의 장점과 JVM의 함수형 상속을 결합하였습니다. 일반 클래스는 표준 구조로 선언되며, 추상 클래스는 기본 구현이 있는 불완전한 템플릿을 생성할 수 있고, 인터페이스는 상태 없이 동작의 다중 상속을 지원합니다.
문제:
클래스, 추상 클래스 및 인터페이스 간의 올바른 선택은 애플리케이션의 아키텍처, 코드의 세분화 및 확장성을 결정합니다. 잘못된 상속은 테스트와 향후 수정의 복잡성을 초래합니다.
해결책:
코틀린에서는:
코드 예:
interface Drawable { fun draw() } abstract class Shape(var color: String) : Drawable { abstract fun calcArea(): Double override fun draw() = println("Shape drawn") } class Circle(color: String, val radius: Double) : Shape(color) { override fun calcArea() = Math.PI * radius * radius }
주요 특징:
인터페이스는 백킹 필드가 있는 속성을 포함할 수 있나요?
아니요, 속성의 서명만 정의할 수 있으며 데이터를 저장할 수 없습니다 — 백킹 필드 없는 속성만 허용됩니다.
여러 클래스로부터 상속받을 수 있나요?
아니요, 코틀린은 클래스의 단일 상속만 지원하지만 인터페이스의 다중 구현은 지원합니다.
인터페이스에 생성자를 선언할 수 있나요?
아니요, 인터페이스는 상태를 저장하지 않기 때문에 생성자를 지원하지 않습니다 — 오직 동작 계약만 존재합니다.
애플리케이션에서 모든 공통 기능을 추상 클래스에 넣었으나 내부 논리나 상태가 없는 경우, 단지 공통 계약이 필요했습니다.
장점:
단점:
필요한 계약만 인터페이스로 분리하고, 추상 클래스는 구현이 필요한 공통 속성과 메서드로 제한했습니다.
장점:
단점: