본문 바로가기
Unity/c# 공부

오버로딩과 오버라이딩의 차이점

by _딩동 2025. 2. 22.

오버로딩❓

같은 이름의 *메서드를 여러 개 정의할 수 있는 기능
단, *매개변수의 개수나 타입이 다르게 설정되어 있어야 합니다.

1️⃣ 메서드 이름은 같아야 합니다
2️⃣ 매개변수 개수, 타입, 순서가 달라야 합니다
3️⃣ 반환 타입은 오버로딩 조건에 영향을 주지 않습니다

 

*메서드(멤버 함수) : 처리방법을 이야기하며, 클래스 내부에 정의되어 있는 클래스의 *인스턴스와 관련된 동작을 정의한다. 

*매개변수(파라미터) : 함수에 투입되는 변수

*인스턴스 : 어떠한 상황이나 행동 등 특정한 형태로 만드는 것  ex) GameObject Char = new GameObject();

 

 

 

사용이유

- 코드의 가독성을 높임 : 같은 의미의 메서드를 여러개 정의할 필요없이, 같은 이름으로 사용가능

- 유연성 증가 : 다양한 타입의 입력을 처리할 수 있음

- 객체지향 설계 원칙에 적합 : 같은 기능을 수행하는 메서드를 일관성 있게 유지

using System;

class Addprogram{
	//정수를 더하는 오버로딩 함수
    static int Add(int a, int b){
    	return a+b;
    }
    
    //실수를 더하는 오버로딩 함수
    static int Add(double a, double b){
    	return a+b;
    }
    
    //3개의 정수를 더하는 오버로딩 함수
    static int Add(int a, int b, int c){
    	return a+b+c;
    }
    
   
    static void Main(){
    	Console.WriteLine(Add(1, 2));		// 3 (int형 버전 실행)
        Console.WriteLine(Add(1.4, 3.6));	// 5 (double형 버전 실행)
        Console.WriteLine(Add(1, 2, 3));	// 6 (3개 정수 버전 실행)
        
        //오버로딩 불가능
        Console.WriteLine(Add(1.0f,2.0f));	// int,double 둘다 되기때문에 컴파일에러
        Add(null);				// 어떤 메서드를 호출할지 모호함 Add((int)null) 가능
    }
}

 

 


 

오버라이딩❓

부모 클래스의 메서드를 자식 클래스에서 재정의 하는 기능이기에 상속이 필수입니다.
메서드 이름, 매개변수, 반환 타입이 동일해야 합니다.

1️⃣ 부모 클래스의 메서드는 virual 또는 abstract 키워드를 사용
2️⃣ 자식 클래스에서는 override 키워드로 재정의
3️⃣ 부모 메서드의 동작을 유지하려면 base.method() 사용 가능
4️⃣ 오버라이딩을 막으려면 sealed 사용

 

 

사용이유

- 코드의 확장성과 재사용성 증가

using System;

class Animal{
	public virtual void Speak(){	// 부모 클래스에서 virtual 메서드 선언
    	Console.WriteLine("동물이 내는 소리");
    }
}

class Dog : Animal{
	public override void Speak(){	// 자식 클래스에서 override 메서드 선언
    	Console.WriteLine("왈왈");
    }
}

class Program{
	static void Main(){
    	Animal myAnimal = new Animal();
        myAnimal.Speak();		// 출력 : 동물이 내는 소리
        
        Animal myDog = new Dog();
        myDog.Speak();			// 출력 : 왈왈
    }
}


// abstract로 오버라이딩 하는 경우
abstract class Animal{			// 추상 클래스(인스턴스 생성 불가능)
	public abstract void Speak();	// 추상 메서드(구현x)
}

class Dog : Animal{
	public override void Speak(){	// 반드시 오버라이딩 해야합니다
    	Console.WriteLine("왈왈");
    }
}

class Cat : Animal{
	public override void Speak(){
    	Console.WriteLine("야옹");
    }
}

class Program{
	static void Main(){
    	Animal myDog = new Dog();
        myDog.Speak();			// 출력 : 왈왈
        
        Animal myCat = new Cat();
        myCat.Speak();			// 출력 : 야옹
    }
}

 

 


✅최종 : 오버로딩 vs 오버라이딩 차이

개념 오버로딩 (Overloading) 오버라이딩 (Overriding)
정의 같은 이름의 메서드를 매개변수 다르게 정의 부모 클래스의 메서드를 자식 클래스에서 재정의
조건 매개변수 개수/타입/순서가 달라야 함 부모 클래스와 메서드 이름, 매개변수, 반환 타입 동일
적용 위치 같은 클래스 내에서만 사용 가능 상속 관계에서 사용됨
override 키워드 필요함
접근 제어자 동일 or 다르게 설정 가능 부모 클래스 메서드보다 더 좁게 설정할 수 없음
(ex. 부모 public인데 자식 private 불가능)

 

 

긴 글 읽어주셔서 감사합니다
도움이 되셨다면 공감 & 댓글 응원 부탁드립니다