Java로 배우는 객체 지향 프로그래밍 - 추상 클래스와 상속
안녕하세요! 😊 오늘은 Java에서 추상 클래스(abstract class)와 상속을 활용하는 방법을 알아볼게요. 추상 클래스는 객체 지향 프로그래밍에서 굉장히 중요한 개념이에요. 예제 코드를 통해 쉽게 이해할 수 있도록 설명할 테니 함께 따라와 보세요!
1. 추상 클래스란?
추상 클래스는 자신이 직접 객체화될 수 없고, 오직 상속을 통해서만 사용할 수 있는 클래스예요. 즉, 부모 역할만 하는 클래스라고 보면 돼요.
추상 클래스에는 추상 메서드가 포함될 수 있어요. 추상 메서드는 구현(몸통)이 없는 메서드로, 자식 클래스에서 반드시 구현해야 해요.
추상 클래스는 "이런 기능이 꼭 필요해!"라고 정의해 두고, 실제 구현은 자식 클래스에서 맡기는 개념이에요.
2. 추상 클래스 Shape 만들기
먼저, 도형을 표현하는 추상 클래스 Shape를 만들어볼게요.
package com.javaex.oop.shape.v1;
public abstract class Shape {
protected int x;
protected int y;
// 생성자
public Shape(int x, int y) {
this.x = x;
this.y = y;
}
// 추상 메서드 - 자식 클래스에서 반드시 구현해야 함
public abstract void draw();
public abstract double area();
}
Shape 클래스는 draw()와 area()라는 두 개의 추상 메서드를 가지고 있어요. 이 메서드들은 자식 클래스에서 꼭 구현해야 해요!
3. 추상 클래스를 상속하는 Circle(원) 클래스 만들기
이제 Shape 클래스를 상속하는 Circle 클래스를 만들어볼게요!
package com.javaex.oop.shape.v1;
public class Circle extends Shape {
private double radius;
// 생성자
public Circle(int x, int y, double radius) {
super(x, y); // 부모 클래스 생성자 호출
this.radius = radius;
}
@Override
public void draw() {
System.out.printf("원 [x=%d, y=%d, r=%.2f, area=%.2f]을 그렸습니다.%n",
x, y, radius, area());
}
@Override
public double area() {
return Math.PI * Math.pow(radius, 2);
}
}
- Circle 클래스는 Shape를 상속받았기 때문에, 부모 클래스의 x와 y를 사용할 수 있어요.
- draw() 메서드를 구현해서 원의 정보를 출력하도록 했어요.
- area() 메서드에서는 원의 넓이를 계산하도록 했어요.
4. Rectangle(사각형) 클래스 만들기
이번에는 Rectangle 클래스를 만들어볼게요!
package com.javaex.oop.shape.v1;
public class Rectangle extends Shape {
private int width;
private int height;
// 생성자
public Rectangle(int x, int y, int width, int height) {
super(x, y);
this.width = width;
this.height = height;
}
@Override
public double area() {
return width * height;
}
@Override
public void draw() {
System.out.printf("사각형 [x=%d, y=%d, w=%d, h=%d, area=%.2f]을 그렸습니다.%n",
x, y, width, height, area());
}
}
- Rectangle도 Shape를 상속받았어요.
- draw()와 area() 메서드를 오버라이드해서 사각형을 그리는 기능을 추가했어요.
5. 실제로 사용해보기 (Main 메서드)
이제 ShapeApp 클래스를 만들어서 우리가 만든 클래스를 실행해볼게요!
package com.javaex.oop.shape.v1;
public class ShapeApp {
public static void main(String[] args) {
// Shape s = new Shape(); // 추상 클래스는 직접 객체화 불가!
// Circle 객체 생성 및 사용
Circle c = new Circle(10, 20, 30);
c.draw();
// Rectangle 객체 생성 및 사용
Rectangle r = new Rectangle(10, 20, 100, 50);
r.draw();
}
}
출력 결과:
원 [x=10, y=20, r=30.00, area=2827.43]을 그렸습니다.
사각형 [x=10, y=20, w=100, h=50, area=5000.00]을 그렸습니다.
이렇게 하면 원과 사각형이 각각 그려지는 것을 확인할 수 있어요! 😆
6. 정리
오늘 배운 내용을 정리해볼게요.
✔ 추상 클래스(abstract class)
- 직접 객체화될 수 없고, 상속을 통해서만 사용할 수 있음.
- 추상 메서드를 포함할 수 있으며, 자식 클래스는 이를 반드시 구현해야 함.
✔ 추상 메서드(abstract method)
- 구현(몸통)이 없는 메서드.
- 자식 클래스에서 반드시 구현해야 함.
✔ 상속을 활용한 객체 생성
- Circle과 Rectangle은 Shape 클래스를 상속받아 공통된 메서드를 가지면서도, 각각의 기능을 구현할 수 있음.
이제 여러분도 추상 클래스를 활용해서 더 멋진 프로그램을 만들어 볼 수 있을 거예요! 🚀 감사합니다! 🙌