C#에서 메서드 오버로딩과 오버라이딩의 차이는?
_____A1: 메서드 오버로딩은 같은 클래스 안에서 동일한 이름을 가진 메서드를 여러 개 정의하는 것으로, 각 메서드는 매개변수의 타입, 개수, 순서가 달라야 합니다. 반환형만 다르고 매개변수가 같으면 오버로딩이 불가능합니다. 컴파일러가 호출 시점에 전달된 인자에 맞는 메서드를 선택합니다.
---
Q2: 메서드 오버라이딩(Method Overriding)이란 무엇인가요?
A2: 메서드 오버라이딩은 상속 관계에 있는 자식 클래스가 부모 클래스에 정의된 메서드를 재정의하는 것을 의미합니다. 부모 클래스의 메서드와 이름, 매개변수, 반환형이 동일해야 하며, `virtual` 키워드가 붙은 메서드를 자식 클래스에서 `override` 키워드를 사용해 구현합니다.
---
Q3: 오버로딩과 오버라이딩의 가장 큰 차이점은 무엇인가요?
A3:
- 오버로딩 은 같은 클래스 내에서 같은 이름의 메서드를 매개변수 시그니처를 다르게 하여 여러 개 정의하는 것 (컴파일 시 결정)
- 오버라이딩 은 상속받은 메서드를 자식 클래스에서 재정의하여 실행 시점에 해당 클래스의 메서드가 호출되도록 하는 것 (런타임 다형성)
---
Q4: 오버로딩은 상속과 관련 있나요?
A4: 아니요. 오버로딩은 한 클래스 내에서만 이루어지는 기능이며, 상속과 직접적인 관련이 없습니다.
---
Q5: 오버라이딩을 하기 위해서 무엇이 필요한가요?
A5: 부모 클래스의 메서드가 반드시 `virtual`, `abstract` 또는 `override`로 선언되어 있어야 하며, 자식 클래스에서는 `override` 키워드를 사용해 해당 메서드를 재정의해야 합니다.
---
Q6: 오버로딩할 때 반환형을 다르게 해도 되나요?
A6: 반환형만 다르고 매개변수 리스트가 같으면 오버로딩이 성립하지 않습니다. 매개변수 시그니처로 오버로딩을 구분하기 때문입니다.
---
Q7: 오버라이딩은 반환형을 바꿀 수 있나요?
A7: 부모 메서드와 동일하거나, 공변 반환형(covariant return type)이면 가능합니다(C 9.0 이상에서 지원). 이전 버전에서는 반환형이 반드시 동일해야 합니다.
Q8: 오버라이딩된 메서드를 호출하려면 어떻게 해야 하나요?
A8: 기본적으로 해당 객체의 실제 타입에 맞는 메서드가 호출됩니다. 부모 클래스 타입의 참조 변수라도 자식 객체를 참조하면 자식 클래스에서 오버라이딩한 메서드가 실행됩니다(런타임 다형성).
---
Q9: 예시를 간단히 보여줄 수 있나요?
A9:
```csharp
// 오버로딩 예
class Calculator
{
public int Add(int a, int b) => a + b;
public double Add(double a, double b) => a + b;
}
// 오버라이딩 예
class Animal
{
public virtual void Speak() => Console.WriteLine("Animal sound");
}
class Dog : Animal
{
public override void Speak() => Console.WriteLine("Bark");
}
```
---
Q10: 언제 오버로딩을 사용하고 언제 오버라이딩을 사용해야 하나요?
A10:
- 오버로딩 은 같은 개념의 기능을 다양한 매개변수로 수행할 때, 즉 메서드 시그니처를 달리해 사용자 편의성을 높이기 위해 사용합니다.
- 오버라이딩 은 상속받은 메서드의 동작 방식을 변경하거나 구체화하여 다형성을 구현할 때 사용합니다.
이 두 개념을 이해하는 것은 객체 지향 프로그래밍에서 매우 중요합니다.
아래에서 각각의 개념을 자세히 설명하겠습니다.
메서드 오버로딩 (Overloading) 메서드 오버로딩은 같은 이름의 메서드를 여러 개 정의하되, 매개변수의 수나 타입이 다르게 하는 것입니다.
즉, 동일한 메서드 이름을 사용하더라도 서로 다른 시그니처(매개변수의 타입과 개수)를 가지게 됩니다.
오버로딩은 주로 코드의 가독성을 높이고, 다양한 입력에 대해 같은 동작을 수행할 수 있도록 하기 위해 사용됩니다.
예시 ```csharp public class MathOperations { // 두 개의 정수를 더하는 메서드 public int Add(int a, int b) { return a + b; } // 세 개의 정수를 더하는 메서드 public int Add(int a, int b, int c) { return a + b + c; } // 두 개의 실수를 더하는 메서드 public double Add(double a, double b) { return a + b; } } ``` 위의 예시에서 `Add` 메서드는 정수 두 개, 정수 세 개, 그리고 실수 두 개를 더하는 세 가지 버전이 있습니다.
이처럼 메서드 오버로딩을 통해 같은 이름의 메서드를 다양한 방식으로 사용할 수 있습니다.
메서드 오버라이딩 (Overriding) 메서드 오버라이딩은 상속 관계에 있는 클래스에서 부모 클래스의 메서드를 자식 클래스에서 재정의하는 것입니다.
오버라이딩을 통해 자식 클래스는 부모 클래스의 기본 동작을 변경하거나 확장할 수 있습니다.
이때, 부모 클래스의 메서드는 `virtual` 키워드를 사용하여 정의되고, 자식 클래스에서는 `override` 키워드를 사용하여 해당 메서드를 재정의합니다.
예시 ```csharp public class Animal { public virtual void Speak() { Console.WriteLine("Animal speaks"); } } public class Dog : Animal { public override void Speak() { Console.WriteLine("Dog barks"); } } public class Cat : Animal { public override void Speak() { Console.WriteLine("Cat meows"); } } ``` 위의 예시에서 `Animal` 클래스는 `Speak`라는 메서드를 가지고 있으며, 이는 `virtual`로 정의되어 있습니다.
`Dog`와 `Cat` 클래스는 `Animal` 클래스를 상속받아 각각의 방식으로 `Speak` 메서드를 오버라이딩합니다.
이렇게 하면 `Animal` 타입의 변수로 `Dog` 또는 `Cat` 객체를 참조할 때, 해당 객체의 `Speak` 메서드가 호출됩니다.
주요 차이점 1. 목적 : - 오버로딩 : 같은 이름의 메서드를 여러 개 정의하여 다양한 매개변수 조합을 처리하기 위해 사용됩니다.
- 오버라이딩 : 부모 클래스의 메서드 동작을 자식 클래스에서 변경하기 위해 사용됩니다.
2. 정의 위치 : - 오버로딩 : 같은 클래스 내에서 메서드를 정의합니다.
- 오버라이딩 : 상속 관계에 있는 클래스 간에 이루어집니다.
3. 키워드 : - 오버로딩 : 특별한 키워드 없이 메서드를 정의합니다.
- 오버라이딩 : 부모 클래스의 메서드는 `virtual`, 자식 클래스의 메서드는 `override` 키워드를 사용합니다.
4. 시그니처 : - 오버로딩 : 메서드 이름은 같지만 매개변수의 수나 타입이 다릅니다.
- 오버라이딩 : 메서드 이름과 매개변수는 동일하지만, 구현 내용이 다릅니다.
결론 메서드 오버로딩과 오버라이딩은 C 의 객체 지향 프로그래밍에서 중요한 개념으로, 각각의 목적과 사용법이 다릅니다.
오버로딩은 코드의 유연성을 높이고 가독성을 향상시키는 데 도움을 주며, 오버라이딩은 상속을 통해 다형성을 구현하는 데 필수적입니다.
이 두 가지 개념을 잘 이해하고 활용하면 더 나은 객체 지향 프로그래밍을 할 수 있습니다.
작성자:
이윤서 [비회원]
| 작성일자: 1년 전
2024-09-09 08:38:54
조회수: 188 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 188 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.