본문 바로가기
컴퓨터/C#

[C#] 하이딩, 오버라이딩, 오버로딩 차이점 - hiding, overriding, overloading difference

by HanJoohyun 2018. 6. 10.
반응형

 

 


안녕하세요 한주현 입니다

여러분들 잘 지내시나요? 
저는 요새 생각하는 기능들이 들어있고, 생각하는 대로 척척 잘 만들어 주는 C#의 매력에 빠져있습니다 ㅎㅎ

오늘은 C# 의 객체지향에서

하이딩(hiding), 오버라이딩(overriding), 오버로딩(overloading) 에 대해서

알아보겠습니다.





준비물


Visual Studio




1. 개략적 설명


말도 비슷하고 심지어 기능도 비슷(?) 한 하이딩, 오버라이딩, 오버로딩..


오늘 정리해보겠습니다!!


우선 세 개념을 간단하게 비교해보고 코드와 실행 결과를 보면서 마무리 하죠!



하이딩 (hiding)


자식의 멤버 (변수, 메서드) 와 부모의 멤버간의 서로 메서드를 가리는 것을 의미합니다.


new keyword 사용



오버라이딩 (overriding)


부모에서 정의된 멤버 메서드를 자식에서 재 정의하는 것을 의미합니다.


하이딩과 다르게 메서드만 오버라이딩 가능합니다.


virtual, override keyword 사용



오버로딩 (overloading)


이름은 같은데 매개변수 (parameter) 가 다른 메서드를 만드는 것을 의미합니다.




- 뱀뱀이 특별 출현




사실 이게,, 말로만 보면 잘 모릅니다..


코드를 봐야 알 수 있습니다 ㅎㅎ


아래의 코드에서 뵙죠 :)





2. 하이딩 (hiding)

자식의 멤버 (변수, 메서드) 와 부모의 멤버간의 서로 메서드를 가리는 것을 의미합니다.

new keyword를 사용합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
using System;
 
namespace Hide
{
    class Parent
    {
        public int var = 1515;
        public void Method()
        {
            Console.WriteLine("Parent Method");
        }
    }
    class Child : Parent
    {
        public new string var = "haha";
        // Hide variable with another type.
 
        // When new keyword isn't used, following warning message will show up.
        //public void Method()
        // 'Child.Method()' hides inherited member 'Parent.Method()'. Use the new keyword if hiding was intended.
        
        public new void Method()
        {
            Console.WriteLine("Child Method");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Child child = new Child();
            child.Method(); // Child Method
            ((Parent)child).Method(); // Parent Method
        }
    }
}
 
cs



자식 클래스 Child 에서 부모에서 정의된 이름과 같은 메서드 명인 Method 가 정의되면서

부모 메서드를 가리게 (hide) 되었습니다.

Child 객체 child 를 만들고 메서드를 실행하면

Child Method 라고 나옵니다.

child 객체를 Parent 로 형변환 (type cast)을 하며 메서드를 호출하면 어떻게 될까요?

부모의 메서드가 나오게 됩니다 ㅎㅎ

new 라는 키워드를 자식 메서드에서 사용해 주시면 되는데요,

사실 new 를 쓰지 않아도 부모 메서드와 자식 메서드의 이름이 겹치면 자동으로 하이딩이 됩니다만, new 를 써주세요 ㅎㅎ


아래의 오버라이딩 (overriding) 과 구분점을 두기 위해 new 라는 keyword 를 기억 해주시고 아래 내용을 봐주세요 :)


참고로 Java 에서는 하이딩이란 기능이 없습니다,

즉, Hiding 이 없더라도 프로그래밍을 하는데 지장이 없습니다 ㅋㅋ..

그럼 도대체 왜 만들었냐 ;; 하이딩은 가려진 부모의 메서드를 사용하고자 할 때 구현하는 기능입니다 ㅎㅎ;;




3. 오버라이딩 (overriding)

부모에서 정의된 멤버 메서드를 자식에서 재 정의하는 것을 의미합니다.


하이딩과 다르게 메서드만 오버라이딩 가능합니다.


virtual, override keyword 사용합니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using System;
 
namespace Override
{
    class Parent
    {
        public virtual void Method()
        {
            Console.WriteLine("Parent Method");
        }
    }
    class Child : Parent
    {
        public override void Method()
        {
            Console.WriteLine("Child Method");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Child child = new Child();
            child.Method(); // Child Method
            ((Parent)child).Method(); // Child Method <- Parent Method has been overridden.
        }
    }
}
 
cs


부모 클래스에서 정의된 메서드명과 동일하게 자식 클래스에서 정의하였습니다.

하이딩과 다른점은 부모메서드에 virtual 을 자식메서드에 override 이라는 keyword를 사용하였습니다.


뭔가 다르게 썼으니 다른점이 있을텐데요,

실행해보면 결과가 다르게 나옵니다.

Child 클래스 객체에 메서드를 실행시키면 Child Method 것이 나오고요, 뭐 이건 당연해 보입니다 ㅎㅎ

Parent 클래스로 형변환(type cast) 한 Child 객체의 Method 를 실행해보면, Child Method 것이 나옵니다. 이게 하이딩과 차이점 ㅎㅎ

오버라이딩은 부모에서 정의된 멤버 메서드를 자식에서 재 정의하는 것을 의미합니다.




4. 오버로딩 (overloading)

이름은 같은데 매개변수 (parameter) 가 다른 메서드를 만드는 것을 의미합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
using System;
 
namespace overload
{
    class OverloadTest
    {
        public static void Method(int val)
        {
            Console.WriteLine("int val Method: return void");
        }
 
        public static void Method(string val)
        {
            Console.WriteLine("string val Method: return void");
        }
 
        public static void Method(double val)
        {
            Console.WriteLine("double val Method: return void");
        }
 
        public static int Method(int val)
        {
            Console.WriteLine("int val Method: return int");
            return val + 10;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            OverloadTest.Method(123);  // int val Method: return void
            OverloadTest.Method("hello"); // string val Method: return void
            OverloadTest.Method(2.71);  // double val Method: return void
 
            OverloadTest.Method(123); // Compile Error
        }
    }
}
 
cs


이름은 비슷한데 오버로딩은 하이딩과 오버라이딩이랑은 좀 다른 얘기입니다.

위의 둘은 부모-자식 클래스 간의 얘기 입니다만,

오버로딩은 메서드의 이름과 매개변수가 다를 때 일어나는 얘기입니다 ㅎㅎ;


OverloadTest 클래스에 같은 메서드 이름으로 아래와 같이 4개의 Method 를 정의하였는데

 반환형

매개변수 

작동여부 

 void

int 

 void

string 

 void

double 

 int

int 



각 매개 변수에 해당하는 메서드가 작동합니다.

근데 마지막 줄은 compile error 가 납니다.

그 이유는 이미 void Method(int val) 이 정의 되었기에 return type이 다른 int Method(int val) 은 오류가 납니다.


즉, 오버로딩을 하기 위해서는 이름이 같고 매개변수가 다른 경우에만 가능하며, 반환형이 다르다고하여 오버로딩이 되지는 않습니다.

정리가 되셨음 좋겠네요 ㅎㅎㅎㅎ...




오늘은 C# 의 객체지향

하이딩(hiding), 오버라이딩(overriding), 오버로딩(overloading) 에 대하여 알아보았습니다

여러분들께 도움이 되셨음 좋겠네요 ㅎㅎ




- 참고
Document 는 우리의 언제나 늘 좋은 친구 ㅎㅎ


paypal 기부 버튼을 만들었습니다
여러분들의 작은 정성이 저에게 큰 힘이 됩니다
기부해주신 분들을 기억하며
더 좋은 내용으로 보답해 드리겠습니다 :)

Donate 버튼은 paypal 결제로 paypal 계정이 없으시더라도
카드로도 기부 가능하십니다 :)
Use your credit card or bank account (where available). 옆의 continue 를 누르시면 됩니다

한주현 드림







반응형

댓글