일반적으로 우리가 쓰는 클래스는 concrete 클래스로서
클래스 내에 있는 모든 메서드는 선언부와 구현부가 존재 한다.
따라서 하위 클래스가 상위 클래스를 상속하면 그러한 메서드들도 상속이 되고,
이를 그대로 사용하거나 오버라이딩을 하여 자신만의 메서드로 사용하기도 한다.
그런데 만약 상위 클래스가 무엇을 행하는 객체라기 보다, 여러 하위 클래스를 담는 포괄적인 클래스라
실행 메서드를 구현하기 애매하면 어떨까? 상위 클래스에 메서드를 선언하지 않으면,
업캐스팅을 해도 다형성을 확보하지 못해, 매번 다운캐스팅을 해주고 나서 그에 맞는 메서드를 호출해야한다.
이때 클래스의 선언부에 abstract 라는 예약어를 포함해주면!
이 클래스는 추상 클래스가 된다.
그러면 몇가지 성질을 띄게 되는데
1. 추상 클래스에는 추상 메서드를 선언 할 수 있다. 클래스 선언과 마찬가지로 메서드 선언부 앞에 똑같이
abstract를 사용해 주면 된다.
그러나 추상클래스라 해서 반드시 추상 메서드를 포함하고 있지는 않다.
반대로 하나라도 추상 메서드가 있으면 그 클래스는 추상 클래스이다.
2. 추상 메서드는 메서드의 선언부만 존재하고 { 구현부 } 가 존재하지 않는다.
이는 하위 클래스에게 구현의 의무를 떠넘긴다. 모든 추상 메서드를 구현 했을 때 비로소, 일반적인 concrete 클래스로 활용 가능하다.
구현한 추상메서드는 (구현된 하위 클래스 내에서는 abstract이 아닌 일반 메서드!) 앞서 말한 오버라이딩을 통해 코드를 간략화 할 수 있게 해준다.
3. 추상 클래스는 말그대로 아직 구체화 되지 못한 객체이므로, 그 자체로 new 생성자를 호출할 수 없다.
만일 이것이 가능하다면 추상 클래스로 생성한 객체에서 추상메서드를 불러올 수 있어야 하는데
추상 클래스 내에서는 아직 구현되지 않았기 때문이다.
따라서 추상메서드 구현의 의무를 완료한 하위 클래스 생성자 호출을 통해 업캐스팅 하여 생성할 수 있다.
그리고 3번 성질을 이용하여 1번에서 말했듯이, 어떠한 클래스가 프로그램내에서 객체로서 생성되기를
제한하고 싶을 때 의도적으로 abstract화 시켜주는 경우도 있다!
'CS 공부 > Java, Spring (재정리)' 카테고리의 다른 글
Spring - DI, IoC (0) | 2021.03.25 |
---|---|
java template 메서드 (0) | 2020.01.02 |
자바 항목에 있는 글들은 (0) | 2020.01.01 |
java 상속성 - 오버라이딩,캐스팅,다형성 (0) | 2020.01.01 |
java 상속성 (0) | 2020.01.01 |