개발/JAVA

Java로 배우는 객체 지향 프로그래밍 - 추상 클래스와 상속

예니03 2025. 2. 7. 09:08
반응형

안녕하세요! 😊 오늘은 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 클래스를 상속받아 공통된 메서드를 가지면서도, 각각의 기능을 구현할 수 있음.

이제 여러분도 추상 클래스를 활용해서 더 멋진 프로그램을 만들어 볼 수 있을 거예요! 🚀 감사합니다! 🙌

반응형