자바(Java)는 객체 지향 프로그래밍(OOP) 언어로서, 추상 클래스(Abstract Class)라는 중요한 기능을 제공합니다.
추상 클래스는 객체 지향 프로그래밍의 핵심 원리 중 하나인 추상화(Abstraction)를 구현하는 도구로서, 다형성(Polymorphism)을 효과적으로 활용할 수 있게 해줍니다.
이 글에서는 Java 추상 클래스의 개념, 사용 방법, 장점, 그리고 실제 예제를 통해 간단하게 알아보겠습니다.
1. 추상 클래스란?
추상 클래스란 다음과 같은 특징을 가지는 클래스입니다.
- 인스턴스를 직접 생성할 수 없습니다.
- 하위 클래스(subclass)에서 상속받아 사용하도록 설계됩니다.
- 추상 메서드(abstract method)를 포함할 수 있습니다. 추상 메서드는 하위 클래스에서 반드시 구현해야 합니다.
추상 클래스는 일종의 '추상적인 틀'을 제공하며, 하위 클래스에서 이를 구체화하고 확장하여 사용합니다. 이로써 코드의 재사용성과 유지보수성을 향상시키는데 기여합니다.
2. 추상 메서드
추상 메서드는 메서드의 선언부만 있고 구현 내용이 없는 메서드를 의미합니다. 추상 메서드는 다음과 같은 특징을 가집니다.
- abstract 키워드로 선언됩니다.
- 하위 클래스에서 반드시 구현해야 합니다.
- 구현부가 없으므로 중괄호({}) 대신 세미콜론(;)으로 끝납니다.
추상 메서드는 추상 클래스 내에서만 선언할 수 있으며, 하위 클래스에서 이를 구현함으로써 다형성을 구현할 수 있습니다.
3. 추상 클래스의 사용 예제
3.1. 추상 클래스 정의
아래는 추상 클래스 Shape 를 정의하는 예제입니다.
abstract class Shape {
String color;
Shape(String color) {
this.color = color;
}
// 추상 메서드
abstract double area();
abstract void draw();
}
Shape 클래스는 추상 메서드 area() 와 draw() 를 선언하고 있으며, 이 클래스는 직접 인스턴스를 생성할 수 없습니다.
3.2. 추상 클래스 상속
Shape 클래스를 상속받아 구체적인 도형 클래스를 정의할 수 있습니다. 예를 들어, 원(Circle)과 사각형(Rectangle) 클래스를 정의할 수 있습니다.
class Circle extends Shape {
double radius;
Circle(String color, double radius) {
super(color);
this.radius = radius;
}
@Override
double area() {
return Math.PI * radius * radius;
}
@Override
void draw() {
System.out.println("원을 그립니다.");
}
}
class Rectangle extends Shape {
double width;
double height;
Rectangle(String color, double width, double height) {
super(color);
this.width = width;
this.height = height;
}
@Override
double area() {
return width * height;
}
@Override
void draw() {
System.out.println("사각형을 그립니다.");
}
}
위와 같이 각 도형 클래스에서는 area() 와 draw() 메서드를 구현해야 합니다. 이렇게 구현된 메서드는 추상 클래스 Shape 의 추상 메서드를 오버라이딩한 것입니다.
3.3. 다형성 활용
추상 클래스와 하위 클래스를 활용하여 다형성을 구현할 수 있습니다. 다형성을 이용하면 동일한 메서드 이름을 가진 다양한 하위 클래스 객체를 일관되게 다룰 수 있습니다.
public class Main {
public static void main(String[] args) {
Shape circle = new Circle("빨강", 5.0);
Shape rectangle = new Rectangle("파랑", 4.0, 6.0);
printShapeInfo(circle);
printShapeInfo(rectangle);
}
static void printShapeInfo(Shape shape) {
System.out.println("도형의 색: " + shape.color);
System.out.println("면적: " + shape.area());
shape.draw();
}
}
위 예제에서 printShapeInfo() 메서드는 Shape 타입의 인자를 받으며, 이 메서드를 통해 Circle 과 Rectangle 객체를 동일하게 다룰 수 있습니다. 이것이 바로 다형성의 장점 중 하나입니다.
4. 추상 클래스의 장점
4.1. 추상화와 모델링
추상 클래스는 현실 세계의 객체를 모델링하는 데 도움을 줍니다. 추상 클래스를 통해 공통된 특성과 동작을 정의할 수 있으며, 이를 하위 클래스에서 구체화하여 사용함으로써 현실 객체를 프로그래밍에 반영할 수 있습니다.
4.2. 다형성 구현
추상 클래스를 사용하면 다형성을 쉽게 구현할 수 있습니다. 다양한 하위 클래스를 통일된 방식으로 다룰 수 있어 코드의 유연성과 확장성을 높입니다.
4.3. 메서드 구현 강제화
추상 메서드를 사용하면 하위 클래스에서 특정 메서드의 구현을 강제화할 수 있습니다. 이로써 하위 클래스는 반드시 필요한 메서드를 구현하도록 보장됩니다.
5. 추상 클래스의 주의사항
5.1. 추상 클래스 인스턴스 생성 불가
추상 클래스는 직접 인스턴스를 생성할 수 없습니다. 따라서 추상 클래스의 인스턴스를 생성하려고 시도하면 컴파일 오류가 발생합니다.
5.2. 모든 추상 메서드 구현
하위 클래스는 추상 클래스의 모든 추상 메서드를 반드시 구현해야 합니다. 그렇지 않으면 하위 클래스 역시 추상 클래스로 선언되어야 합니다.
6. 추상 클래스 vs. 인터페이스
추상 클래스와 인터페이스는 모두 다형성을 구현하는 데 사용되지만, 각각의 특징과 용도가 다릅니다.
- 추상 클래스: 일부 메서드를 구현하고 일부 메서드를 추상 메서드로 선언할 수 있으며, 다중 상속을 지원하지 않습니다.
- 인터페이스: 모든 메서드가 추상 메서드이며, 다중 상속을 지원합니다.
일반적으로, 추상 클래스는 공통된 기능을 가진 클래스들의 상속 구조를 설계하고, 인터페이스는 다양한 클래스들이 특정 동작을 보장하도록 하는데 사용됩니다.
7. 결론
자바의 추상 클래스는 객체 지향 프로그래밍의 핵심 원리 중 하나인 추상화와 다형성을 구현하는 강력한 도구입니다.
추상 클래스를 사용하여 현실 세계의 객체를 모델링하고, 하위 클래스에서 이를 구체화함으로써 유지보수 가능한 코드를 작성할 수 있습니다.
추상 클래스와 추상 메서드는 코드의 재사용성을 높이고, 다형성을 통해 유연한 프로그래밍을 가능하게 합니다.
따라서 자바 프로그래머에게 추상 클래스의 개념과 활용법을 숙지하는 것은 중요한 스킬 중 하나이며, 객체 지향 프로그래밍의 핵심을 이해하는 데 도움이 될 것입니다.
'JAVA' 카테고리의 다른 글
Java 접근지정자 알아보자 1편 (0) | 2023.10.07 |
---|---|
Java 인터페이스 알아보자 (0) | 2023.10.02 |
Java 멀티 쓰레드 간단히 알아보자 (2) | 2023.09.24 |
Java Collection 간단 정리 (0) | 2023.09.19 |
Java Optional 간단 정리 (0) | 2023.09.18 |