[JAVA] 추상클래스(Abstracat)

2024. 3. 7. 11:19Web/JAVA

1. 추상 클래스(Abstract Class) 란?

  • 일반적인 클래스는 구체적으로 데이터를 담아 인스턴스화 하는 클래스
  • 특정 개발시점에 내용을 확정지으면 안되거나 계획(틀)만을 세울 때 추상적인 데이터를 담고있는 클래스
  • 하나 이상의 추상 메소드를 보유함으로써 클래스를 불완전한 상태로 선언하여 서브 클래스로 하여금 메소드 오버라이드를 통해 추상메소드를 완성하도록 구현을 강제한다.

2. 특징

  • 추상 메소드와 일반 메소드를 선언할 수 있다.
  • 추상 클래스를 상속받는 모든 서브 클래스들은 추상 메소드를 반드시 재정의(강제구현)해야한다.
  • new 연산자 사용을 통한 인스턴스화가 불가하다.
  • 추상 클래스를 선언 할 때에는 abstract 키워드를 사용해야한다.
abstract class 클래스{
	...
    public abstract void 메서드();
    
}

3. 추상 클래스 생성자

  • 반드시 추상 클래스를 어느 자식의 클래스에 상속시키고, 자식 클래스를 인스턴스화 하여 사용해야 한다.
  • 직접적인 인스턴스화가 불가능하다 뿐이지, super() 메소드를 이용해 추상클래스 생성자 호출이 가능
// 추상 클래스
abstract class Shape {
	public String type;
    
    // 추상 클래스 생성자
    public Shape(String type) {
    	this.type = type;
    }
    
    // 추상 메서드
    public abstract void draw();
}

class Figure extends Shape {
	public String name;
    
    public Figure(String type1, String type2) {
    	super(type1); // 부모 추상 클래스 생성자 호출
        name = type2;
    }
    
    @Override
    public void draw() { ... } // 추상 메서드 구현
}

 

4. 추상 클래스 활용방법

  • 공통 멤버의 통합으로 중복제거
  • 상속 (extend) 기능을 사용해 부모 추상클래스로 묶으면, 중복제거, 코드 재사용성 증대 효과를 누릴수 있다.
class Tiger {
	int x, y;
    void move(int x, int y) {}
    void stop() {}
    void bite() {} //고유 행동 물기
}

class Panda {
	int x, y;
    void move(int x, int y) {}
    void stop() {}
    void eat() {} //고유 행동 먹기
}

class Horse {
	int x, y;
    void move(int x, int y) {}
    void stop() {}
    void run() {} //고유 행동 뛰기
}
abstract class Animal {
    int x, y;
    abstract void move(int x, int y); // 지정된 위치로 이동
    void stop() {} // 현재 위치에 정지
}

class Tiger extends Animal{
    void move(int x, int y) {
        System.out.println("무섭게 이동")
    }
    void bite() {} // 고유 행동 물기
}

class Panda extends Animal{
    void move(int x, int y) {
        System.out.println("귀엽게 이동")
    }
    void eat() {} // 고유 행동 먹기
}

class Horese Animal{
    void move(int x, int y) {
        System.out.println("빠르게 이동")
    }
    void run() {} // 고유 행동 뛰기
}
  • 하지만 굳이 추상 클래스로 선언할 필요가 없다. abstract 키워드를 빼고 일반 부모 클래스로 선언해도 상속하고 중복 멤버를 제거하는데 전혀 문제가 되지않는다.
  • 그럼에도 추상 클래스로 사용하는 이유는 자식 클래스를 업캐스팅해서 다형성을 이용하여 프로그래밍 할때 필요하다.

'Web > JAVA' 카테고리의 다른 글