TIL(2024,07,05)기술 면접 대비

김보근·2024년 7월 5일

Unity

목록 보기
34/113

기술 면접 대비

using System;

// 상위 클래스 A
public class A
{
    public virtual void Display()
    {
        Console.WriteLine("Class A Display");
    }
}

// 클래스 B는 클래스 A를 상속받음
public class B : A
{
    public override void Display()
    {
        Console.WriteLine("Class B Display");
    }
}

// 클래스 C는 클래스 A를 상속받음
public class C : A
{
    public override void Display()
    {
        Console.WriteLine("Class C Display");
    }
}

1. 위와 같은 코드에서, 다음과 같이 다중 상속을 하는 것이 가능할까요? 가능/불가능하다면 이유는 무엇일까요?

public class D : B, C
{
    
}

2. 만약 C#에서 다중 상속이 지원되었다면, 클래스 D는 어떤 문제에 직면하게 될까요?

답변

  1. C#에서 다중 상속을 지원하지 않는 이유는 다이아몬드 문제(diamond problem)와 같은 복잡성을 피하기 위해서입니다. 다이아몬드 문제는 다음과 같이 설명할 수 있습니다:

클래스 A를 상속받은 클래스 B와 C가 있습니다.
클래스 D가 B와 C를 모두 상속받으려고 합니다.
이때, 클래스 D에서 A 클래스의 메서드인 Display를 호출하려고 하면 어떤 Display 메서드를 호출해야 할지 모호해집니다. B 클래스의 Display를 호출해야 하는지, C 클래스의 Display를 호출해야 하는지 결정하기 어려워지는 문제가 발생합니다. 이러한 상황을 다이아몬드 문제라고 합니다.

2.클래스 D에서 Display 메서드를 호출할 때, B 클래스의 Display 메서드를 호출해야 하는지, C 클래스의 Display 메서드를 호출해야 하는지 모호해집니다. 이로 인해 코드의 일관성을 유지하기 어렵고, 디버깅 및 유지 보수가 복잡해질 수 있습니다.

public class D : B, C
{
    public override void Display()
    {
        // 여기서 어떤 Display 메서드를 호출해야 할까요?
        // B.Display() 또는 C.Display() ?
        base.Display(); // 모호함이 발생합니다.
    }
}

설명 문제

  1. 클래스를 다른 클래스로 상속하기 위한 방법은 무엇인가요?
  2. 클래스 상속에서 다이아몬드 문제(diamond problem)가 발생하는 이유와 이를 해결하는 방법에 대해 설명해주세요.
  3. 인터페이스란 무엇인가요?
  4. 인터페이스와 추상클래스의 차이는 무엇인가요?

답변

public class A
{
    // 클래스 A의 멤버들
}

public class B : A
{
    // 클래스 B의 멤버들
}

위 코드에서 클래스 B는 클래스 A를 상속받고 있습니다. 이로 인해 클래스 B는 클래스 A의 모든 멤버들을 상속받아 사용할 수 있습니다.

  1. 다이아몬드 문제는 다중 상속을 사용했을 때 발생하는 문제로, 두 개의 클래스가 동일한 기본 클래스를 상속받고, 또 다른 클래스가 이 두 클래스를 상속받으려고 할 때 발생합니다.C#에서는 이러한 다이아몬드 문제를 피하기 위해 다중 상속을 지원하지 않습니다. 대신 인터페이스를 사용하여 다중 구현을 지원합니다.

  2. 인터페이스는 클래스나 구조체가 구현해야 하는 메서드, 속성, 이벤트, 인덱서를 정의한 것입니다. 인터페이스 자체는 구현을 가지지 않으며, 오직 멤버들의 서명만을 포함합니다.

  3. 인터페이스: 다중 상속을 지원합니다. 하나의 클래스나 구조체는 여러 개의 인터페이스를 구현할 수 있습니다.

추상 클래스: 단일 상속만 지원합니다. 하나의 클래스는 단 하나의 추상 클래스를 상속받을 수 있습니다.

인터페이스: 객체가 어떤 기능을 수행하는지 정의합니다. 주로 행위(behavior)를 정의하기 위해 사용됩니다.

추상 클래스: 객체의 공통된 특성을 정의합니다. 주로 객체의 상태(state)와 행위를 모두 정의하기 위해 사용됩니다.

profile
게임개발자꿈나무

0개의 댓글