19. 추상 클래스
추상클래스(Abstract Class)
추상클래스란 아직 구현되지 않고 선언만 된 추상메서드를 가지고 있는 클래스이다.
추상클래스는 메서드가 구현되지 않았기 때문에 이 클래스를 직접 객체로 만들 수는 없고 무조건 상속을 받는 자식클래스 (SubClass) 가 있어야 한다. 추상클래스는 상속을 통해 생성될 자식클래스에서 메서드 오버라이딩에 강제성을 부여하기 위해 사용된다.
abstract class 클래스명()
============================================================================
아래 예제를 보자.
Mammal이라는 추상 클래스를 만들었다.
추상 클래스에 들어가는 프로퍼티와 메소드는 반드시 자식 클래스에서 상속을 받아야한다.
참고로 추상 클래스에 있는 추상 메소드에는 함수 Body가 없이 Head만 짤 수 있다.
다음은 Mammal 클래스를 받은 자식 Human 클래스에 생성자를 보면
override var maxSpeed: Double
을 통해 추상 클래스의 프로퍼티를 가져온 것을 알 수 있다.
이렇게 run(), breath() 추상 메소드도 override를 통해 불러온다.
또 다른 예시, Elephant도 같은 방식으로 만든다.
이제 메인 함수에서 실행시켜보자.
각각 맞는 파라미터 값을 넣어준 후 human과 elephant 클래스에 있는 함수를 불러오니 정상적으로 작동한다.
============================================================================
자 여기서 만약 상속받은 클래스가 아닌 추상 클래스 Mammal의 객체를 생성한다면 어떻게 될까?
Cannot create an instance of an abstract class
추상 클래스의 인스턴스를 만들 수 없습니다. 라고 에러 코드가 뜨게 된다.
즉, 추상 클래스는 자체에 대한 인스턴스는 만들 수 없지만 추상 클래스를 상속받은 클래스에서는 만들 수 있다.
============================================================================
인터페이스와의 차이점
1. 인터페이스는 여러개를 구현할 수 있지만 추상 클래스는 하나만 구현할 수 있다.
2. 인터페이스는 생성자가 존재하지 않지만, 추상 클래스는 클래스이기 때문에 생성자가 존재한다.
3. 인터페이스는 필드를 저장하지 못한다. 추상 클래스는 인터페이스가 추가할 수 있는 건 모두 할 수 있고, 필드와 생성자도 추가할 수 있다.