추상 클래스(abstract class) 구현하기
추상의 반대말은 구체적(Concrete)
추상 클래스란?
- 구현 코드 없이 메서드의 선언만 있는 추상 메서드(abstract method)를 포함한 클래스
- 메서드 선언(declaration) : 반환타입, 메서드 이름, 매개변수로 구성
- 메서드 정의(definition) : 메서드 구현(implementation)과 동일한 의미이며 구현부(body) 를 가짐 ({ })
예) int add(int x, int y); // 선언 (세미콜론이 있기 때문에 구현부가 없는 것임)
//구현 메소드가 없으므로 하는 일이 없으니 추상 메서드가 되는 것
//추상 클래스는 이러한 추상 메서드를 포함한 클래스를 말함
int add(int x, int y){ } // 구현부가 있음, 추상 메서드 아님
- abstract 예약어를 사용
- 추상 클래스는 new 할 수 없음 ( 인스턴스화 할 수 없음 )
추상 클래스 구현하기
- 메서드에 구현 코드가 없으면 abstract 로 선언
- abstract로 선언된 메서드를 가진 클래스는 abstract로 선언
- 모든 메서드가 구현 된 클래스라도 abstract로 선언되면 추상 클래스로 인스턴스화 할 수 없음
- 추상 클래스의 추상 메서드는 하위 클래스가 상속 하여 구현
- 추상 클래스 내의 추상 메서드 : 하위 클래스가 구현해야 하는 메서드
- 추상 클래스 내의 구현 된 메서드 : 하위 클래스가 공통으로 사용하는 메서드 ( 필요에 따라 하위 클래스에서 재정의 함 )
- 예제 구현하기
이탤릭체로 된 것이 추상, 정자로 된 것이 구현된 메소드
추상 메서드를 포함한 클래스는 인스턴스화 할 수 없다!
(Computer의 구현되지도 않은 display()를 쓰려고 할 수도 있으니까)
둘 다 abstract를 넣어주었다.
Computer.java
package ch09;
public abstract class Computer {
public abstract void display(); //이 클래스에서 구현하지 못할 메서드는 추상 메서드로 놓고, 하위 클래스에 책임을 위임
public abstract void typing(); //나는 구현하지 않을 것이니 상속받을 너희가 구현해라!
void turnOn() {
System.out.println("전원을 켭니다."); //하위 클래스들이 공통으로 쓸 메소드는 구현해놓음
}
void turnOff() {
System.out.println("전원을 끕니다.");
}
}
Computer를 상속받게 되면, 두개의 추상 메소드를 포함하게 된다. 그렇다면,
1. Desktop 또한 abstract 클래스가 되기
2. 상위 클래스에서 구현하지 않은 추상 메서드를 Desktop에서 구현하기
Desktop.java
package ch09;
public class Desktop extends Computer { // Computer를 상속받게 되면, 두개의 추상 메소드를 포함하게 됨
@Override
public void display() {
System.out.println("Desktop display");
}
@Override
public void typing() {
System.out.println("Desktop typing");
}
@Override
void turnOff() {
System.out.println("Desktop turnoff");
}
}
NoteBook.java
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("MyNoteBook typing");
}
}
ComputerTest.java
package ch09;
public class ComputerTest {
public static void main(String[] args) {
Computer desktop = new Desktop(); //상위 클래스 타입으로 선언(상속과 똑같으며 업캐스팅)
//상위 클래스로 타입을 정했으니, 하위 클래스 Desktop에 새로 구현된 클래스는 쓸 수 없다.
// Computer computer=new Computer(); //안돼!
desktop.display();
}
}
결론
추상 클래스는 "상속"을 하기 위해 만든 클래스이다.
추상 클래스 안에 구현하는 메소드는 일부는 구현할 수도, 구현 안할수도, 전부 구현 안할 수도 있다.
상위 클래스에서, 하위클래스가 쓸 공통 메서드는 구현하고,
너네 자식 클래스들이 알아서 해! 할 메서드는 추상메서드로 비워둔다.
하지만 하위클래스가 상위클래스가 구현하지 않은 메서드들을 다 구현했음에도 불구하고
추상클래스로 두는 경우는
상속만을 위한 클래스로 쓰기 위해서다. (Desktop 클래스를 abstract 할 수 있다. 하지만 new 하지는 못한다)
참고하기
코딩교육 티씨피스쿨
4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등
tcpschool.com
'JAVA' 카테고리의 다른 글
3-11.객체 지향 핵심 - 인터페이스(interface) (0) | 2022.01.23 |
---|---|
3-10.객체 지향 핵심 - 추상 클래스의 응용_템플릿 메서드 패턴 (3) | 2022.01.22 |
3-8.객체 지향 핵심 - 다운캐스팅, instanceof (0) | 2022.01.22 |
3-7.객체 지향 핵심 - 상속 (0) | 2022.01.21 |
3-6.객체 지향 핵심 - 다형성 (0) | 2022.01.17 |