C#에서 상속은 어떻게 구현하나요?
_____A1: 상속은 기존 클래스(부모 클래스, 기본 클래스)의 멤버(필드, 속성, 메서드)를 새로운 클래스(자식 클래스, 파생 클래스)가 물려받아 재사용하고 확장하는 객체지향 프로그래밍 개념입니다.
---
Q2: C 에서 상속은 어떻게 선언하나요?
A2: 파생 클래스의 선언 시 콜론(:) 뒤에 기본 클래스 이름을 명시하여 상속을 구현합니다.
예:
```csharp
class BaseClass
{
public void BaseMethod() { }
}
class DerivedClass : BaseClass
{
public void DerivedMethod() { }
}
```
---
Q3: C 에서 다중 상속이 가능한가요?
A3: C 은 클래스 간 다중 상속을 지원하지 않습니다. 한 클래스는 하나의 기본 클래스만 상속할 수 있습니다. 하지만 여러 인터페이스는 다중으로 구현할 수 있습니다.
---
Q4: 기본 클래스의 생성자는 자동으로 호출되나요?
A4: 네, 파생 클래스의 생성자에서 명시적으로 다른 생성자를 호출하지 않으면 기본 클래스의 기본 생성자가 자동으로 호출됩니다.
---
Q5: 기본 클래스의 메서드를 파생 클래스에서 재정의하려면 어떻게 해야 하나요?
A5: 기본 클래스에서 메서드를 `virtual`로 정의하고, 파생 클래스에서 `override` 키워드를 사용하여 재정의할 수 있습니다.
예:
```csharp
class BaseClass
{
public virtual void Show()
{
Console.WriteLine("Base Show");
}
class DerivedClass : BaseClass
{
public override void Show()
{
Console.WriteLine("Derived Show");
}
}
```
---
Q6: 기본 클래스의 메서드를 숨기려면 어떻게 하나요?
A6: 파생 클래스에서 기본 클래스의 메서드와 같은 이름의 메서드를 새로 정의하고 `new` 키워드를 사용하면 숨길 수 있습니다. 이 경우 기본 클래스 타입으로 호출 시 기본 클래스의 메서드가 호출됩니다.
---
Q7: 어떤 멤버들이 상속되나요?
A7: `public`과 `protected` 멤버가 상속됩니다. `private` 멤버는 직접 상속되지 않지만, 간접적으로 접근 가능할 수 있습니다.
---
Q8: 상속을 사용할 때 주의할 점은 무엇인가요?
A8:
- 생성자 호출 순서(기본 클래스 생성자 먼저 호출)를 이해해야 합니다.
- 기본 클래스의 `virtual`과 `override` 개념을 숙지해 메서드 재정의를 적절히 사용해야 합니다.
- 불필요한 상속은 코드 복잡성을 증가시킬 수 있으므로 적절히 설계해야 합니다.
---
요약:
- 상속 선언: `class Derived : Base`
- 한 클래스는 하나의 기본 클래스만 상속 가능
- 기본 클래스 메서드 재정의 시 `virtual` / `override`
- 생성자는 기본 클래스부터 순서대로 호출
- `new` 키워드로 메서드 숨기기 가능
- `public`과 `protected` 멤버 상속됨
이것이 C 에서 상속을 구현하는 기본적인 방법과 주의사항입니다.
상속을 통해 코드의 재사용성을 높이고, 유지보수를 용이하게 하며, 계층적인 구조를 통해 더 나은 설계를 할 수 있습니다.
기본적인 상속 구현 C 에서 상속을 구현하기 위해서는 `:` 기호를 사용하여 자식 클래스가 부모 클래스를 상속받도록 선언합니다.
다음은 기본적인 상속의 예입니다.
```csharp // 부모 클래스 public class Animal { public void Eat() { Console.WriteLine("Eating..."); } } // 자식 클래스 public class Dog : Animal { public void Bark() { Console.WriteLine("Barking..."); } } ``` 위의 예제에서 `Animal` 클래스는 기본적인 동물의 속성을 정의하고, `Dog` 클래스는 `Animal` 클래스를 상속받아 `Eat` 메서드를 사용할 수 있습니다.
`Dog` 클래스는 추가적으로 `Bark` 메서드를 정의하고 있습니다.
생성자와 상속 부모 클래스의 생성자는 자식 클래스에서 호출할 수 있습니다.
자식 클래스의 생성자에서 `base` 키워드를 사용하여 부모 클래스의 생성자를 호출할 수 있습니다.
```csharp public class Animal { public Animal() { Console.WriteLine("Animal created"); } } public class Dog : Animal { public Dog() : base() // 부모 클래스의 생성자 호출 { Console.WriteLine("Dog created"); } } ``` 위의 코드에서 `Dog` 클래스의 생성자는 `Animal` 클래스의 생성자를 호출하여 "Animal created" 메시지를 출력한 후 "Dog created" 메시지를 출력합니다.
메서드 오버라이딩 C 에서는 부모 클래스의 메서드를 자식 클래스에서 재정의할 수 있습니다.
이를 위해 부모 클래스의 메서드에 `virtual` 키워드를 사용하고, 자식 클래스에서는 `override` 키워드를 사용하여 메서드를 재정의합니다.
```csharp public class Animal { public virtual void Speak() { Console.WriteLine("Animal speaks"); } } public class Dog : Animal { public override void Speak() { Console.WriteLine("Woof!"); } } ``` 위의 예제에서 `Animal` 클래스의 `Speak` 메서드는 가상 메서드로 정의되어 있으며, `Dog` 클래스에서 이를 재정의하여 개의 소리를 출력하도록 변경했습니다.
추상 클래스와 인터페이스 C 에서는 추상 클래스와 인터페이스를 통해 상속을 더욱 유연하게 사용할 수 있습니다.
추상 클래스는 인스턴스를 생성할 수 없으며, 자식 클래스에서 반드시 구현해야 하는 추상 메서드를 포함할 수 있습니다.
```csharp public abstract class Animal { public abstract void Speak(); // 추상 메서드 } public class Dog : Animal { public override void Speak() { Console.WriteLine("Woof!"); } } ``` 인터페이스는 클래스가 구현해야 하는 메서드의 집합을 정의합니다.
클래스는 여러 인터페이스를 구현할 수 있습니다.
```csharp public interface IAnimal { void Speak(); } public class Cat : IAnimal { public void Speak() { Console.WriteLine("Meow!"); } } ``` 다중 상속 C 은 클래스에 대한 다중 상속을 지원하지 않지만, 인터페이스를 통해 다중 상속을 구현할 수 있습니다.
하나의 클래스가 여러 개의 인터페이스를 구현할 수 있으므로, 다양한 기능을 조합할 수 있습니다.
```csharp public interface IFlyable { void Fly(); } public interface ISwimmable { void Swim(); } public class Duck : IFlyable, ISwimmable { public void Fly() { Console.WriteLine("Duck is flying"); } public void Swim() { Console.WriteLine("Duck is swimming"); } } ``` 결론 C 에서 상속은 코드의 재사용성과 유지보수성을 높이는 중요한 기능입니다.
기본적인 상속, 생성자 호출, 메서드 오버라이딩, 추상 클래스 및 인터페이스의 개념을 이해하고 활용함으로써, 더 나은 객체 지향 프로그래밍을 할 수 있습니다.
상속을 적절히 사용하면 코드의 구조를 명확하게 하고, 프로그램의 확장성을 높일 수 있습니다.
작성자:
김지성 [비회원]
| 작성일자: 1년 전
2024-09-09 08:39:11
조회수: 141 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 141 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.