SiliconValley_survivor

SiliconValley_survivor

OOD, Object Oriented Design 모델링 디자인 [2]

상속 vs 합성, “-a”로 OOD를 끝내는 법, 공생 관계 - A symbiotic relationship 에 대하여.

SiliconValley_survivor's avatar
SiliconValley_survivor
Jan 13, 2026
∙ Paid

Classes

클래스는 함수보다 한 단계 더 높은 수준의 논리적 추상화입니다. 클래스는 서로 관련된 함수들을 하나로 묶어줍니다. 예를 들어 LinkedList 클래스에는 addNode, searchNode, removeNode 같은 메서드들이 포함될 수 있습니다. 이러한 메서드들은 LinkedList 클래스를 사용하는 클라이언트가 해당 자료구조를 사용하기 위한 동작을 직접 구현하지 않아도, 단순한 인터페이스만으로 쉽게 사용할 수 있게 해줍니다. 따라서 모든 인스턴스가 동일한 메서드들을 사용할 수 있도록, 관련된 함수들을 클래스에 모아두는 것이 합리적입니다.

class SinglyLinkedListNode

    int value

    SinglyLinkedListNode next

class DoublyLinkedListNode

    int value

    DoublyLinkedListNode prev

    DoublyLinkedListNode next

class BinaryTreeNode

    int value

    BinaryTreeNode left

    BinaryTreeNode right

class QuadTreeNode

    int xCoord int yCoord

    QuadTreeNode topLeft

    QuadTreeNode topRight

    QuadTreeNode botLeft

    QuadTreeNode botRight

class Polygon int perimeter int area

    int topLeftXCoord

    int topLeftyCoord  

Polymorphism

다형성(Polymorphism)은 객체지향 프로그래밍 개념으로, 변수/함수/객체가 여러 형태를 가질 수 있는 능력을 말합니다. 다형성을 지원하는 언어에서는 같은 계층 구조(공통 부모 클래스를 상속받는 관계)에 속한 클래스 객체들이 같은 이름의 함수를 가질 수 있지만, 서로 다른 동작(behavior)을 하도록 구현할 수 있습니다.

다시 말해, 다형성은 언어가 클래스 변수를 그 클래스의 하위 클래스 타입으로도 선언할 수 있게 해주기 때문에 상속이 가능해집니다. 핵심은 그게 전부입니다.

예시로, Animal 클래스가 있고, Cow, Dog, Cat, Pig 가 Animal을 상속한다고 해봅시다.

Animal a = new Cow();
Animal b = new Dog();

다단계(여러 단계) 상속도 똑같이 동작합니다. 예를 들어 Chicken이 Animal을 상속하고, Hen과 Rooster가 Chicken을 상속한다면 아래와 같이 됩니다.

Animal c = new Hen();
Animal d = new Rooster();

다형성의 종류

1) 컴파일 타임(Compile-time) 다형성

  • 예: 메서드 오버로딩(Method overloading)

2) 런타임(Runtime) 다형성

  • 예: 메서드 오버라이딩(Method overriding)

이제 컴파일 타임 다형성과 런타임 다형성 구현을 살펴보겠습니다.

컴파일 타임 다형성 (메서드 오버로딩)

아래 예시에서는 Calculator 클래스에서 컴파일 타임 다형성의 한 형태인 메서드 오버로딩을 구현합니다. 서로 다른 매개변수 목록(parameter lists)을 가진 add 메서드를 여러 개 정의하는 방식입니다.

Python은 진짜 컴파일타임 오버로딩이 없음.
#include <iostream>
using namespace std;

class Calculator {
public:
    int add(int a, int b) {
        return a + b;
    }

    double add(double a, double b) {
        return a + b;
    }
};

int main() {
    Calculator calc;

    cout << calc.add(1, 2) << endl;       // int version
    cout << calc.add(1.2, 2.3) << endl;   // double version
}

런타임 다형성 (메서드 오버라이딩)

아래 예시에서는 Animal, Dog, Cat 클래스가 메서드 오버라이딩을 보여주며, 이는 런타임 다형성의 한 형태입니다. 참조(reference) 타입은 Animal이지만, 실제로 호출되는 메서드는 생성된 객체의 타입에 따라 결정됩니다.

Python 예시 (Overriding = Runtime Polymorphism)

class Animal:
    def speak(self):
        return "Animal sound"

class Dog(Animal):
    def speak(self):
        return "Woof"

class Cat(Animal):
    def speak(self):
        return "Meow"

def make_it_speak(animal: Animal):
    print(animal.speak())

make_it_speak(Dog())  # Woof
make_it_speak(Cat())  # Meow

다형성의 장점

  • 한 번 작성하고 테스트 및 적용한 코드와 클래스를 재사용하는 데 도움이 됩니다.

  • 하나의 변수 이름으로 여러 데이터 타입의 값을 저장할 수 있습니다(예: float, double, long, int 등).

  • 단순한 추상화들로부터 더 강력하고 복잡한 추상화를 조합하는 데 도움이 됩니다.

Inheritance

This post is for paid subscribers

Already a paid subscriber? Sign in
© 2026 실리콘밸리_생존자 · Privacy ∙ Terms ∙ Collection notice
Start your SubstackGet the app
Substack is the home for great culture