추상 클래스란
객체를 직접 생성할 수 있는 클래스를 실체 클래스라고 한다.
이 실체 클래스들의 공통적인 특성을 추출해서 선언한 클래스를 추상 클래스하고 한다.
추상 클래스와 실체 클래스는 상속의 관계를 가지고 있다.
추상 클래스가 부모, 실체 클래스가 자식으로 구현되어 실체 클래스는 추상 클래스(부모)의 모든 특성을 물려받고
추가적인 특성을 가질 수 있다.
(여기서 특성이란 필드와 메소드들을 말한다.)
예를 들면 실체 클래스에는 Bird.class, Dog.class, Cat.class 와 같은 것들이 선언되어 있다면,
이 실체 클래스들의 공통되는 필드와 메소드를 따로 선언한 Animal.class 추상 클래스를 선언할 수 있다.
추상 클래스의 용도
- 공통된 필드와 메소드의 이름을 통일할 목적
실체 클래스를 설계하는 사람이 여러 사람일 경우, 실체 클래스마다 필드와 메소드가 제각기 다른 이름을 가질 수 있다. 이런 경우 데이터와 기능이 모두 동일함에도 불구하고 이름이 다를 수 있는데, 그러다보면 객체마다 사용 방법이 달라진다.
따라서 이 방법 보다는 Phone이라는 추상 클래스에 공통적인 필드와 메소드를 선언하고, 자식 클래스에 상속함으로써 필드와 메소드 이름을 통일할 수 있다. - 실체 클래스를 작성할 때 시간 절약
공통적인 필드와 메소드는 추상 클래스에 모두 선언되어 있고, 다른 점만 실체 클래스에서 작성하면 되니 실체 클래스를 작성하는 데 시간을 절약할 수 있다.
추상 클래스 선언
추상 클래스를 선언할 때에는 클래스 선언에 abstract 키워드를 붙여야 한다.
abstract를 붙이면 new 연산자를 이용해서 객체를 만들지 못하고, 오로지 상속을 통해서 자식 클래스만 만들 수 있다.
new 연산자로 직접 생성자를 호출할 수는 없지만, 자식 객체가 생성될 때 super(...)를 호출해서 추상 클래스 객체를 생성하므로 추상 클래스도 생성자가 반드시 있어야 한다.
public abstract class Phone {
public String owner;
public Phone(String owner) {
this.owner = owner;
}
public void turnOn() {
System.out.println("폰 전원을 켭니다.");
}
public void turnOff() {
System.out.println("폰 전원을 끕니다.");
}
}
public class SmartPhone extands Phone{
public SmartPhone(String owner) {
super(owner);
}
public void internetSearch() {
System.out.println("인터넷 검색을 합니다.");
}
}
추상 클래스는 실페 클래스의 공통되는 필드와 메소드를 추출해서 만들었기 때문에 객체를 직접 생성해서 사용할 수 없다.
Animal animal = new Animal(); //<--X
추상 클래스는 새로운 실체 클래스를 만들기 위해 부모 클래스로만 사용된다.
코드로 설명하자면 추상 클래스는 extends 뒤에만 올 수 있는 클래스이다.
class Ant extexds Animal { ... } //<-- O
추상 메소드와 재정의
추상 클래스는 실체 클래스가 공통적으로 가져야 할 필드와 메소드들을 정의해놓은 추상적인 클래스로, 실체 클래스의 멤버(필드, 메소드)를 통일하는 데 목적이 있다.
즉 예를 들어 Dog, Cat, Bird의 공통점만 작성한 Animal이라는 추상클래스가 있다고 했을 때.
Animal 추상 클래스에서 sound()라는 메소드를 재정의할 수는 없다.
동물마다 다양한 소리를 내므로 이것을 추상 클래스에서 통일적으로 작성할 수 없기 때문이다.
하지만 그렇다고 해서 sound() 메소드를 실체 클래스에서 작성하도록 했다가 sound() 메소드를 잊어버리고 작성을 안하게 된다면 동물은 소리를 내지 않는다는 것이 되버린다.
이런 경우를 위해서 추상 클래스는 추상 메소드를 선언할 수 있다.
추상 메소드는 abstract 키워드와 함께 메소드의 선언부만 있고 메소드 실행 내용인 중괄호 {}가 없는 메소드를 말한다.
public abstract Class Animal {
public String kind;
public void breathe() {
System.out.println("숨을 쉽니다.");
}
public abstract void sound (); //<- 추상 메소드
}
public class Dog extends Animal {
public Dog() {
this.kind = "포유류";
}
@Override
public void sound() {
System.out.println("야옹");
}
}
'📖혼자공부하는자바' 카테고리의 다른 글
Chapter13-2 LIFO와 FIFO 컬렉션 (0) | 2022.12.24 |
---|---|
Chapter10-2 예외 처리 (1) | 2022.12.20 |
Chapter 06-6-1 패키지와 접근 제한자 (0) | 2022.12.02 |
Chapter 06-4-2 메소드 호출 (0) | 2022.11.29 |
Chapter 05-2 배열 (0) | 2022.11.26 |