추상 클래스
상속을 하기 위해 만드는 클래스
- 구현 코드 없이 메서드의 선언만 있는 추상메서드를 포함한 클래스
- 반드시 하나 이상의 추상메서드를 포함해야 한다.
- abstract 예약어 사용
- 추상 클래스는 인스턴스화할 수 없음 ( 객체 생성 불가 )
- (참고) 추상 클래스, 추상 메서드는 클래스 다이어그램에서 기울임체로 쓴다.
추상 메서드
- 자식 클래스에서 반드시 overriding 해야하는 메소드
- 선언한 하고 구현하지 않는다.
abstract int methodA(int x, inty); //추상메서드
< 메서드 선언, 정의의 차이 >
더보기
1) 메서드 선언 (declaration) : 반환타입, 메서드 이름, 매개변수로 구성
2) 메서드 정의(definition) : 구현부 { }를 가짐
abstract int methodA(int x, inty); //추상메서드
abstract int methodB(int x, int y){} //구현부가 있음 => 추상메서드가 아니다.
< 예제 >
1. class Car
- drive(), take() : 추상 메서드
- move() : 일반 메서드
abstract class Car{
abstract void drive();
abstract void take();
void move() {
System.out.println("자동차가 움직입니다.");
}
}
2. class Sedan
- 모든 추상메서드를 override 했다.
class Sedan extends Car{
//추상메서드를 모두 override 해준다.
@Override
void drive() {
System.out.println("세단을 운전합니다.");
}
@Override
void take() {
System.out.println("세단에 탑승합니다.");
}
}
3. class Truck
- drive() 메서드는 override 했지만, take()메서드는 구현하지 않았기 때문에 abstract class이다.
abstract class Truck extends Car{
@Override
void drive() {
System.out.println("트럭을 운전합니다.");
}
}
4. class MyTruck
- Truck에서 drive(), Mytruck에서 take()을 override 했기 때문에 추상클래스 Car의 모든 메서드를 override했다.
- 따라서 MyTruck은 추상 클래스가 아닌 그냥 클래스이다.
class MyTruck extends Truck{
@Override
void take() {
System.out.println("내 트럭에 탑승합니다.");
}
}
5. test
- Car, Truck은 추상 클래스이므로 인스턴스를 만들 수 없음.
public class test {
public static void main(String[] args) {
Car car = new Car(); //오류
Truck truck = new Truck();//오류
Car sedan = new Sedan(); //생성 가능
Car myTruck = new MyTruck(); //생성 가능
}
}
반응형
'JAVA & Spring > JAVA 이론' 카테고리의 다른 글
[Java] equals()와 hashCode() / equals와 hashCode를 둘 다 재정의 해야하는 이유 (0) | 2024.03.14 |
---|---|
[Java / CS] JVM과 Java의 메모리 구조 (0) | 2024.02.16 |
[JAVA] 상속 (0) | 2023.05.17 |
[JAVA] static과 final (0) | 2023.05.17 |
[JAVA] 접근 제어 지시자( private, protected, default, public) / 정보은닉, 캡슐화 (0) | 2023.05.17 |