Java abstract class란?
Java에서 추상 클래스는 직접 인스턴스화할 수 없는 클래스입니다. 대신 상속할 다른 클래스의 기본 또는 템플릿 역할을 합니다. 추상 클래스에는 구체적인 메서드와 추상 메서드가 모두 있을 수 있으며 인스턴스 변수, 생성자 및 일반 클래스의 기타 기능도 있을 수 있습니다.
추상 메서드는 추상 클래스 자체에 구현이 없는 추상 클래스에서 선언된 메서드입니다. 대신 추상 메서드의 구현은 추상 클래스에서 상속되는 하위 클래스에 맡겨집니다. 추상 클래스를 확장하는 모든 클래스는 모든 추상 메서드를 구현해야 합니다. 그렇지 않으면 추상 클래스로 선언되어야 합니다.
추상메소드가 있으면 무조건 추상 클래스를 받아야하고, 추상 메소드는 자식에게 무조건 전해져야하는데 만일 자식에게 전해지지 않으면 그 다른 자식에게 꼭 전해져야합니다.
예시를 한번 볼까요?
예시
abstract class Parent{
public void eat() {}
public abstract void study();//abstract method, 구현부가 없는 메서드
}
class Child extends Parent{
Child(){super(); }
@Override
public void study() { // 부모의 추상메서드를 반드시 구현해야 한다
System.out.println("자식이 공부하다");
}
}
// study 추상 메서드를 구현하지 않으면 스스로 abstract class가 되어야 한다 => 객체 생성 불가
abstract class Child2 extends Parent{
}
public class TestAbstract1 {
public static void main(String[] args) {
//new Parent();//error.. abstract class 는 new 로 객체 생성 불가
new Child();
// new Child2(); // abstract class 이므로
}
}
이 코드를 IDE에 옮겨서 주석을 풀면서 확인하면 컴파일 에러를 확일 할 수 있습니다.
- abstract class는 인스턴스화 할 수 없습니다.
- abstract method는 무조건 자식 class에게 물려줘야합니다. 바로 다음 자식에게 주지 않아도 되지만 그 자식은 abstract class가 됩니다.
2번에 대한 설명은 재벌집 막내아들 드라마로 예시를 들면 좋은 것 같습니다.
진양철 회장님의 메소드 중 회사경영이라는 메소드가 있는데, 이 메소드를 4번째 아들 진윤기는 받지 않았기 때문에 추상 class가 되기 때문에 아들이 되지 못합니다. 대신, 진도준은 회사경영이라는 메소드를 물려받기 때문에 추상 클래스를 벗어나 인스턴스를 생성할 수 있어 손자로 실체화를 할 수 있습니다.
피자 만들기 예시 (Template Method Design Pattern)
Template Method Design Pattern 이란?
부모 클래스에서 문제 해결 방안(알고리즘)의 구조를 제공하여 자식에 재사용하도록 하는 디자인 패턴
해산물 피자, 포테이토 피자 등... 피자의 공정은 동일하고 토핑만 다릅니다. 다양한 피자들을 상속 계층 구조를 만들어 부모 피자 클래스에서 피자공정을 정의하는 메서드(템플릿 메서드)를 한번 만들어 다양한 피자 클래스들이 상속받아 사용하고 자식 차원에서 할 수 밖에 없는 작업인 토핑 작업만 구현해서 생산성, 유지보수성을 향상시킵니다.
public class TestTemplateMethodDesignPattern {
public static void main(String[] args) {
SeaFoodPizzaService service=new SeaFoodPizzaService();
PotatoPizzaService service2=new PotatoPizzaService();
service.makePizza();
System.out.println("*************");
service2.makePizza();
System.out.println("*************");
BulGoGiPizzaService service3=new BulGoGiPizzaService();
service3.makePizza();
/*
도우를 만들다
해산물 토핑 작업을 하다
굽다
자르다
포장하다
*******************
도우를 만들다
포테이토 토핑 작업을 하다
굽다
자르다
포장하다
*/
}
}
//피자 만들기 서비스
public abstract class PizzaService {
// protected : 다른 패키지에서 접근 불가하나 상속관계 즉 자식은 접근 가능
// 자식에게 물려줄 멤버 메서드
protected void prepare() {
System.out.println("도우를 만들다");
}
// 부모 차원에서 구현하여 물려줄 수 없는 업무인 메서드이므로
// abstract method로 선언하여 자식 클래스에게 반드시 구현하게 강제한다
protected abstract void topping();
protected void bake() {
System.out.println("굽다");
}
protected void cutting() {
System.out.println("자르다");
}
protected void boxing() {
System.out.println("포장하다");
}
//template method : 작업 공정의 뼈대를 정의
//사용하는 측에게 공개하는 메서드
public void makePizza() {
prepare();
topping();
bake();
cutting();
boxing();
}
}
public class SeaFoodPizzaService extends PizzaService{
@Override
protected void topping() {
System.out.println("해산물 토핑작업을 하다");
}
}
public class PotatoPizzaService extends PizzaService{
@Override
protected void topping() {
System.out.println("포테이토 토핑 작업을 하다");
}
}
부모 클래스의 추상 메소드인 topping()메소드만 내용을 변경하면서 피자를 만들면 값이 변경됩니다. 불고기 피자 서비스를 직접 만들어 보면서 abstract 메소드의 참맛을 느껴보도록 하세요.
소감 및 abstract 사용 이유
추상클래스를 왜 사용하는지는 몰랐는데, 팀 프로젝트를 할 때 틀이 잡혀있지 않으면 중구난방으로 코드를 완성시킬 것이고 새로운 제품이 계속 생겨나도 멋대로 만들다가 갑자기 회사의 규모가 커지면서 제품을 100개를 만들어야하는 상황이 오면 100개에 대한 코드를 새로 만들어야합니다. 그렇기 때문에 abstract 클래스와 메소드를 이용해서 틀을 만들어 새로운 자식 class를 만들 때 수월하게 해주면 좋습니다.
'코딩 개발 > Java' 카테고리의 다른 글
Java - Set, ArrayList (0) | 2023.04.11 |
---|---|
Java - Interface (feat. abstract) (0) | 2023.04.11 |
Java - Static (feat. final, metaspace) (0) | 2023.04.09 |
Java - 다형성(Polymorphism) (0) | 2023.04.09 |
Java - 상속(Inheritance) (0) | 2023.04.09 |