추상 클래스 란?
- 구현 코드 없이 메서드의 선언만 있는 추상 메서드를 포함한 클래스
- 메서드 선언 : 반환타입, 메서드 이름, 메게변수로 구성
- 메서드 정의 : 메서드 구현과 동일한 의미 구현부(body) 를 가짐 ({})
- 예) int add(imt x, int y); // 선언 , int add(int x, int y){} // 구현부가 있음, 추상 메서드 아님
- abstract 예약어를 사용
- 추상 클래스는 new 할 수 없음 (인스턴스화 할 수 없음)
- 상속을 위한 클래스
추상 클래스 구현하기
- 메서드에 구현 코드가 없으면 abstract로 선언
- abstract로 선언된 메서드를 가진 클래스는 abstract로 선언
- 모든 메서드가 구현 된 클래스라도 abstract로 선언되면 추상 클래스로 인스턴스화 할 수 없음
- 추상 클래스의 추상 메서드는 하위 클래스가 상속 하여 구현
- 추상 클래스 내의 추상 메서드 : 하위 클래스가 구현해야 하는 메서드
- 추상 클래스 내의 구현 된 메서드 : 하위 클래스가 공통으로 사용하는 메서드 (필요에 따라 하위 클래스에서 재정의 함)
상위 클래스인 Computer 클래스를 추상 클래스로 구현을 해보자
추상클래스는 추상 메소드가 있는 클래스 인데 추상 메소드는 구현부가 없는 메소드이다. 구현부가 없는 메소드는 무엇일까?
public abstract void display();
public abstract void typing();
안에 내용이 없고 메소드 정의만 되어 있는 것이 추상 메소드이다.
추상 메소드를 구성할때는 abstract를 선언 하게 되는데 abstract는 추상을 뜻 하는 것이다.
만약 abstract를 선언 안하고 구현부 없는 메소드를 만들면 어떻게 될까?

코드가 에러가 난다. 빨간색 부분을 커서를 옮기게 되면 해당 코드에 구현부를 넣어서 해결 할 것인지 아니면 abstract를 선언 할것인지 해결 방안을 보여준다.
그래서 추상메서드는 abstract 를 꼭 선언 해야한다.
그렇다면 추상 클래스도 abstract 를 꼭 선언 해야 할까?
당연히 abstract 를 선언해야한다. 추상메서드를 선언 하고 클래스에 abstract 이 없다면 에러가 난다.

무조건 클래스 내에 추상 메서드가 있다면 abstract 으로 클래스도 선언 해줘야 한다.
Computer.java
public abstract class Computer {
public abstract void display();
public abstract void typing();
public void turnOn() {
System.out.println("전원을 켭니다.");
}
public void turnOff() {
System.out.println("전원을 끕니다.");
}
}
상위 클래스인 Computer 클래스를 상속 받는 하위 클래스 Desktop 클래스 구현
상위클래스인 Computer를 상속 받으면 추상메서드를 구현 해야한다.
@Override
public void display() {
System.out.println("Desktop display");
}
@Override
public void typing() {
System.out.println("Desktop typing");
}
Desktop.java
public class Desktop extends Computer {
@Override
public void display() {
System.out.println("Desktop display");
}
@Override
public void typing() {
System.out.println("Desktop typing");
}
@Override
public void turnOn() {
System.out.println("Desktop turnOn");
}
@Override
public void turnOff() {
System.out.println("Desktop turnOff");
}
}
추상메서드를 오버라이드를 안하고 상위클래스 처럼 추상클래스를 하고 싶다면 abstract 선언 하면 된다.

추상클래스를 테스트 한번 해보자
ComputerTest.java
public class ComputerTest {
public static void main(String[] args) {
Computer desktop = new Desktop();
// Computer computer = new Computer();
desktop.display();
desktop.typing();
}
}
Computer computer = new Computer(); // 오류!! 추상클래스는 인스턴스 생성이 안된다.

참고 :
Fastcampus
'JAVA' 카테고리의 다른 글
| [JAVA] 구현 코드가 없는 인터페이스 (0) | 2023.08.01 |
|---|---|
| [JAVA] 추상 클래스의 응용 - 템플릿 메서드 패턴 (0) | 2023.07.30 |
| [JAVA] instanceof 연산자 와 업캐스팅,다운캐스팅 (0) | 2023.07.28 |
| [JAVA] 다형성과 다형성을 사용하는 이유 (2) | 2023.07.26 |
| [JAVA] 메서드 재정의 하기 (2) | 2023.07.16 |