Step09_AbstractClass(추상클래스, 추상메소드)
추상(abstract) 클래스
클래스를 만들어서 우리에게 사용하도록 제공해주는 개발자가(유틸리티나 프레임워크를 공급해주는) 있다고 가정하자. 그 개발자는 특정 메소드를 우리의 상황에 맞게 구현하도록 미완성인 메소드를 제공할때도 있다. 미완성된 메소드를 추상(abstract) 메소드라고 하며 추상 메소드를 하나 이상 가지고 있는 클래스를 추상(abstract) 클래스라고 한다. 추상 메소드와 추상 클래스를 만들기 위해서는 abstract 예약어가 필요하다.
추상(abstract) 클래스 특징
- class 예약어 앞에 abstract 를 명시해서 클래스를 정의한다.
- 형태만 정의되고 실제 구현은 되지 않은 메소드가 존재할 수 있다.
- 형태만 정의된 메소드를 만들때는 abstract 예약어를 붙어서 메소드를 정의한다.
- 생성자는 존재하지만 단독으로 객체 생성은 불가하다
- 추상클래스 Type 의 id 가 필요하다면 추상클래스를 상속받은
- 자식클래스를 정의해서 객체 생성한다.
- 추상클래스를 상속받은 자식클래스는 부모의 추상메소드를
- 모두 오버라이드(재정의) 해야한다.
추상(abstract) 클래스 만들기
추상클래스이지만 data type역할은 할 수 있다.다만 객체 생성이 안된다.
예컨데 예시에서의 weapon class가 객체생성이 된다면 attack abstract 메소드는 미완성 ({}가 없음) 이라서 실행 불가능 하기 때문에 객체 생성이 될 수 없다.
추상(abstract) 클래스 사용하기
하지만 추상(abstract) 클래스를 사용하는 방법이 있다. 추상 클래스를 상속받고 자식클래스에서 추상 메소드를 override(재정의)하는 것이다.
부모 클래스가 추상클래스라면 자식클래스도 추상클래스가 강제된다. 다만 이때 추상 메소드를 override 할때는 예외이다.
Add unimplemented methods
추상 메소드 override하기
Make type 'MyWeapon' abstract
자식 클래스도 추상클래스로 만들기
필자는 해당 클래스를 사용하기 위해서 Add unimplemented methods를 선택했다.
Weapon을 객체생성할때는 추상클래스이기 때문에 오류가 뜨지만 MyWeapon클래스로 객체를 생성해서 실행하니 잘 작동한다.
w1.attack()
여기서 w1은 type이 Weapon type이지만 MyWeapon에서 override 했기 때문에 override 된 attack 메소드가 호출된다.