JAVA & Spring/JAVA 이론

[JAVA] 추상 클래스 (abstract class)

HSRyuuu 2023. 5. 18. 21:36

추상 클래스 

상속을 하기 위해 만드는 클래스

  • 구현 코드 없이 메서드의 선언만 있는 추상메서드를 포함한 클래스
  • 반드시 하나 이상의 추상메서드를 포함해야 한다.
  • 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();  //생성 가능	
	}
}
반응형