추상은 복잡한 현실 세계를 단순화하여 모델링하는 프로세스를 나타낸다. 추상은 객체 지향 프로그래밍에서 클래스와 메서드를 정의하는 과정에서 중요한 역할을 한다. 추상 클래스와 추상 메서드를 사용하여 공통의 특성과 동작을 모델링하며, 이를 기반으로 구체적인 클래스를 정의한다.
추상 클래스 : 추상 클래스는 하나 이상의 추상 메서드를 포함하며, 직접 인스턴스화될 수 없다. 추상 클래스는 공통의 특성을 정의하고 하위 클래스에서 이러한 특성을 구체화하는 데 사용된다.
추상 메서드 : 추상 메서드는 메서드의 시그니처만 정의하고 구현 내용은 포함하지 않는 메서드이다. 추상 메서드는 하위 클래스에서 반드시 재정의되어야 한다.
다형성은 여러 형태를 가질 수 있는 더 일반적인 개념으로, 객체 지향 프로그래밍에서 여러 클래스가 공통 인터페이스를 구현하는 데 사용된다. 다형성은 동일한 인터페이스를 사용하여 여러 객체 유형을 다룰 수 있도록 하며, 코드의 유연성을 높이고 재사용성을 증가시킨다.
다형성은 메서드 호출과 객체의 사용에서 다양한 클래스의 객체를 처리할 수 있도록 한다. 동일한 메서드 이름을 사용하여 다른 클래스의 객체에 대해 다양한 동작을 수행할 수 있다.
다형성은 상속, 인터페이스, 추상 클래스 등을 통해 구현된다. 서로 다른 클래스가 동일한 인터페이스를 구현하거나 상속을 받으면, 다형성을 활용하여 이러한 객체를 일반적인 방식으로 다룰 수 있다.
추상과 다형성은 객체 지향 프로그래밍의 핵심 개념으로, 코드의 모델링, 유연성, 재사용성을 향상시키는 데 중요한 역할을 한다. 다형성은 코드를 더 추상적으로 만들어 복잡성을 관리하고, 새로운 클래스를 쉽게 추가하고 확장할 수 있는 방법을 제공한다.
1. 선언 방법:
abc
(Abstract Base Classes) 모듈을 사용하여 추상 메서드를 선언한다. abc
모듈을 사용하지 않고도 추상 클래스를 만들 수는 있지만, 명시적으로 추상 메서드를 정의하고 해당 메서드를 호출해야 한다. 추상클래스 내의 일반 메소드의 경우에는 오버라이딩이 선택이다.abstract
키워드를 사용하여 클래스를 추상 클래스로 지정하고, 추상 메서드는 abstract
키워드를 사용하여 선언한다. 자바에서는 추상 클래스 내의 추상 메서드를 반드시 하위 클래스에서 구현해야 한다.2. 다중 상속:
3. 인터페이스:
implements
키워드를 사용한다. 인터페이스는 다중 상속이 가능하다.4. 객체 생성:
이러한 차이점으로 인해 파이썬과 자바에서의 추상 클래스의 사용 방식과 동작이 다르며, 다중 상속 및 인터페이스 사용의 유연성 측면에서 파이썬이 더 자유롭고 융통성이 있다. 자바에서는 강제적인 추상 메서드 구현과 단일 상속의 제약이 있지만, 안정성과 엄격한 규칙을 적용함으로써 코드의 신뢰성을 확보한다.
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())
// 추상 클래스 정의
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());
}
}