Java/JAVA

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

담크 2021. 9. 26. 23:56

오늘은 자바의 추상 클래스에 대해 공부해보도록 하겠습니다.

 

추상 클래스는 하나이상의 추상 메소드를 포함하고 있는 클래스입니다.

그렇다면 추상 메소드는 무엇일까요? 추상 클래스를 공부하기 전에 추상 메소드 먼저 살짝 알아보고 가겠습니다.

 

추상메소드

abstract 리턴타입 메소드명();

추상메소드는 위와같이 바디부분 없이 선언만 되어있는 메소드입니다. 선언할 때 abstract를 앞에 써줍니다.

이러한 추상메소드는 부모 클래스가 아닌 자식 클래스에서 "반드시" 구현되어야 하는 메소드입니다.(즉, 오버라이딩 되어야 사용이 가능합니다.)

 

 

추상클래스

추상 클래스란 처음에 설명했던것과 같이 하나이상의 추상메소드를 포함하고 있는 클래스입니다.

abstract class 클래스명{
  abstract 리턴타입 메소드명();
}

추상클래스 역시 abstract를 이용해 선언을 해줍니다.

추상 클래스의 특징으로는

1. new 사용이 불가능합니다. 즉 객체를 생성할 수가 없습니다.

2. 상속이 강요됩니다. (상속받는 클래스에서 추상메소드를 반드시 구현해야 합니다.)

가 있습니다.

아래 코드로 살펴보겠습니다.

Animal.java

package test03;

public abstract class Animal {
	
	public abstract void bark();
	
	public void eat(String food) {
		System.out.println(food + "먹는다.");
	}

}

Cat.java

package test03;

public class Cat extends Animal{
	
	@Override
	public void bark() {
		System.out.println("야옹");
	}
	
	@Override
	public void eat(String food) {
		System.out.println("고양이가 ");
		super.eat(food);
	}

}

Dog.java

package test03;

public class Dog extends Animal{
	
	@Override
	public void bark() {
		System.out.println("멍멍");
	}
	
	@Override
	public void eat(String food) {
		System.out.println("강아지가 ");
		super.eat(food);
	}

}

MTest.java

package test03;

public class MTest {
	
	public static void main(String[] args) {
		//추상클래스는 객체선언이 불가능하기 때문에
		//Animal ani = new Animal(); 이 불가능하다(에러가난다.)
		Animal cat = new Cat();
		Animal dog = new Dog();
		
		cat.bark();
		dog.bark();
		
		cat.eat("생선");
		dog.eat("사료");
	}

}

코드 실행결과

Animal 클래스를 추상 클래스로 선언하고 bark( ); 메소드를 추상 메소드로 선언했습니다.

Cat과 Dog클래스에서 추상 클래스인 Animal 클래스를 상속받고 있기 때문에 추상 메소드인 bark( )가 반드시 구현되야합니다.

또한 MTest에서 Animal클래스가 추상 클래스라 객체 생성이 불가능하기 때문에 평소와 다르게 Animal타입의 cat과 dog를 따로 선언해줬습니다.