추상 클래스(abstract class)
미완성 설계도로 완성된 제품을 만들 수 없듯이 추상클래스로 인스턴스는 생성할 수 없다.
추상 클래스는 상속을 통해서 자손클래스에 의해서만 완성될 수 있다.
추상 클래스는 새로운 클래스를 작성하는데 있어서 바탕이 되는 조상클래스로서의 중요한 의미를 갖는다
abstract class 클래스이름 {
// ...
}
키워드 'abstract'를 붙이기만 하면 된다
추상 클래스에도 생성자가 있으며, 멤버변수와 메서드를 가질 수 있다
추상메서드(abstract method)
선언부만 작성하고 구현부는 작성하지 않은 채로 남겨 둔 메서드. 미완성 메서드임
- 미완성으로 남겨둔 이유는?
- 메서드의 내용이 상속받는 클래스에 따라 달라질 수 있기 때문에 조상 클래스에서는 선언부만을 작성하고, 주석을 덧붙여 어떤 기능을 수행할 목적으로 작성되었는지 알려주고, 실제 내용은 상속받는 클래스에서 구현하도록 비워 두는 것
/* 주석 */
abstract 리턴타입 메서드이름();
추상 메서드 역시 키워드 'abstract'를 앞에 붙여주고, 괄호{} 대신 문장의 끝을 알리는 ';'를 적어준다
자손 클래스는 오버라이딩을 통해 조상인 추상클래스의 추상메서드를 모두 구현해주어야 한다.
- 상속받은 추상메서드 중 하나라도 구현하지 않는다면, 자손 클래스 역시 추상클래스로 지정해 주어야 한다
구현부가 없는 메서드가 갖는 의미
메서드를 작성할 때 실제 작업내용인 구현부보다 더 중요한 부분이 선언부이다.
사용하는 쪽에서 구현을 알 필요가 없고, 선언부만 알고 있으면 되기 때문
인터페이스를 생각해보면 된다
추상클래스의 작성
여러 클래스에 공통적으로 사용될 수 있는 클래스를 바로 작성하기도 하고
기존의 클래스의 공통적인 부분을 뽑아서 추상클래스로 만들어 상속하도록 하는 경우도 있다
- 상속이 자손 클래스를 만드는데 조상 클래스를 사용하는 것이라면, 이와 반대로 추상화는 기존의 클래스의 공통부분을 뽑아내서 조상 클래스를 만드는 것이라고 할 수 있다
추상메서드로 선언하는 이유
추상메서드로 선언하는 것이나 그냥 빈 몸통을 가진 메서드로 만들어 놓는 것이나 별 차이가 없어 보인다고요?
abstract를 붙여서 추상메서드로 선언하는 이유는 자손 클래스에서 추상 메서드를 반드시 구현하도록 강요하기 위해서이다
만약 추성메서드로 정의되어 있지 않고 빈 몸통만 가지도록 정의되어 있다면, 상속받는 자손 클래스에서는 이 메서드들이 온전히 구현된 것으로 인식하고 오버라이딩을 통해 자신의 클래스에 맞도록 구현하지 않을 수도 있기 때문이다
공통 부분 뽑아내기
서로 다른 종류의 인스턴스를 하나의 묶음으로 다룸으로써 조상 클래스타입의 배열에 자손 클래스의 인스턴스를 담을 수 있게 된다
- 이렇게 되면 여러 타입의 인스턴스의 공통적인 부분을 다루기 편해진다 (ex. for문 내에서 사용)
Object 클래스 타입의 배열로도 서로 다른 종류의 인스턴스를 하나의 묶음으로 다룰 수 있지만, Object 클래스에는 공통 메서드가 정의되어 있지 않기 때문에 에러가 발생한다
참조) Java의 정석 3rd edition(남궁성, 도우출판)
'Programming Language > Java' 카테고리의 다른 글
[Java] 08. OOP - 다형성(polymorphism) (0) | 2024.06.24 |
---|---|
[Java] 07. OOP - 상속과 접근제어자 (0) | 2024.03.12 |
[Java] 06. OOP - 클래스와 객체 (0) | 2024.03.12 |
[Java] 05. 배열 (0) | 2024.03.12 |
[Java] 04. 변수 (0) | 2024.03.12 |