OOP 에서 상속, 다형성, 캡슐화 이 3가지가 키포인트다.
글쓴이는 C++보다 Java를 먼저 배웠는데,
C++를 학습하면서, Java, Python 다형성 구현 측면에서 차이점이 있어서 정리한다.
본 글은 클래스의 업캐스팅에 대해서 알고 있다고 가정한다.
Java
보통 Java에서는 base 클래스를 상속 받아서 여러 클래스들을 구현한다.
이때, derived 클래스에서 @override annotation을 사용하여 base 클래스의 method를 오버라이드한다.
그리고 업캐스팅을 하고 base 클래스 인스턴스의 method를 호출하면, 자동으로 derived 클래스의 method를 호출한다.
이러한 방식으로 Java에서는 다형성을 제공한다.
class Base {
void show() {
System.out.println("Base method");
}
}
class Derived extends Base {
@Override
void show() {
System.out.println("Derived method");
}
}
public class Main {
public static void main(String[] args) {
Base obj = new Derived(); // 업캐스팅
obj.show(); // Derived method (자동으로 Derived 클래스의 메서드 호출)
}
}
C++
한편, C++에서는 단순히 method를 재정의 한다고 하여 override가 되지 않는다.
업캐스팅을 하고 base 클래스 인스턴스의 method를 호출하면, base 클래스의 method를 호출한다.
C++에서는 다형성을 제공하기 위해 virtual 함수를 제공한다.
base 클래스에 virtual keyword를 지정한 method인 경우, 업캐스팅을 하고 base 클래스 인스턴스의 method를 호출하면 자동으로 런타임에 자식클래스의 method가 호출되도록 해준다.
#include <iostream>
using namespace std;
class Base {
public:
virtual void show() { // virtual 키워드 추가
cout << "Base method" << endl;
}
};
class Derived : public Base {
public:
void show() override { // C++11 이상에서는 override 키워드 사용 가능
cout << "Derived method" << endl;
}
};
int main() {
Base* obj = new Derived(); // 업캐스팅
obj->show(); // Derived method (virtual로 인해 런타임에 Derived의 메서드 호출됨)
delete obj;
}
Python
파이썬 같은 경우, 동적타이핑(dynamic typing)으로 별도의 키워드 없이 다형성이 자동으로 적용된다.
class Base:
def show(self):
print("Base method")
class Derived(Base):
def show(self):
print("Derived method")
obj = Derived() # Derived 클래스의 인스턴스 생성
obj.show() # 자동으로 Derived 클래스의 메서드 호출됨
다른 언어와 구분 점은 상속관계가 없더라도 다형성을 제공하는 duck typing이라는 것을 지원한다. 즉, 같은 메서드가 있으면 그냥 그 함수를 호출해버린다.
class Dog:
def speak(self):
return "Woof!"
class Cat:
def speak(self):
return "Meow!"
def make_sound(animal): # 특정 타입(Base 클래스)을 지정하지 않음
print(animal.speak()) # 같은 메서드 이름(speak)만 있으면 동작
dog = Dog()
cat = Cat()
make_sound(dog) # Woof!
make_sound(cat) # Meow!
'Development' 카테고리의 다른 글
LLVM 빌드 (0) | 2025.01.21 |
---|