반응형
안녕하세요 한주현 입니다
여러분들 잘 지내시나요?
저는 요새 생각하는 기능들이 들어있고, 생각하는 대로 척척 잘 만들어 주는 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 |
O |
void |
string |
O |
void |
double |
O |
int |
int |
X |
각 매개 변수에 해당하는 메서드가 작동합니다.
근데 마지막 줄은 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 를 누르시면 됩니다
한주현 드림
반응형
댓글