추상 클래스 (absract class)
- 구현부가 없고 선언부만 있는 추상 메서드를 포함한 클래스
- 메서드 선언 (메서드의 시그니처) : 반환타입, 메서드 이름, 매개변수로 구성
- 메서드 정의 : = 메서드 구현, body {} 부분 구현
- 추상 클래스는 new 키워드로 인스턴스를 생성할 수 없다. (인스턴스화 할 수 없음) → 추상 메서드의 구현 코드가 없기 때문
- 상속을 하기 위해 만든 클래스이다.
int add(int x, int y); // 추상 메서드
int add(int x, int y){}; // 구현부가 있으므로 추상 메서드 X
예제 코드
클래스 다이어그램
Computer.java
- 추상 메서드는 absract 키워드를 이용해 정의
- 구현의 책임은 하위 클래스에 위임한다.
- 모든 클래스에서 공통으로 사용할 메서드는 일반 메서드로 정의하고 구현부까지 작성한다.
package ch09;
public abstract class Computer { // 상속을 위한 클래스
public abstract void display(); // 추상 메서드
public abstract void typing();
public void turnOn() { // 공통으로 사용할 메서드는 구현
System.out.println("전원을 켭니다");
}
public void turnOff() {
System.out.println("전원을 끕니다");
}
}
Desktop.java
- Computer 클래스를 상속받는 Desktop 클래스도 absract 메서드를 포함하기 때문에 정의해놓은 모든 abstract 메서드를 구현해주거나, 역시 absract 클래스로 선언될 수 있다.
- 여기서는 모든 absract 메서드를 구현해주었다.
- 메서드를 모두 구현해주었을 때도 absract 클래스로 선언할 수 있다. → new 불가, 상속만을 위한 클래스
- 추가로 Computer 클래스에서 이미 구현부가 있는 메서드도 오버라이딩 해줄 수 있다.
package ch09;
public class Desktop extends Computer{
@Override
public void display() { // absract 메서드 구현
System.out.println("Desktop Display");
}
@Override
public void typing() { // absract 메서드 구현
System.out.println("typing");
}
@Override
public void turnOff() { // 일반 메서드 오버라이딩
System.out.println("Desktop turnOff");
}
}
NoteBook.java
- 추상 클래스 안에서 추상 메서드는 모두 구현할 수도 있고 일부만 구현할 수도 있다.
- 추상 메서드 일부만 구현부가 있다면 absract 클래스로 선언해준다.
package ch09;
public abstract class NoteBook extends Computer{
@Override
public void display() {
System.out.println("NoteBook display");
}
}
MyNoteBook.java
package ch09;
public class MyNoteBook extends NoteBook{
@Override
public void typing() {
System.out.println("typing");
}
}
ComputerTest.java
package ch09;
public class ComputerTest {
public static void main(String[] args) {
Computer desktop = new Desktop();
desktop.turnOff(); // Computer 클래스에 정의되어 있는 메서드만 사용가능
}
}
'Java & Kotlin' 카테고리의 다른 글
[Java 객체지향] 추상 클래스 활용 (템플릿 메서드 패턴) (0) | 2022.02.01 |
---|---|
[Java 객체지향] 다운 캐스팅과 instanceof (0) | 2022.01.31 |
[Java 객체지향] 다형성 (0) | 2022.01.31 |