▶ 추상 메서드 : 구현되지 않은 메서드 ▶ 추상 클래스 : 추상 메서드를 가지고 있는 클래스
추상 클래스는 구현 되지 않은 추상 메서드를 가지고 있기 때문에 완벽한 설계도라고 할 수 없다.
추상클래스와 상속
추상 클래스는 완벽한 클래스가 아니기 때문에 객체를 생성할 수 없다. 객체를 생성하려면 추상 클래스를 상속받은 클래스를 만들고 추상 메서드를 구현하여 자식 클래스를 통해 객체를 생성해야 한다. 추상 클래스의 목적은 자식 클래스에서 메서드를 Overriding을 하게 하기 위한 강제성을 부여하기 위함이다.
fun main(){
// 추상 클래스의 객체 생성
// 추상 클래스는 완벽한 클래스가 아니기 때문에 객체를 생성하는 것이 불가능 하다.
// val t1 = TestClass1()
// 추상클래스를 상속받은 클래스의 객체를 생성한다
val sub1 = SubClass1()
sub1.testMethod1()
sub1.testMethod2()
sub1.testMethod3()
}
// 추상 클래스는 abstract 키워드를 붙혀줘야 한다.
// 추상 클래스는 상속이 가능해야 하기 때문에 open 키워드를 붙혀줘야 한다.
// 추상 클래스는 상속 밖에 방법이 없기 때문에 open은 생략해도 되게끔 제공된다
// (구 버전 코틀린에서는 반든시 붙여줘야 하는 경우도 있다)
abstract class TestClass1{
fun testMethod1(){
println("TestClass1의 testMethod1")
}
fun testMethod2(){
println("TestClass1의 testMethod2")
}
// 추상메서드
// 추상메서드는 추상메서드임을 알리기위해 abstract 라는 키워드를 붙여줘야 한다.
// 추상메서드는 overriding이 가능해야 하기 때문에 반드시 open을 붙여줘야 한다.
// 추상 메서드는 자식 클래스에서 오버라이딩을 해야지만 되기 때문에 open 키워드를 생략해도 되겠금 제공된다
// (구 버전 코틀린에서는 open 을 반드시 붙혀줘야 하는 경우도 있다)
abstract fun testMethod3()
}
// 추상클래스를 상속받은 클래스
class SubClass1: TestClass1(){
// 추상메서드 구현
override fun testMethod3() {
println("SubClass1에서 구현한 testMethod3")
}
}
출력결과
학습정리
▷구현되지 않은 메서드를 추상 메서드라고 부르며 추상 메서드를 가지고 있는 클래스를 추상 클래스라고 부른다. ▷추상 클래스는 자식 클래스에서 메서드를 Overriding 하게 하기 위함이다.