Development

OOP 다형성

zeroone-kr 2025. 2. 8. 23:24

 

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