glenn-syj / more-effective-java

이펙티브 자바를 읽으며 자바를 더 효율적으로 공부합니다
4 stars 5 forks source link

[MEJ-005] 다른 객체지향 언어에서의 다중상속에 대해 #116

Closed undeadtimo closed 5 months ago

undeadtimo commented 6 months ago

based on: #103 by @clare-u


clare-u 님의 다중상속과 다이아몬드 문제에 대한 글, 흥미롭게 읽었습니다.

추상 클래스와 인터페이스의 상속에 대한 차이점을 명확하게 인지하지 못하고 있었으며,

클래스가 클래스를 상속하는 다중 상속은 불가능하지만, 인터페이스를 통한 다중 상속은 가능하다는 사실은 알고 있었지만, 그 이유는 알고 있지 못했었습니다.

그러나 clare-u 님께서 작성하신 글을 통해 추상 클래스와 인터페이스의 차이점을 명확하게 구분할 수 있게 되었고, 클래스가 클래스를 상속할 때의 다중 상속이 불가능한 이유인 '다이아몬드 문제'에 대해 알게 되었습니다.

특히, 모든 예제 코드들을 하나씩 구별하여 정리해주셔서 코드에 대한 이해가 수월하였습니다.

clare-u 님께서 설명해주신 다이아몬드 문제를 본 이후, C++에서는 어떤 방식으로 다중 상속을 가능케 하고 있을지 궁금증이 생겨 추가적으로 찾아보았습니다.

class Father
{
public:
    void 가문()
    {
        cout << "송가" << endl;
    }
};
class Mother
{
public:
    void 가문()
    {
        cout << "권가" << endl;
    }
};
class Child : public Father, public Mother
{
public:
    void ComplexFunc()
    {
                // 만일 Father 클래스의 가문 메서드를 사용하기 위해서는, 메서드 앞에 Father::를 붙여줘야 하고,
        Father::가문();

               // 반대로 Mother 클래스의 가문 메서드를 사용하기 위해서는 메서드 앞에 Mother:: 를 붙여줘야 합니다.
           Mother::가문();
    }
};

int main(void)
{
    Child changyong;
    changyong.ComplexFunc();
        // Fahter::가문(); 은 Father 클래스의 가문메서드를 호출하여, "송가"를 출력하고,
        // Mother::가문(); 은 Mother 클래스의 가문메서드를 호출하여, "권가"를 출력합니다.

    return 0;
}

c++ 에서는 이런식으로 메서드 앞에 어떤 상위 클래스의 메서드를 호출하는지 명시함으로써 다이아몬드 문제를 해결하고 있었습니다.

clare-u commented 6 months ago

다른 언어들에선 처리 방식이 약간씩 다르다는 점만 알고 있었는데, 실제로 C++의 예시 코드를 보니 흥미롭네요! 각 언어가 상속을 대하는 방식들이 참 달라 철학이 느껴집니다. 코드에서 어떤 클래스의 메소드를 상속받을 지 결정하는 부분은 얼핏 super. 가 생각나기도 하지만 아예 클래스명이 들어가니 신기하네요. 좋은 내용 공유 감사드립니다.

undeadtimo commented 6 months ago

저희가 Java에 대해 공부를 하고 있지만 가끔 다른 언어에 대한 정보도 같이 본다면 시야를 넓혀줄 것이라 생각하여,

다중상속에 대한 C++의 처리방식을 가져와보았는데 흥미롭게 봐주시니 제가 더 감사함을 느꼈습니다.