반응형
☕️ 추상클래스(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)
반응형
'IT' 카테고리의 다른 글
[Java] 추상클래스와 인터페이스 비교 (3) | 2025.01.21 |
---|---|
[Java] 인터페이스(Interface) (1) | 2025.01.21 |
[Java] 래퍼 클래스(Wrapper Class)와 박싱(Boxing), 언박싱(Unboxing) (1) | 2025.01.21 |
[Database] Key의 종류와 특징 (1) | 2025.01.21 |
[Database] DDL, DML, DCL, TCL (1) | 2025.01.21 |