추상클래스 (Abstract Class)
추상클래스는 인터페이스의 역할도 하면서 클래스의 기능도 가지고 있는 클래스이다.
혹자는 추상클래스는 인터페이스로 대체하는 것이 좋은 디자인이라고도 얘기한다.
추상클래스에 대해 알아보기 위해 이전 코드를 추상클래스로 변경해보자.
■ 변경 전:
interface Carnivore{ String getFood(); default void printFeed() { System.out.printf("my food is %s\n", getFood()); } int LEG_COUNT = 4; static int speed() { return LEG_COUNT * 30; } }
■ 변경 후:
//interface Carnivore{ abstract class Carnivore extends Animal{ // String getFood(); abstract getFood(); // default void printFeed() { void printFeed() { System.out.printf("my food is %s\n", getFood()); } // int LEG_COUNT = 4; static int LEG_COUNT = 4; static int speed() { return LEG_COUNT * 30; } }
추상클래스를 만들기 위해서는 class 앞에 abstract 라고 표기하여야 한다.
또한 인터페이스의 메서드와 같은 역할을 하는 메서드 여기서는 getFood()에도 역시 abstract 를 붙여야 한다.
abstract 메서드는 인터페이스의 메서드와 마찬가지로 몸통이 없다.
즉, abstract 클래스를 상속하는 클래스에서 해당 abstract 메서드를 구현해야만 하는 것이다.
그리고 Animal 클래스의 기능을 유지하기 위해 Animal 클래스를 상속하였다.
그리고 인터페이스의 디폴트 메서드는 더이상 사용할 수 없으므로 default 키워드를 삭제하여 일반 메서드로 변경했다.
그리고 LEG_COUNT 상수도 인터페이스에서는 자동으로 static 으로 인식하지만
추상 클래스는 명시적으로 static 이라고 적어주어야 한다.
추상 클래스는 일반 클래스와 달리 단독으로 객체를 생성할 수 없다.
반드시 추상 클래스를 상속한 실제 클래스를 통해서만 객체를 생성할 수 있다.
인터페이스와 추상 클래스의 차이
자바8 버전부터 인터페이스에 default 메서드가 추가되어 추상 클래스와의 차이점이 모호해졌다.
하지만 추상 클래스는 인터페이스와는 달리 일반 클래스 처럼 멤버변수, 생성자, private 메서드 등을 가질 수 있다.
추상 메서드(abstract method)
추상메서드란 자식 클래스에서 반드시 overriding 해야만 사용할 수 있는 메서드를 의미한다.
자바에서 추상 메서드를 선언하여 사용하는 목적은
추상메서드가 포함된 클래스를 상속받는 자식클래스가 반드시 추상 메서드를 구현하도록 하기 위함이다.
예를 들면 모듈처럼 중복되는 부분이나 공통적인 부분은 미리 다 만들어진 것을 사용하고,
이를 받아 사용하는 쪽에서는 자신에게 필요한 부분만을 재정의하여 사용함으로서 생산성이 향상되고
배포 등이 쉬워지기 때문이다.
이러한 추상 메서드는 선언부만이 존재하며, 구현부는 작성되어있지 않다.
바로 이 작성되어있지 않은 구현부를 자식 클래스에서 오버라이딩하여 사용하는 것이다.
자바에서는 추상 메서드는 다음과 같은 문법으로 선언한다.
abstract 반환타입 메서드이름();
위와 같이 선언부만 있꼬 구현부가 없다는 의미로 선언부 끝에 바로 세미콜론(;)을 추가한다.
추상 클래스(abstract class)
자바에서는 하나 이상의 추상 메서드를 포함하는 클래스를 가리켜 추상 클래스(abstract class)라고 한다.
이러한 추상 클래스는 객체 지향 프로그래밍에서 중요한 특징인 다형성을 가지는 메서드의 집합을 정의할
수 있도록 해준다.
즉, 반드시 사용되어야 하는 메서드를 추상 클래스에 추상 메서드로 선언해놓으면,
이 클래스를 상속받는 모든 클래스에서는 이 추상메서드를 반드시 재정의해야 한다.
자바에서 추상 클래스는 다음과 같은 문법으로 선언한다.
abstract class 클래스이름{
...
abstract 반환타입 메서드이름();
...
}
이러한 추상 클래스는 동작이 정의되어 있지 않은 추상 메서드를 포함하고 있으므로, 인스턴스를 생성할 수 없다.
추상 클래스는 먼저 상속을 통해 자식 클래스를 만들고,
만든 자식 클래스에서 추상 클래스의 모든 추상 메서드를 오버라이딩하고 나서야 비로소 자식 클래스의
인스턴스를 생성할 수있게 된다.
추상 클래스는 추상 메서드를 포함하고 있다는 점을 제외하면, 일반 클래스와 모든 점이 같다.
즉, 생성자와 필드, 일반 메서드도 포함할 수 있다.
* e.g.
abstract class Animal{
abstract void cry();
}
class Cat extends Animal{
void cry() {
System.out.println("Meow");
}
}
class Dog extends Animal{
void cry() {
System.out.println("Woof");
}
}
public class TestClass{
public static void main(String[] args) {
Cat c = new Cat();
Dog d = new Dog();
c.cry();
d.cry();
}
}
//Meow
//Woof
'Language > Java' 카테고리의 다른 글
Java - Static (0) | 2023.03.27 |
---|---|
Java - Access Modifier (0) | 2023.03.27 |
Java - Polymorphism (0) | 2023.03.27 |
Java - Interface (0) | 2023.03.26 |
Java - Constructor (0) | 2023.03.26 |