자바(Java)에서 추상 클래스(Abstract Class)는 객체 지향 프로그래밍의 중요한 개념 중 하나입니다. 추상 클래스는 하나 이상의 추상 메서드를 포함할 수 있는 클래스이며, 다른 클래스가 이를 상속받아 구현하도록 강제합니다. 이 글에서는 추상 클래스의 개념, 사용 이유, 장점, 추상 클래스의 선언과 구현 방법, 추상 클래스와 관련된 주요 키워드와 개념을 자세히 살펴보겠습니다.
1. 추상 클래스란 무엇인가?
추상 클래스는 하나 이상의 추상 메서드(구현되지 않은 메서드)를 포함할 수 있는 클래스입니다. 추상 클래스는 객체를 생성할 수 없으며, 이를 상속받은 하위 클래스에서 추상 메서드를 구현해야 합니다.
예시
abstract class Animal {
abstract void makeSound();
void sleep() {
System.out.println("This animal is sleeping");
}
}
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("Woof");
}
}
public class Main {
public static void main(String[] args) {
Dog myDog = new Dog();
myDog.makeSound(); // 출력: Woof
myDog.sleep(); // 출력: This animal is sleeping
}
}
위 예시에서 Animal 클래스는 추상 클래스이며, makeSound 추상 메서드를 포함하고 있습니다. Dog 클래스는 Animal을 상속받아 makeSound 메서드를 구현합니다.
2. 추상 클래스를 사용하는 이유
1. 공통적인 행동 정의
추상 클래스는 여러 하위 클래스가 공통으로 가지는 속성과 메서드를 정의할 수 있습니다. 이를 통해 코드의 중복을 줄이고, 공통된 기능을 한 곳에서 관리할 수 있습니다.
abstract class Animal {
void eat() {
System.out.println("This animal eats food.");
}
abstract void makeSound();
}
class Cat extends Animal {
@Override
void makeSound() {
System.out.println("Meow");
}
}
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("Woof");
}
}
2. 객체 생성을 방지
추상 클래스는 인스턴스화할 수 없으므로, 하위 클래스가 아닌 추상 클래스 자체로 객체를 생성하는 것을 방지합니다. 이는 코드의 명확성을 높이고, 불필요한 객체 생성을 막을 수 있습니다.
abstract class Shape {
abstract void draw();
}
// Shape myShape = new Shape(); // 오류: 추상 클래스는 인스턴스화할 수 없음
3. 하위 클래스의 구현 강제
추상 클래스는 추상 메서드를 통해 하위 클래스가 특정 메서드를 반드시 구현하도록 강제합니다. 이를 통해 일관된 인터페이스를 제공할 수 있습니다.
abstract class Vehicle {
abstract void start();
void stop() {
System.out.println("Vehicle is stopping.");
}
}
class Car extends Vehicle {
@Override
void start() {
System.out.println("Car is starting.");
}
}
class Motorcycle extends Vehicle {
@Override
void start() {
System.out.println("Motorcycle is starting.");
}
}
3. 추상 클래스의 선언과 구현
추상 클래스 선언
추상 클래스는 abstract 키워드를 사용하여 선언합니다. 추상 클래스는 추상 메서드와 일반 메서드 모두를 포함할 수 있습니다.
abstract class Animal {
abstract void makeSound();
void sleep() {
System.out.println("This animal is sleeping.");
}
}
추상 클래스 구현
하위 클래스는 extends 키워드를 사용하여 추상 클래스를 상속받습니다. 추상 클래스의 모든 추상 메서드를 구현해야 합니다.
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("Woof");
}
}
4. 추상 클래스와 관련된 주요 키워드와 개념
추상 메서드
추상 메서드는 구현이 없는 메서드로, 선언부만 존재합니다. 하위 클래스에서 반드시 구현해야 합니다.
abstract class Animal {
abstract void makeSound();
}
일반 메서드
추상 클래스는 일반 메서드(구현된 메서드)를 포함할 수 있습니다. 일반 메서드는 하위 클래스에서 상속받아 사용할 수 있습니다.
abstract class Animal {
void eat() {
System.out.println("This animal eats food.");
}
}
final 키워드
final 키워드는 클래스, 메서드, 변수에 사용할 수 있으며, 변경할 수 없음을 의미합니다. final 클래스는 상속할 수 없고, final 메서드는 오버라이딩할 수 없습니다.
final 클래스
public final class FinalClass {
// 내용
}
// 다음 코드는 오류를 발생시킴
// public class SubClass extends FinalClass {
// // 내용
// }
final 메서드
public class Animal {
public final void eat() {
System.out.println("Animal is eating.");
}
}
public class Dog extends Animal {
// 다음 코드는 오류를 발생시킴
// @Override
// public void eat() {
// System.out.println("Dog is eating.");
// }
}
5. 추상 클래스와 인터페이스의 차이점
특징 | 추상 클래스 | 인터페이스 |
다중 상속 지원 여부 | 지원하지 않음 | 지원 |
메서드 구현 | 추상 메서드와 일반 메서드 모두 가질 수 있음 | 기본적으로 구현 없음 (default 메서드 제외) |
접근 제어자 | 모든 접근 제어자 사용 가능 | public |
인스턴스 변수 | 인스턴스 변수 가질 수 있음 | 상수만 가질 수 있음 |
생성자 | 있음 | 없음 |
결론
이 글에서는 자바의 추상 클래스에 대해 자세히 살펴보았습니다. 추상 클래스는 공통적인 행동을 정의하고, 객체 생성을 방지하며, 하위 클래스의 구현을 강제하는 데 중요한 역할을 합니다. 또한, 추상 클래스는 코드의 일관성을 유지하고, 코드의 중복을 줄이는 데 도움을 줍니다. 추가적인 질문이 있으면 언제든지 댓글로 남겨주세요!
'자바' 카테고리의 다른 글
자바 인터페이스 완벽 가이드 (0) | 2024.06.28 |
---|---|
오버로딩과 오버라이딩 완벽 가이드 (0) | 2024.06.27 |
자바 상속(Inheritance) 완벽 가이드 (0) | 2024.06.26 |
객체 지향 프로그래밍(OOP) 가이드 (0) | 2024.06.25 |
자바 메서드 가이드 (0) | 2024.06.24 |