1. 오버로딩(Overloding)은
메소드의 이름은 같게, 매개변수 자료형은 다르게 합니다.
💡 오버로딩을 하는 이유
기능이 비슷한데 메소드 하나로 합치기 힘들 경우, 오버로딩을 해서 같은 이름으로 여러개의 메소드를 만들 수 있습니다.
1. 매개변수 개수에 따른 오버로딩
메서드의 매개변수 개수가 다르면 같은 이름의 메서드를 여러 개 정의할 수 있습니다.
아래 예시에서는 display 메서드를 오버로딩합니다
using System;
namespace MethodOverloadExample
{
class Program
{
// 매개변수가 하나인 메서드
void Display(int a)
{
Console.WriteLine("Arguments: " + a);
}
// 매개변수가 두 개인 메서드
void Display(int a, int b)
{
Console.WriteLine("Arguments: " + a + " and " + b);
}
static void Main(string[] args)
{
Program p1 = new Program();
p1.Display(100); // 하나의 매개변수를 받는 메서드 호출
p1.Display(100, 200); // 두 개의 매개변수를 받는 메서드 호출
Console.ReadLine();
}
}
}
2. 매개변수 데이터 타입에 따른 오버로딩
매개변수의 데이터 타입이 다르면 같은 이름의 메서드를 오버로딩할 수 있습니다.
아래 예시에서는 display 메서드를 다른 데이터 타입으로 오버로딩합니다:
using System;
namespace MethodOverloadExample
{
class Program
{
// int 타입 매개변수를 받는 메서드
void Display(int a)
{
Console.WriteLine("int type: " + a);
}
// string 타입 매개변수를 받는 메서드
void Display(string b)
{
Console.WriteLine("string type: " + b);
}
static void Main(string[] args)
{
Program p1 = new Program();
p1.Display(100); // int 타입 매개변수를 받는 메서드 호출
p1.Display("Programiz"); // string 타입 매개변수를 받는 메서드 호출
Console.ReadLine();
}
}
}
💡 주의해야 될 점 : 자료형이 같으면 안 된다
이름이 같아도 매개변수의 자료형이 달라야 합니다.
코드를 컴파일을 할 때 매개변수의 자료형을 구분이 되어야 합니다.
그 변수,함수에 있는 값를 가지고와서 값을 출력하는건데 똑같은 변수,함수이면 컴퓨터 구분을 못해서 안됩니다.
옳은 예시: 메소드명은 같지만 매개변수의 자료형이 달라서 가능합니다
public void AHuman(int face, int body){
}
public void AHuman(float face, float body){
}
잘못된 예시: 매개변수의 자료형 똑같으면 컴파일 할 때 컴퓨터가 구분을 못해서 오류가 납니다.
public void AHuman(int face, int body){
}
public void AHuman(int face, int body){
}
저는 오버로딩을 "동명이인은 있지만, 도블갱어는 절대로 없다"로 이해를 했습니다.
동명이인 예시를 들어보면
민수(1)과 이름이 똑같은 민수(2)가 있습니다.
민수(1)와 민수(2)는 이름은 똑같지만 성분(얼굴, 키 등)이 다릅니다.
하지만 도블갱어 예시를 들어보면
하지만 민수(1)과 민수(1)이 이름도 똑같고 성분(얼굴, 키 등)이 모든 것이 똑같다면 사람들이 헷갈려 할 것 입니다. 컴퓨터도 마찬가지 입니다.

2.오버라이딩(Overriding)
부모-자식 관계에 있는 클래스에서 부모 클래스에 있는 메소드를 자식 클래스에서 이름과 매개변수를 맞춰줘서 선언하여 재정의하는 것을 의미합니다.
💡 오버라이딩을 하는 이유
상속(오버라이딩)을 하는 이유는 세부적으로 나누기 위해서 한다.
using System;
//부모 클래스
class Animal
{
int
//virtual: 오버라이딩 원본
public virtual void MakeSound()
{
Console.WriteLine("Animal makes a sound");
}
}
//자식클래스
class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine("Dog barks");
}
}
//자식클래스
class Cat : Animal
{
public override void MakeSound()
{
Console.WriteLine("Cat meows");
}
}
//메인클래스
class Program
{
static void Main()
{
Animal animal1 = new Animal();
Animal animal2 = new Dog();
Animal animal3 = new Cat();
animal1.MakeSound(); // Animal makes a sound
animal2.MakeSound(); // Dog barks
animal3.MakeSound(); // Cat meows
}
}
오버라이딩은 "부모와 자식" 이 키워드만 알면 쉽게 생각할 수 있을 겁니다.

오버로딩(동명이인은 있으나, 도블갱어는 없다.) : 하나의 메소드에 여러 개의 구현을 과적 가능
오버라이딩(부모와 자식): 기반 클래스에서 물려받은 메소드를 파생 클래스에서 재정의