2020. 11. 19. 15:30ใ์ ๊ณต ๊ณผ๋ชฉ/์๋์ฐ ํ๋ก๊ทธ๋๋ฐ
C# - ํ์ ํด๋์ค์ ์ธํฐํ์ด์ค
ํ์ ํด๋์ค์ ์ธํฐํ์ด์ค .. ์ฒ์ ์ด ๊ฐ๋ ์ ์ ํ๋ฉด ํท๊ฐ๋ฆฐ๋ค. ์๋ฐ์์๋ ๋ฐฐ์ธ ๋ ํท๊ฐ๋ ธ๊ธฐ์ ์ด๋ฒ์ ํ์คํ๊ฒ ์ ๋ฆฌ๋ฅผ ํ๋ ค๊ณ ํ๋ค.
ํ์ ํด๋์ค๋?
- ์ด๋ฏธ ์กด์ฌํ๋ ํด๋์ค์ ์ ๋ณด๋ฅผ ์ถ๊ฐํ์ฌ ์๋ก์ด ํด๋์ค๋ฅผ ๋ง๋๋ ๊ฒ
์ฌ๊ธฐ์ ์ด๋ฏธ ์กด์ฌํ๋ ํด๋์ค๋ "๋ฒ ์ด์ค ํด๋์ค"์ด๋ค.
๋ฒ ์ด์ค ํด๋์ค์ ๋ชจ๋ ๋ฉค๋ฒ๋ค์ด ํ์ ํด๋์ค๋ก ์ฎ๊ฒจ์ง๋ ๊ณผ์ ์ "์์"์ด๋ผ๊ณ ํ๋ฉฐ ํ์ ํด๋์ค๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ "์ฌ์ฌ์ฉ์ฑ"์ ๋์ฌ์ค๋ค. ๊ฐ์ ๊ฑธ ๊ณ์ํด์ ์ ์ํ๊ณ ์ฌ์ฉํ๋ ๊ฒ ๋ฒ๊ฑฐ๋กญ๊ธฐ์ ์ด๋ฌํ ํด๋์ค๊ฐ ๋ํ๋ ๊ฒ์ด๋ค.
ํ์ ํด๋์ค์ ์ ์ ๋ฐฉ๋ฒ
[์ ๊ทผ ์์ ์] class ํ์ ํด๋์ค๋ช : ๋ฒ ์ด์ค ํด๋์ค๋ช {
๋ฉค๋ฒ
}
ํ์ ํด๋์ค์์ ํ๋์ ์ด๋ฆ๊ณผ ๋ฒ ์ด์ค ํด๋์ค ํ๋์ ์ด๋ฆ์ด ๊ฐ๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
-> ๋ฒ ์ด์ค ํด๋์ค์ ํ๋๊ฐ ์จ๊ฒจ์ง๋ค. -> ์ด๋ ๊ตณ์ด ๋ฒ ์ด์ค ํด๋์ค์ ํ๋๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ถ๋ค๋ฉด base์ง์ ์ด๋ฅผ ํตํด์ ๊ฐ์ ธ์ฌ ์ ์๋ค. ๋ค์์์ ๋ฅผ ํตํด ํ์ธํด๋ณด์.
using System;
class BaseClass{
protected int a = 1;
protected int b = 2;
}
class DerivedClass : BaseClass{
new int a = 3; //new ์ฐ์ฐ์๋ฅผ ํตํด ์ ์๋ฅผ ํด์ฃผ์
new double b = 4.5;
public void Output(){
Console.WriteLine("BaseClass : a = {0}, DerivedClass : a = {1}", base.a, a);
Console.WriteLine("BaseClass : b = {0}, DerivedClass : b = {1}", base.b, b);
}
}
class HiddenApp{
public static void Main() {
DerivedClass obj = new DerivedClass();
obj.Output();
}
}
์์ ์์ค์ฝ๋์ ๊ฒฐ๊ณผ๋
a = 1,3
b = 2, 4.5์ด๋ค.
์ ์ํ ์ ์ base.a๋ฅผ ์ฌ์ฉํ ๋ baseํด๋์ค์ ์๋ a๊ฐ protected๋ public์ผ๋ก ์ ๊ทผ ์์ ์๊ฐ ๋์ด์ผ ํ๋ค.
ํ์ ํด๋์ค์ ์์ฑ์
- ๋ฉ์ธ ํด๋์ค์์ ํ์ ํด๋์ค์ ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ค๋ฉด "ํ์ ํด๋์ค ์ ๊ทผ -> ๋ฒ ์ด์ค ํด๋์ค ์์ฑ์ ํธ์ถ -> ํ์ ํด๋์ค ์์ฑ์ ํธ์ถ"์ ๊ณผ์ ์ผ๋ก ์ผ์ด๋๋ค.
์์ฑ์์๋ ๋ช ์์ ์ผ๋ก base()๋ฅผ ๋ถ์ฌ๋ ๋๊ณ ์๋ถ์ฌ๋ ๋๋ค.
ํ์ง๋ง ์์ฑ์์ ๋งค๊ฐ๋ณ์๊ฐ ์์ ๋์๋ ํ์ํด๋์ค ์์ฑ์(๋งค๊ฐ๋ณ์) : base(๋งค๊ฐ๋ณ์)์ ๊ฐ์ด ๋ช ์๋ฅผ ํด์ฃผ์ด์ผ ํ๋ค.
๋ฉ์๋ ์ฌ์ ์
- ๋ฒ ์ด์ค ํด๋์ค๋ก๋ถํฐ ๋ฉ์๋๋ฅผ ์์๋ฐ์ ๋, ํ์ ํด๋์ค ๋ด์ ๊ฐ์ ์ด๋ฆ์ด ์๋ ๊ฒฝ์ฐ์ ์๊ทธ๋ค์ฒ๊ฐ ๋ค๋ฅด๋ฉด ์ค๋ณต(overriding) ๊ฐ์ผ๋ฉด (overloading)์ด ๋๋ค. ์ฌ๊ธฐ์ ์๊ทธ๋ค์ฒ๋ ๋ฉ์๋ ๋งค๊ฐ๋ณ์์ ๊ฐ์๋ ํ์ ์๋ฏธํ๋ฉฐ ์๊ทธ๋ค์ฒ๊ฐ ๊ฐ๋ค๋ฉด ๋ฒ ์ด์ค ํด๋์ค์ ๋ฉ์๋๋ฅผ ๋์ฒดํ๊ณ ๋ค๋ฅด๋ค๋ฉด ๋ค๋ฅธ ๋ฉ์๋๊ฐ ๋๋ ์ ์ด๋ค.
๋ค์ ์์ ๋ฅผ ํตํด ์ค๋ฒ๋ผ์ด๋ฉ๊ณผ ์ค๋ฒ๋ก๋ฉ์ ๋ํด์ ์์๋ณด์.
using system;
class BaseClass{
public void MethodA(){
Console.WriteLine("In the BaseClass ...");
}
}
class DerivedClass : BaseClass{
new public void MethodA(){
Console.WriteLine("overriding");
}
public void MethodA(int i){
Console.WriteLine("overloading");
}
}
class OverApp{
public static void main(){
BaseClass obj1 = new BaseClass();
DerivedClass obj2 = new DerivedClass();
obj1.MethodA();
obj2.MethodA();
obj2.MethodA(1);
}
}
๊ฒฐ๊ณผํ๋ฉด
In the BaseClass ...
overriding
overloading
์ค๋ฒ๋ผ์ด๋ฉ์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ new์ฐ์ฐ์๋ฅผ ๋ถ์ด๋ฉด์ ์๊ทธ๋ค์ฒ๊ฐ ๋๊ฐ์์ผํ๊ณ
์ค๋ฒ๋ก๋ฉ์ ๋ฉ์๋์ ์ด๋ฆ์ ๊ฐ์ง๋ง ๋งค๊ฐ๋ณ์๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ "์๋ก์ด" ๋ฉ์๋๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
๊ฐ์ ๋ฉ์๋
์ง์ ์ด virtual๋ก ์ ์ธ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ ๋ฉ์๋๋ผ๊ณ ํ๋ค. ํต์ฌ์ ํ์ ํด๋์ค์์ ์ฌ์ ์๋์ ์ฌ์ฉํจ์ ์๋ ค์ฃผ๋ ๋ฉ์๋๋ผ๋ ๊ฒ์ด๋ค.
๊ฐ์ ๋ฉ์๋๋ new๋ override ์์ ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ ์ํ๋ฉฐ new๋ ๊ฐ์ฒด ํ์ ๋ฐ๋ผ ํธ์ถ๋๊ณ , override๋ ๊ฐ์ฒด ์ฐธ์กฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฒ์ ๋ฐ๋ผ ํธ์ถ๋๋ค.
์๋ฅผ ๋ค์ด BaseClass s = new DerivedClass(); ๋ผ๋ ์ฝ๋๊ฐ ์์ ๋, s๋ณ์๋ BaseClass์ ๊ฐ์ฒด ํ์ ๊ฐ์ง๋ฉด์ DerivedClass๋ฅผ ์ฐธ์กฐํ๊ฒ ๋๋ค.
์ฆ new ์ฐ์ฐ์๋ก virtual๊ฐ ์ฌ์ ์๋๋ฉด ์๋ฃํ๋ง ๋ณด๋ฉด๋๊ณ , override ์ฐ์ฐ์๋ก virtual๊ฐ ์ฌ์ ์๋๋ฉด ์ฐธ์กฐํ๋ ๊ฒ๋ง ๋ณด๋ฉด ๋๋ ๊ฒ์ด๋ค. ์ด๋ ๊ณง ๋์ฌ ๋คํ์ฑ์์ ์ข ๋ ๊น์ด ๋ค๋ฃจ๊ฒ ๋ค.
๋ด์ธ ๋ฉ์๋
- ๋ง ๊ทธ๋๋ก ๋ด์ธ๋ ๋ฉ์๋๋ก, ์ฌ์ ์ ๋์ง ์๊ธฐ๋ฅผ ์ํ ๋ ์ฌ์ฉ๋๋ฉฐ ํ์ ํด๋์ค์์ ์ฌ์ ์ ๋๋ ๊ฒ์ ํ์ฉํ์ง ์๋ ๊ฒ์ด๋ค. sealed๋ฅผ ์ด์ฉํด์ ์ฌ์ฉํ๋ค.
ํด๋์ค๋ ๋ด์ธ์ผ๋ก ๋ ์ ์๋๋ฐ ๋ด์ธ ํด๋์ค ์์ ๋ฉ์๋๋ค์ ์ ๋ถ ๋ด์ธ๋ฉ์๋๊ฐ ๋๋ค.
์ถ์ ํด๋์ค
- ์ถ์ ํด๋์ค๋ ์ถ์ ๋ฉ์๋๋ฅผ ๊ฐ๊ณ ์๋ ํด๋์ค์ด๋ฉฐ ์ถ์ ๋ฉ์๋๋ ์ค์ง์ ์ธ ๊ตฌํ์ ๊ฐ์ง ์๊ณ ๋ฉ์๋ ์ ์ธ๋ง ์๋ ๊ฒ์ ๋งํ๋ค.
- ์ถ์ ํด๋์ค์๋ ์ถ์ ๋ฉ์๋๊ฐ ์๋ ๋ฉ์๋๊ฐ ๋ค์ด๊ฐ ์ ์๊ณ ์ถ์ ๋ฉ์๋๊ฐ ํ๋๋ผ๋ ์กด์ฌํ๋ค๋ฉด ์ถ์ ํด๋์ค์ด๋ค.
- ์ถ์ ํด๋์ค๋ ๋ฐ๋์ ๋ค๋ฅธ ํด๋์ค์ ์ํด ์์๋ ํ์ ์ฌ์ฉ๋์ด์ผ ํ๊ณ abstract ์์ ์๋ virtual ์์ ์์ ์๋ฏธ๊ฐ ํฌํจ๋์ด ์๊ธฐ ๋๋ฌธ์ override ์์ ์๋ฅผ ์ฌ์ฉํ์ฌ ์ถ์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ ํ ์ ์๋ค.
abstract ์ถ์ ํด๋์ค๋ฅผ ์ด์ฉํ ์์ค ์ฝ๋๋ฅผ ์ดํด๋ณด์.
using System;
abstract class AbstractClass {
public abstract void MethodA();
public void MethodB() {
Console.WriteLine("MethodB()");
}
}
class ImpClass : AbstractClass {
override public void MethodA() {
Console.WriteLine("MethodA()");
}
}
class AbsApp{
public static void Main(){
ImpClass obj = new ImpClass();
obj.MethodA();
obj.MethodB();
}
}
๊ฒฐ๊ณผ ํ๋ฉด
MethodB()
MethodA()
ํต์ฌ์ ์ถ์ ํด๋์ค๋ฅผ ์ ์ํ ๋๋ abstract๋ฅผ ๋ถ์ฌ์ฃผ๊ณ ์ถ์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ ํ ๋๋ override๋ฅผ ์ฌ์ฉํด์ฃผ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ถ์ ๋ฉ์๋๋ฅผ ํ์ ํด๋์ค์์ ๊ตฌํํ ๋ ๋ฐ๋์ ์ ๊ทผ ์์ ์๋ ์ผ์นํด์ผ ํ๋ค.
ํด๋์คํ ๋ณํ
ํด๋์ค๋ ๋ค๋ฅธ ์๋ฃํ์ฒ๋ผ ํ ๋ณํ์ด ๊ฐ๋ฅํ๋ค. ์๋ฅผ๋ค์ด a๋ผ๋ ํด๋์ค๊ฐ b๋ผ๋ ํด๋์ค๋ฅผ ์์๋ฐ์์ ๋ aํด๋์ค๋ bํด๋์ค๋ณด๋ค ๋ฎ์ ํด๋์ค๊ฐ ๋๋ค. ์ฆ ์์๋ ํด๋์ค๊ฐ ๋๋ ๊ฒ์ด๋ค. ์ด๋ a ํด๋์ค์ ํ์ b๋ก ๋ฐ๊พธ๊ณ ์ถ์ ๋ ๋ ๋์ ํ์ผ๋ก ๋ฐ๋๋๋ฐ ์ด๋ฅผ "์บ์คํ -์ "์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
ํ์ ํด๋์ค๊ฐ ๋ฒ ์ด์ค ํด๋์คํ์ผ๋ก ๋ฐ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ๋ฐ๋๋๋๊ฒ์ด "์บ์คํ -๋ค์ด"์ด๋ค. ์บ์คํ ๋ค์ด์ ์บ์คํธ ์ฐ์ ์๋ฅผ ์ด์ฉํด์ ๋ช ์์ ์ผ๋ก ํด๋์คํ์ ๋ณํํด์ผ ํ๋ค.
(a)b = value; ์ ๊ฐ์ด ๋ง์ด๋ค.
ํฐ ๊ฒ์ ์์ ๊ฒ์ ๋ฃ๊ธฐ๋ ํ๋ค๊ณ ์์ ๊ฒ์ ํฐ ๊ฒ์ ๋ฃ๊ธฐ๋ ์ฌ์ด ๊ตฌ์กฐ๋ฅผ ์๊ฐํ๋ฉด ํธํ๋ค.
๋คํ์ฑ
- ์ ์ฉํ๋ ๊ฐ์ฒด์ ๋ฐ๋ผ ๋ฉ์๋์ ์๋ฏธ๊ฐ ๋ฌ๋ผ์ง๋ ๊ฒ
- ์ด๋ virtual์ override์ ์กฐํฉ์ผ๋ก ๋ฉ์๋๋ฅผ ์ ์ธํด์ผ ํ๋ค. ์ฆ ๋ฒ ์ด์ค ํด๋์ค์์ virtual๋ก ์ ์ธํ๊ณ ํ์ ํด๋์ค์์ override๋ก ๋ฉ์๋๋ฅผ ์ฌ์ ์ํด์ผํ๋ค.
using System;
class BaseClass {
public virtual void Output(){
Console.WriteLine("Base");
}
}
class DerivedClass : BaseClass {
public override void Output(){
Console.WriteLine("Derived");
}
}
class PolyApp{
static void Print(BaseClass obj){
obj.Output();
}
public static void Main() {
BaseClass obj1 = new BaseClass();
DerivedClass obj2 = new DerivedClass();
Print(obj1);
Print(obj2);
}
}
๊ฒฐ๊ณผ ํ๋ฉด
Base
Derived
virtual์ override์ ์กฐํฉ์ ์์์๋ ๋งํ๋ฏ์ด ๊ฐ์ฒด์ ํ์ด ์๋ ๊ฐ๋ฆฌํค๊ณ ์๋ ๊ฐ์ฒด์ ๋ฐ๋ผ ์ด๋ฃจ์ด์ง๋ค.
CLanguage c = new Java(); c.Print(); ๋ผ๋ ์ฝ๋๊ฐ ์์ ๋ Clanguageํด๋์ค์ ์๋ ๋ฉ์๋๊ฐ ํธ์ถ๋๋ ๊ฒ์ด ์๋ Javaํด๋์ค์ ์๋ ๋ฉ์๋๊ฐ ํธ์ถ๋๋ ๊ฒ์ด๋ค.
์ธํฐํ์ด์ค๋ ๋ค์์ฅ์์ ๋ค๋ฃจ๊ฒ ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
'์ ๊ณต ๊ณผ๋ชฉ > ์๋์ฐ ํ๋ก๊ทธ๋๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
C# - ๊ณ ๊ธ ํ๋ก๊ทธ๋๋ฐ(์ ๋ค๋ฆญ) (2) | 2020.11.27 |
---|---|
C# - ํ์ ํด๋์ค์ ์ธํฐํ์ด์ค(2) (0) | 2020.11.19 |
C# - ์ปจํธ๋กค (2) | 2020.10.06 |
C# - ์ฐ์ฐ์์ ๋ฐ์ฑ (0) | 2020.10.06 |
C# - ๋ฒํผ๊ธฐ๋ฐ ์ปจํธ๋กค(์ฒดํฌ๋ฐ์ค์ ๋ผ๋์ค) (1) | 2020.09.29 |