[Kotlin] Interface와 abstract의 특징과 차이점
인터페이스(Interface)와 추상 클래스(Abstract Class)는 둘 다 추상화를 통해 다형성을 지원하는데 사용된다.
차이점을 알기전에 먼저 각각의 특징에 대해서 알아보자.
1) 인터페이스 (Interface)
// 인터페이스 선언
interface Drawable {
// 추상 메서드 선언
fun draw()
// 기본 구현이 있는 메서드
fun resize() {
println("크기를 조절합니다.")
}
}
// 인터페이스를 구현한 클래스
class Circle : Drawable {
// 인터페이스의 추상 메서드를 오버라이드
override fun draw() {
println("원을 그립니다.")
}
}
// 인터페이스를 구현한 클래스
class Rectangle : Drawable {
// 인터페이스의 추상 메서드를 오버라이드
override fun draw() {
println("사각형을 그립니다.")
}
}
- 인터페이스는
interface
키워드를 사용하여 선언되며, 추상 메서드를 가질 수 있다. - 인터페이스는 다른 클래스들 간에 공통적인 동작을 정의하는데 사용되고
- 클래스는 여러개의 인터페이스를 구현할 수 있다.
- 인터페이스는 멤버 변수를 가질 수 없고, 오직 추상 메서드, 디폴트 메서드, 정적 메서드, 추상 프로퍼티, 상수 등을 선언할 수 있다.
MainActivity(){
repository = MyRepositoryImpl()
}
interface MyRepository(){
fun getdata(String : name) : String
fun removedata(String : name) : String
fun updatedata(String : name) : String
}
class MyRepositoryImpl : MyRepository(){
override fun getdata(String : name) : String{
... // 데이터를 진짜로 가져오는 로직부분
return data
}
override fun removedata(String : name) : String{
... // 데이터를 진짜로 가져오는 로직부분
return data
}
override fun updatedata(String : name) : String{
... // 데이터를 진짜로 가져오는 로직부분
return data
}
}
2) 추상 클래스 (Abstract Class)
// 추상 클래스 선언
abstract class Shape {
// 추상 메서드 선언
abstract fun draw()
// 일반 메서드
fun resize() {
println("크기를 조절합니다.")
}
}
// 추상 클래스를 상속받은 구체 클래스
class Circle : Shape() {
// 추상 메서드를 오버라이드
override fun draw() {
println("원을 그립니다.")
}
}
// 추상 클래스를 상속받은 구체 클래스
class Rectangle : Shape() {
// 추상 메서드를 오버라이드
override fun draw() {
println("사각형을 그립니다.")
}
}
- 추상 클래스는
abstract
키워드를 사용하여 선언되며, 추상 메서드를 가질 수 있다. - 하나 이상의 추상 메서드를 포함하는 클래스이다. 추상 메서드는 선언만 있고, 구현 내용은 없다.
- 추상 메서드는 하위 클래스에서 반드시 구현되어야 한다.
- 한 클래스는 추상 클래스를 상속받으면서 동시에 다른 클래스를 상속받을 수 없다.
- 일반 메서드도 가질 수 있다.
- 인스턴스 생성이 불가능하며, 하위 클래스를 통해 인스턴스화됩니다.
abstract class 탈것
class 자동차 extends 탈것
3) Interface와 abstract class의 차이점
추상 클래스와 인터페이스의 차이점은 그 목적이라고 할 수 있습니다.
추상 클래스는 기본적으로 클래스 이며 이를 상속, 확장하여 사용하기 위한 것입니다.
인터페이스는 해당 인터페이스를 구현한 객체들에 대한 동일한 사용방법과 동작을 보장하기 위해 사용합니다.
구현 내용의 존재 여부: 인터페이스는 메서드의 선언만 있으므로 구현 내용이 없습니다. (Java에서는 그랬지만 Kotlin에서는 구현부를 가지고 있어도 가능함) 추상 클래스는 추상 메서드 뿐만 아니라 일반 메서드의 구현 내용도 가질 수 있습니다.
다중 상속: 인터페이스는 다중 상속을 지원합니다. 클래스에서 여러 개의 인터페이스를 구현할 수 있습니다. 추상 클래스는 다른 클래스를 상속받을 때 다중 상속이 불가능합니다.
생성자의 존재 여부: 인터페이스는 생성자를 가질 수 없습니다. 추상 클래스는 생성자를 가질 수 있습니다.
인스턴스화: 인터페이스는 직접 객체를 생성할 수 없으며, 클래스에서 인터페이스를 구현하여 사용합니다. 추상 클래스도 직접 객체를 생성할 수 없으며, 상속을 통해 하위 클래스에서 구체화되어야 합니다.