IT

[Java] 추상 클래스(Abstract Class)

data-cloud 2025. 1. 21. 21:05
반응형


☕️ 추상클래스(Abstract Class)란?

추상 클래스(Abstract Class)는 추상 메서드를 선언해 놓고 상속을 통해 자식 클래스에서 메서드를 완성하도록 유도하는 클래스이다.

즉, 반드시 사용되어야 하는 메서드를 추상 클래스에 추상 메서드로 선언해 놓으면, 이 클래스를 상속받는 모든 클래스에서는 이 추상 메서드를 반드시 재정의해야 한다. 추상클래스는 abstract 키워드를 붙여 선언할 수 있다.

abstract class Animal {
    abstract void cry();
}

 

위의 코드처럼 추상메서드를 선언했다면, 자식클래스에서는 반드시 추상메서드를 구현해야 한다.

class Bird extends Animal {
    @Override
    void cry() { // 반드시 cry()를 구현해야한다.
        System.out.println("짹짹");
    }
}

class Cat extends Animal {
    @Override
    void cry() { // 반드시 cry()를 구현해야한다.
        System.out.println("야옹");
    }
}

class Dog extends Animal {
    @Override
    void cry() { // 반드시 cry()를 구현해야한다.
        System.out.println("멍멍");
    }
}

 

 

 

☕️ 추상클래스(Abstract Class)의 특징

  • 구현해야 하는 메서드들은 상위 클래스에서 선언을 해놓고, 구현의 책임을 하위클래스에 위임한다.
  • 메서드와 클래스에 abstract 예약어를 사용한다.
  • 추상메서드가 없어도 abstract 키워드를 사용하면 추상클래스가 된다. 단, 추상메서드가 하나라도 존재한다면 그 클래스는 반드시 추상 클래스가 돼야 한다.
  • 생성자를 가질 수 있고, 일반 메서드도 가질 수 있다. (단, 생성자를 갖지만 객체 생성은 불가능하다.)

 

반응형

 

☕️ 추상클래스의 장점

1. 중복 제거, 코드 재사용성 증대 효과
다음과 같이 Bird, Cat, Dog 클래스에는 나이라는 변수(age)가 있다고 가정해보자.

class Bird {
    int age;
}

class Cat {
    int age;
}

class Dog {
    int age;
}

public class Test {

    public static void main(String[] args) {
        Bird bird = new Bird();
        bird.age = 10;
        
        Cat cat = new Cat();
        cat.age = 10;
        
        Dog dog = new Dog();
        dog.age = 10;
    }

}


각 클래스마다 age라는 변수가 중복되어 사용되고 있는 상황이다. 만약 추상클래스를 만든 후 상속을 받는다면 중복코드를 제거할 수 있다.

abstract class Animal {
    int age;
}

class Bird extends Animal {
}

class Cat extends Animal {
}

class Dog extends Animal {
}

public class Test {

    public static void main(String[] args) {
        Bird bird = new Bird();
        bird.age = 10;
        
        Cat cat = new Cat();
        cat.age = 10;
        
        Dog dog = new Dog();
        dog.age = 10;
    }

}

 

 

2. 그룹화

추상클래스를 사용하여 상속을 통해 자식클래스를 구현한다면, 각 각의 클래스들을 그룹화하여 제어할 수 있다.
상속 없이 Bird, Cat, Dog 클래스의 cry() 메서드를 각 각 호출하고 싶다면, 아래와 같이 코드를 작성할 수 있을 것이다.

class Bird {
    void cry() {
        System.out.println("짹짹");
    }
}

class Cat {
    void cry() {
        System.out.println("야옹");
    }
}

class Dog {
    void cry() {
        System.out.println("멍멍");
    }
}

public class Test {

    public static void main(String[] args) {
        Bird bird = new Bird();
        bird.cry(); // 짹짹
        
        Cat cat = new Cat();
        cat.cry(); // 야옹
        
        Dog dog = new Dog();
        dog.cry(); // 멍멍
    }

}

반면, 추상클래스와 상속을 활용한다면 부모클래스로 그룹화하여 제어가능한 코드가 된다.

abstract class Animal 
    abstract void cry();
}

class Bird extends Animal {
    @Override
    void cry() {
        System.out.println("짹짹");
    }
}

class Cat extends Animal {
    @Override
    void cry() {
        System.out.println("야옹");
    }
}

class Dog extends Animal {
    @Override
    void cry() {
        System.out.println("멍멍");
    }
}

public class Test {

    public static void main(String[] args) {
        // 부모 클래스로 객체 생성
        Animal[] animals = new Animal[]{new Bird(), new Cat(), new Dog()};
        for (Animal animal : animals) {
            animal.cry(); // 짹짹, 야옹, 멍멍
        }
    }

}

 

 

 

 

 

References.

1. 점프 투 자바
2. Limky 삽질블로그 -  [JAVA] 자바 추상클래스란?
3. im_joonchul.log - 추상클래스(Abstract class)

 

반응형