추상클래스 (python, java 비교)

혜쿰·2023년 10월 13일
0
post-thumbnail

📗 개념

추상 (Abstraction)이란?

추상은 복잡한 현실 세계를 단순화하여 모델링하는 프로세스를 나타낸다. 추상은 객체 지향 프로그래밍에서 클래스와 메서드를 정의하는 과정에서 중요한 역할을 한다. 추상 클래스와 추상 메서드를 사용하여 공통의 특성과 동작을 모델링하며, 이를 기반으로 구체적인 클래스를 정의한다.

추상 클래스 : 추상 클래스는 하나 이상의 추상 메서드를 포함하며, 직접 인스턴스화될 수 없다. 추상 클래스는 공통의 특성을 정의하고 하위 클래스에서 이러한 특성을 구체화하는 데 사용된다.
추상 메서드 : 추상 메서드는 메서드의 시그니처만 정의하고 구현 내용은 포함하지 않는 메서드이다. 추상 메서드는 하위 클래스에서 반드시 재정의되어야 한다.

다형성 (Polymorphism)이란?

다형성은 여러 형태를 가질 수 있는 더 일반적인 개념으로, 객체 지향 프로그래밍에서 여러 클래스가 공통 인터페이스를 구현하는 데 사용된다. 다형성은 동일한 인터페이스를 사용하여 여러 객체 유형을 다룰 수 있도록 하며, 코드의 유연성을 높이고 재사용성을 증가시킨다.
다형성은 메서드 호출과 객체의 사용에서 다양한 클래스의 객체를 처리할 수 있도록 한다. 동일한 메서드 이름을 사용하여 다른 클래스의 객체에 대해 다양한 동작을 수행할 수 있다.
다형성은 상속, 인터페이스, 추상 클래스 등을 통해 구현된다. 서로 다른 클래스가 동일한 인터페이스를 구현하거나 상속을 받으면, 다형성을 활용하여 이러한 객체를 일반적인 방식으로 다룰 수 있다.



추상과 다형성은 객체 지향 프로그래밍의 핵심 개념으로, 코드의 모델링, 유연성, 재사용성을 향상시키는 데 중요한 역할을 한다. 다형성은 코드를 더 추상적으로 만들어 복잡성을 관리하고, 새로운 클래스를 쉽게 추가하고 확장할 수 있는 방법을 제공한다.

📗 추상 클래스의 차이점(python vs java)

1. 선언 방법:

  • 파이썬: 파이썬에서는 추상 클래스를 정의할 때 abc (Abstract Base Classes) 모듈을 사용하여 추상 메서드를 선언한다. abc 모듈을 사용하지 않고도 추상 클래스를 만들 수는 있지만, 명시적으로 추상 메서드를 정의하고 해당 메서드를 호출해야 한다. 추상클래스 내의 일반 메소드의 경우에는 오버라이딩이 선택이다.
  • 자바: 자바에서는 추상 클래스를 선언할 때 abstract 키워드를 사용하여 클래스를 추상 클래스로 지정하고, 추상 메서드는 abstract 키워드를 사용하여 선언한다. 자바에서는 추상 클래스 내의 추상 메서드를 반드시 하위 클래스에서 구현해야 한다.

2. 다중 상속:

  • 파이썬: 파이썬은 다중 상속을 지원하며, 클래스가 여러 추상 클래스를 동시에 상속받을 수 있다. 이는 파이썬의 유연성을 나타낸다.
  • 자바: 자바는 단일 상속만을 지원한다. 즉, 하나의 클래스만을 상속받을 수 있다는 말이다. 다중 상속을 위해 인터페이스를 사용할 수 있지만, 인터페이스는 추상 메서드만을 포함하며 상태(멤버 변수)를 가질 수 없다.

3. 인터페이스:

  • 파이썬: 파이썬에서는 인터페이스를 별도로 선언할 필요가 없다. 추상 클래스에서 추상 메서드만을 포함하여 인터페이스와 유사한 역할을 할 수 있기 때문이다.
  • 자바: 자바에서는 인터페이스를 사용하여 추상 메서드를 선언할 수 있으며, 클래스는 인터페이스를 구현하기 위해 implements 키워드를 사용한다. 인터페이스는 다중 상속이 가능하다.

4. 객체 생성:

  • 파이썬: 파이썬에서는 추상 클래스의 객체를 직접 생성할 수 있다. 추상 클래스를 통해 객체를 생성하면 추상 메서드의 구현 여부와 관계없이 객체가 생성된다.
  • 자바: 자바에서는 추상 클래스의 객체를 직접 생성할 수 없다. 추상 클래스는 하위 클래스에서 상속받아 추상 메서드를 구현한 후에 하위 클래스의 객체를 생성해야 한다.

이러한 차이점으로 인해 파이썬과 자바에서의 추상 클래스의 사용 방식과 동작이 다르며, 다중 상속 및 인터페이스 사용의 유연성 측면에서 파이썬이 더 자유롭고 융통성이 있다. 자바에서는 강제적인 추상 메서드 구현과 단일 상속의 제약이 있지만, 안정성과 엄격한 규칙을 적용함으로써 코드의 신뢰성을 확보한다.

📎 python 코드

from abc import ABC, abstractmethod

# 추상 클래스 정의
class Shape(ABC):
    @abstractmethod
    def area(self):
        pass

# 추상 클래스를 상속받은 클래스
class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return 3.14 * self.radius * self.radius

# 객체 생성 및 메서드 호출
circle = Circle(5)
print("원의 면적:", circle.area())

📎 java 코드

// 추상 클래스 정의
abstract class Shape {
    // 추상 메서드 선언
    public abstract double area();
}

// 추상 클래스를 상속받은 클래스
class Circle extends Shape {
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    // 추상 메서드의 구현
    @Override
    public double area() {
        return 3.14 * radius * radius;
    }
}

public class Main {
    public static void main(String[] args) {
        // 객체 생성 및 메서드 호출
        Circle circle = new Circle(5);
        System.out.println("원의 면적: " + circle.area());
    }
}

0개의 댓글