오버로딩 및 재정의


104

오버로딩과 오버라이드의 차이점은 무엇입니까?


2
@james : 적어도 Google을 사용해 보셨습니까 ??
Mitch Wheat

나는 당신이 이것을 얻지 못할 것이라고 생각합니다.
Jon B

james- 아마 내가 아주 바보 간단한 개념을 설명 할 수 없다는 생각하지

1
@james 내 생각에 당신은 용어를 모르고 이러한 개념을 직관했습니다. 나는 당신이 독학 한 것 같아요. 배우는 것이 아니라 이미 알고있는 내용을 강화하기 위해 초급 수준의 C # 책을 선택해야합니다. 그것은 무감각하지만 기술 인터뷰에서 엄청난 도움이 될 것입니다.
Michael Meadows

이 링크에서 더 많은 것을 읽을 수 있습니다 : intquesans.blogspot.com/2011/05/…

답변:


219

과부하

오버로딩은 동일한 범위에 이름은 같지만 서명이 다른 메서드가 여러 개있는 경우입니다.

//Overloading
public class test
{
    public void getStuff(int id)
    {}
    public void getStuff(string name)
    {}
}

재정의

재정의는 자식 클래스에서 메서드의 기능을 변경할 수있는 원칙입니다.

//Overriding
public class test
{
        public virtual void getStuff(int id)
        {
            //Get stuff default location
        }
}

public class test2 : test
{
        public override void getStuff(int id)
        {
            //base.getStuff(id);
            //or - Get stuff new location
        }
}

1
나는 ..Thanks @cgreeno이 대답 사랑
Ferrakkem Bhuiyan

1
@cgreeno 난 당신이 그리워 생각 void에 대한 getStufftest2
마흐디

2
기본 클래스 메서드가 가상으로 표시 되어야만 무시하고 그렇지 않으면 컴파일 오류가 발생합니다.
Alex Stephens

이건 오래되었을 지 몰라도 이것에 대해 여전히 질문이 있습니다. 오버로딩으로 인해 '하나'방법으로 더 많은 기능을 사용할 수 있습니까? 내가 할 수있는 것처럼 : getStuff(2, "Hello world!");아니면 내가 할 수 getStuff("Myname", "Mysurname", "Hello World!");있나? 누구든지 이것이 그것을하는 방법임을 확인할 수 있습니까?
Sj03rs

나는 Overriding 예제가 실제로 Overwriting이라고 생각하고, override는 슈퍼 클래스 메서드가 실수로 재정의를 받거나 두 경우 모두 재정의 또는 덮어 쓰기에서 new 키워드를 사용하여 수행하려는 경우 부모 p = new를 선언 할 때 행동이 다릅니다. 아이(); p.Method (); ... 어쩌면 내가 틀렸을 수도 있고 거의 같은 일을하는 또 다른 방법 일뿐입니다. 누구든지 나보다 더 잘 설명 할 수 있습니까?
Cristina Carrasco

35

오버로딩 및 재정의에 대한 간단한 정의

오버로딩 (컴파일 시간 다형성) :: 이름이 같고 매개 변수가 다른 함수

public class A
{
    public void print(int x, int y)
    {
        Console.WriteLine("Parent Method");
    }
}

public class B : A
{
    public void child()
    {
        Console.WriteLine("Child Method");
    }

    public void print(float x, float y)
    {
        Console.WriteLine("Overload child method");
    }
}

재정의 (런타임 다형성) :: 기본 클래스와 이름과 매개 변수가 같지만 동작이 다른 확장 클래스의 함수.

public class A
{
    public virtual void print()
    {
        Console.WriteLine("Parent Method");
    }
}

public class B : A
{
    public void child()
    {
        Console.WriteLine("Child Method");
    }

    public override void print()
    {
        Console.WriteLine("Overriding child method");
    }
}

대체 개념이 상위 클래스-하위 클래스 관계에 적용된다는 것을 추가하고 싶을 것입니다.
Freakyuser 2013

10

제가 배우는 동안 저에게 많은 의미가있는 예를 공유하고 싶습니다.

이것은 가상 메서드 또는 기본 클래스를 포함하지 않는 예제 일뿐입니다. 주요 아이디어에 대한 힌트를 제공합니다.

자동차 세탁기가 있고 "Wash"라는 기능이 있고 Car를 유형으로 수용한다고 가정 해 보겠습니다.

Car 입력을 받고 Car를 세척합니다.

public void Wash(Car anyCar){
       //wash the car
}

Wash () 함수를 오버로드합시다.

과부하 :

public void Wash(Truck anyTruck){
   //wash the Truck  
}

세차 기능은 이전에는 세차 만했지만 지금은 트럭 세차에도 과부하가 걸렸습니다.

  • 제공된 입력 객체가 Car이면 Wash (Car anyCar)를 실행합니다.
  • 제공된 입력 개체가 Truck이면 Wash (Truck anyTruck)를 ​​실행합니다.

Wash () 함수를 재정의합시다

재정의 :

public override void Wash(Car anyCar){
   //check if the car has already cleaned
   if(anyCar.Clean){ 
       //wax the car
   }
   else{
       //wash the car
       //dry the car
       //wax the car
   }     
}

세차 기능은 이제 차량이 이미 깨끗하고 다시 세차 할 필요가 없는지 확인하는 조건이 있습니다.

  • 차가 깨끗하면 왁스를 칠하십시오.

  • 깨끗하지 않은 경우 먼저 세차 한 다음 건조시킨 다음 왁스를 칠하십시오

.

따라서 새로운 기능을 추가하거나 완전히 다른 작업을 수행하여 기능을 재정의했습니다.


1
이것이 답이 틀림 없다. Voted +
Jack


4

Michael이 말했듯이 :

  • 오버로딩 = 여러 메서드 서명, 동일한 메서드 이름
  • 재정의 = 동일한 메서드 서명 (가상으로 선언 됨), 하위 클래스에서 구현 됨

  • Shadowing = DerivedClass로 취급하면 파생 된 메서드를 사용하고 BaseClass로하면 기본 메서드를 사용합니다.

3

이름은 같지만 매개 변수가 다른 메서드 / 생성자를 두 개 이상 갖는 것을 오버로딩이라고합니다. 이것은 컴파일 타임 이벤트입니다.

Class Addition 
{
   int add(int a, int b) 
   {
     return a+b;
   }
   int add(int a, int b, int c)
   {
     return a+b+c;
   }

   public static main (String[] args) 
   {
     Addition addNum = new Addition();
     System.out.println(addNum.add(1,2));
     System.out.println(addNum.add(1,2,3));
   }
}

O / p :

3
6

재정의는 런타임 이벤트입니다. 즉, 코드에 따라 런타임에 출력이 변경됩니다.

class Car
{
    public int topSpeed() 
    {
        return 200;
    }
}
class Ferrari extends Car
{
    public int topSpeed()
    {
        return 400;
    }
    public static void main(String args[])
    {
        Car car = new Ferrari();
        int num= car.topSpeed();
        System.out.println("Top speed for this car is: "+num);
    }
}

두 클래스 모두 topSpeed ​​()에 공통 메소드가 있습니다. 페라리를 인스턴스화했기 때문에 다른 결과를 얻었습니다.

O / p :

Top speed for this car is: 400

2

C #에서는 키워드 재정의 없이 숨겨진 재정의 와 같은 Java가 없습니다. 메서드 에 대한 ! 다음 C # 구현을 참조하십시오.

대체 없는 변형 1 : 결과는 200입니다.

    class Car {
        public int topSpeed() {
            return 200;
        }
    }

    class Ferrari : Car {
        public int topSpeed(){
                return 400;
        }
    }

    static void Main(string[] args){
        Car car = new Ferrari();
        int num= car.topSpeed();
        Console.WriteLine("Top speed for this car is: "+num);
        Console.ReadLine();
    }

대체 키워드가있는 변형 2 : 결과는 400입니다.

    class Car {
        public virtual int topSpeed() {
            return 200;
        }
    }

    class Ferrari : Car {
        public override int topSpeed(){
                return 400;
        }
    }

    static void Main(string[] args){
        Car car = new Ferrari();
        int num= car.topSpeed();
        Console.WriteLine("Top speed for this car is: "+num);
        Console.ReadLine();
    }

Car 클래스의 키워드 virtual 은 Java의 final 과 반대이며 final이 아님을 의미 합니다. Car가 추상적 인 경우 재정의하거나 구현할 수 있습니다.


1

shadowing = 파생 클래스에서 두 가지 정의를 유지하고 기본 클래스 정의를 투영하기 위해 파생 클래스 정의를 shadowes (숨기기)하고 그 반대의 경우도 마찬가지입니다.


1

추가 할 또 다른 요점.

동일한 이름으로 둘 이상의 메서드를 오버로딩합니다 . 동일하거나 다른 반환 유형. 매개 변수가 다르거 나 매개 변수 유형이 다릅니다. 동일한 클래스 또는 파생 클래스에서.

int Add (int num1, int num2) int Add (int num1, int num2, int num3) double Add (int num1, int num2) double Add (double num1, double num2)

동일한 클래스 또는 파생 클래스에서 가능할 수 있습니다. 일반적으로 같은 클래스를 선호합니다. 예를 들어 Console.WriteLine ()에는 19 개의 오버로드 된 메서드가 있습니다.

클래스 생성자, 메서드를 오버로드 할 수 있습니다.

컴파일 시간 (정적 / 초기 바인딩) 다형성으로 간주 할 수 있습니다.

================================================ ================================================ =

동일한 클래스에서 재정의 할 수 없습니다. 클래스 메서드, 속성, 인덱서, 이벤트를 재정의 할 수 있습니다.

재정의 된 기본 메서드는 가상, 추상 또는 재정의와 같은 몇 가지 제한 사항이 있습니다. new, static 또는 virtual modifier를 사용하여 재정의 방법을 수정할 수 없습니다.

런타임 (동적 / 지연 바인딩) 다형성으로 간주 할 수 있습니다.

버전 관리에 대한 도움말 http://msdn.microsoft.com/en-us/library/6fawty39.aspx

================================================ ================================================ =

유용한 링크

http://msdn.microsoft.com/en-us/library/ms173152.aspx 컴파일 시간 다형성 대 런타임 다형성


필요한 세부 사항을 갖춘 좋은 것.
user3885927

1

오버로딩 은 정적 다형성의 일부이며 이름은 같지만 서명이 다른 다른 메서드를 구현하는 데 사용됩니다. 재정의 는 불완전한 메서드를 완료하는 데 사용됩니다. 제 생각에는이 두 개념 사이에 비교가 없다고 생각합니다. 유일한 점은 둘 다 끝 났던 동일한 어휘와 함께 온다는 것입니다.


캡틴 : 메서드 오버로드는 동일한 이름을 가진 다른 메서드의 여러 서명을 제공합니다. 재정의하면 상속 된 멤버가 클래스 나 인터페이스에서 숨겨집니다. 멀리 날아
SparK 16.

1
@SparK 재정의는 구성원을 숨기지 않습니다. 당신은 할 수 있습니다 중 하나를 오버라이드 (override) 또는 상속 된 멤버를 숨 깁니다. 두 가지는 상호 배타적 인 옵션입니다.
Servy

@Servy, 잘못된 단어 선택, "대체"를 의미했습니다.
SparK

0

메서드 오버로딩과 메서드 재정의는 완전히 다른 두 가지 개념입니다. 메서드 오버로딩은 메서드 이름이 같지만 서명이 다릅니다. 메서드 재정의는 파생 클래스에서 기본 클래스 메서드의 기본 구현을 변경합니다. 아래에서 이러한 개념을 설명하는 2 개의 훌륭한 비디오 자습서를 찾을 수 있습니다.

Vs 숨김을 재정의하는 방법

메서드 오버로딩


0

오버로딩은 이름이 같지만 매개 변수가 다른 동일한 시그니처 또는 메서드를 갖고 재정의하는 개념입니다. 우리는 다른 매개 변수를 가진 동일한 이름의 메서드가 상속을 가지고 있음을 재정의라고합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.