glenn-syj / more-effective-java

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

[MEJ-005] 인터페이스의 다중 상속 문제 #117

Closed FickleBoBo closed 5 months ago

FickleBoBo commented 6 months ago

Based on: #103 by @clare-u

내용이 상당한 아이템이라고 생각했는데 정리를 잘해주셔서 복습하는 느낌으로 잘 읽었습니다. 자바에서는 다중 상속을 지원하지 않는 것과는 달리 C++에서는 다중 상속을 지원하는 것으로 보입니다. 하지만 다중 상속을 권장하는 것은 아니며 아주 제한적인 상황에서 사용하고 그마저도 반드시 다중 상속을 사용할 상황은 없어서 권장하지 않는 것으로 보입니다. 이에 자바에서는 굳이 코드만 복잡하게 할 수 있는 다중 상속을 사전에 차단하고 인터페이스를 통해 보완한 것으로도 생각됩니다.

인터페이스를 학습하며 메서드의 경우 같은 메서드가 두 인터페이스에 존재해도 구현부가 없으니 어떤 인터페이스의 메서드인지는 중요하지 않을 수 있고 이것이 상속받은 클래스에서 메서드를 구현해도 문제가 없는 이유로 생각됐으나 그럼 인터페이스의 변수는 어떨까 싶어 올려주신 코드를 조금 수정해서 테스트해봤습니다.

interface Person {
    String nation = "지구";
    public void gamun();
}

interface Father extends Person{
    String nation = "한국";
    @Override
    public void gamun();
}

interface Mother extends Person {
    String nation = "북한";
    @Override
    public void gamun();
}

public class Child implements Father, Mother {
    @Override
    public void gamun(){
        System.out.println("출신");
    }

    public static void main(String[] args){
        Child child = new Child();

        System.out.println("국적은 "+child.nation);
        child.gamun();
    }

}

인터페이스에 각각 nation을 추가한 코드인데 java: reference to nation is ambiguous both variable nation in item20.Father and variable nation in item20.Mother match라는 컴파일 에러가 발생했습니다. 코드가 논리적으로 맞다면 다중 상속에서 메서드에 대해 발생할 수 있는 문제가 변수에 대해서도 동일하게 발생한 것으로 생각됩니다. 자바에서 다중 상속을 지원했을 경우 메서드에 대해서도 비슷한 에러가 발생했지 않았을까 싶습니다. 심화 탐구 진행하시느라 고생많으셨습니다!!

https://www.tcpschool.com/cpp/cpp_inheritance_multiple#google_vignette

clare-u commented 6 months ago

변수에 대해서는 전혀 생각해보지 않았는데, 진행해주신 실험과 그걸로 유추되는 결론 모두 정말 흥미롭습니다. 항상 재밌는 예시 들어주셔서 이해에 큰 도움이 됩니다!