23. μμ, μ½λ μ¬νμ©, κΈ°λ° ν΄λμ€, νμ ν΄λμ€, base, sealed
ν΄λμ€λ λ€λ₯Έ ν΄λμ€λ‘λΆν° μ μ°μ λ¬Όλ €λ°μ μ μλ€.(νλ, λ©μλ, νλ‘νΌν° κ°μ λ©€λ²λ€)
νμ ν΄λμ€λ κ°μ²΄λ₯Ό μμ±ν λ λ΄λΆμ μΌλ‘ κΈ°λ° ν΄λμ€μ μμ±μλ₯Ό λ¨Όμ νΈμΆν λ€μ μμ μ μμ±μλ₯Ό νΈμΆνκ³ ,
κ°μ²΄κ° μλ©Έλ λλ λ°λμ μμλ‘(νμν΄λμ€ -> κΈ°λ° ν΄λμ€)μ’ λ£μλ₯Ό νΈμΆνλ€.
: κΈ°λ° ν΄λμ€ λ¨Όμ μμ±λκ³ λ§μ§λ§κΉμ§ λ²ν°λ€ κ°μ₯ λμ€μ μ’ λ£μ νΈμΆν¨!
λ§μ½ κΈ°λ° ν΄λμ€μ μμ±μκ° λ§€κ°λ³μλ₯Ό μ λ ₯λ°λλ‘ μ μΈλμ΄ μλ€λ©΄
νμ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μμ±ν λ νΈμΆλλ κΈ°λ° ν΄λμ€μ μμ±μμλ μ΄λ»κ² λ§€κ°λ³μλ₯Ό μ λ¬ν μ μμκΉ.
μ΄λ΄ λ base ν€μλλ₯Ό μ¬μ©νλ©΄ λλ€.
this ν€μλκ° "μκΈ° μμ "μ κ°λ¦¬ν¨λ€λ©΄ baseλ "κΈ°λ° ν΄λμ€"λ₯Ό κ°λ¦¬ν¨λ€.
thisλ₯Ό ν΅ν΄ μκΈ° μμ μ λ©€λ²μ μ κ·Όν μ μμλ κ²μ²λΌ,
base ν€μλλ₯Ό ν΅ν΄ κΈ°λ° ν΄λμ€μ λ©€λ²μ μ κ·Όν μ μλ€.
base()λ κΈ°λ° ν΄λμ€μ μμ±μμ΄λ€.
νμ ν΄λμ€μ μμ±μμμ κΈ°λ° ν΄λμ€μ μμ±μλ‘ λ§€κ°λ³μλ₯Ό λ겨주기 μν΄μλ...
μ΄κ² μμ thisμ κ°λ€.
this()κ° μκΈ° μμ μ μμ±μμΈ κ² μ²λΌ, base()λ κΈ°λ° ν΄λμ€μ μμ±μμ΄λ€.
base()μ λ§€κ° λ³μλ₯Ό λ겨 νΈμΆνλ©΄ μνλ κ²μ²λΌ Base() μμ±μλ₯Ό ν΅ν΄ Name νλλ₯Ό μ΄κΈ°νν μ μλ€.
this() μκΈ° μμ μ μμ±μμΈ κ² μ²λΌ, base()λ κΈ°λ° ν΄λμ€μ μμ±μμ΄λ€.
base()μ λ§€κ°λ³μλ₯Ό λ겨 νΈμΆνλ©΄
κΈ°λ° ν΄λμ€ μμ±μλ₯Ό ν΅ν΄ νλλ₯Ό μ΄κΈ°νν μ μλ€.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;
namespace UsingOut
{
class Base
{
protected string Name;
public Base(string Name)
{
this.Name = Name;
}
~Base()
{
WriteLine("~Base()");
}
protected void BaseMethod()
{
WriteLine("Unity");
}
}
class Derived : Base
{
public Derived(string Name) : base(Name)
{
WriteLine($"{this.Name}");
}
~Derived()
{
WriteLine("~Derived()");
}
}
class MainApp
{
static void Main(string[] args)
{
Derived derived = new Derived("1");
}
}
}
<μμ >
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;
namespace UsingOut
{
class Base
{
protected string Name;
public Base(string Name) //κΈ°λ° ν΄λμ€ μμ±μ
{
this.Name = Name;
WriteLine($"{this.Name}.Base()");
}
~Base()
{
WriteLine($"{this.Name}.~Base");
}
public void BaseMethod()
{
WriteLine($"{Name}.BaseMethod()");
}
}
class Derived : Base
{
public Derived(string Name) : base(Name)
{
WriteLine($"{this.Name}.Derived()");
}
~Derived()
{
WriteLine($"{this.Name}.~Derived()");
}
public void derivedMethod()
{
WriteLine($"{Name}.DerivedMethod()");
}
}
class MainApp
{
static void Main(string[] args)
{
Base a = new Base("a");
a.BaseMethod();
Derived b = new Derived("b");
b.BaseMethod();
b.derivedMethod();
}
}
}
<μμ μΆλ ₯>
a.Base()
a.BaseMethod()
b.Base()
b.Derived()
b.BaseMethod()
b.DerivedMethod()
b.~Derived()
b.~Base
a.~Base
<μ°μ΅ μ½λ>
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;
namespace UsingOut
{
class Parent
{
protected int id;
public Parent(int id)
{
this.id = id;
WriteLine($"{this.id}.Parent()");
}
~Parent()
{
WriteLine($"{this.id}.Parent ν΄μ₯");
}
public void parentMethod()
{
WriteLine($"{id}.parentMethod()");
}
}
class Child : Parent
{
public Child(int id) : base(id)
{
WriteLine($"{this.id}.Child()");
}
~Child()
{
WriteLine($"{this.id}.Child ν΄μ₯");
}
public void childMethod()
{
WriteLine($"{id}.childMethod");
}
}
class MainApp
{
static void Main(string[] args)
{
Parent parent = new Parent(1);
parent.parentMethod();
Child child = new Child(2);
child.parentMethod();
child.childMethod();
}
}
}
<μ°μ΅ μ½λ μΆλ ₯ κ²°κ³Ό>
1.Parent()
1.parentMethod()
2.Parent()
2.Child()
2.parentMethod()
2.childMethod
2.Child ν΄μ₯
2.Parent ν΄μ₯
1.Parent ν΄μ₯
<μ€ν 1>
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;
namespace UsingOut
{
class Base
{
public Base()
{
WriteLine("Base()");
}
~Base()
{
WriteLine("~Base()");
}
}
class Derived : Base
{
public Derived()
{
WriteLine("Derived()");
}
~Derived()
{
WriteLine("~Derived()");
}
}
class MainApp
{
static void Main(string[] args)
{
Derived derived = new Derived();
}
}
}
<μ€ν 1 μΆλ ₯ κ²°κ³Ό>
Base()
Derived()
~Derived()
~Base()
<μ€ν 2>
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;
namespace UsingOut
{
class Base
{
public Base()
{
WriteLine("Base()");
}
~Base()
{
WriteLine("~Base()");
}
protected void BaseMethod()
{
WriteLine("Unity");
}
}
class Derived : Base
{
public Derived()
{
base.BaseMethod();
WriteLine("Derived()");
}
~Derived()
{
WriteLine("~Derived()");
}
}
class MainApp
{
static void Main(string[] args)
{
Derived derived = new Derived();
}
}
}
<μ€ν 2 μΆλ ₯ κ²°κ³Ό>
Base()
Unity
Derived()
~Derived()
~Base()
<μ€ν 3>
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;
namespace UsingOut
{
class Base
{
protected string Name;
public Base(string Name)
{
this.Name = Name;
}
~Base()
{
WriteLine("~Base()");
}
protected void BaseMethod()
{
WriteLine("Unity");
}
}
class Derived : Base
{
public Derived(string Name) : base(Name)
{
WriteLine($"{this.Name}");
}
~Derived()
{
WriteLine("~Derived()");
}
}
class MainApp
{
static void Main(string[] args)
{
Derived derived = new Derived("1");
}
}
}
<μ€ν 3 μΆλ ₯ κ²°κ³Ό>
1
~Derived()
~Base()
<sealed>
κΈ°λ° ν΄λμ€μ μμ±μλ μλνμ§ μμ μμμ΄λ νμ ν΄λμ€μ ꡬνμ λ§κΈ° μν΄ μμμ΄ λΆκ°λ₯νλλ‘ ν΄λμ€λ₯Ό μ μΈν μ μλ€. sealed νμ μλ₯Ό μ΄μ©νλ©΄ λλ€.
sealed νμ μλ‘ ν΄λμ€λ₯Ό μμνλ©΄, μ΄ ν΄λμ€λ "μμ λ΄μΈ"(μ΄λ° ν΄λμ€λ₯Ό λ΄μΈ ν΄λμ€λΌκ³ νλ€)μ΄ λμ΄
μ΄λ‘λΆν° μμλ°μΌλ €λ μλκ° μ»΄νμΌλ¬λ‘λΆν° λ°κ²¬λμ λ μλ¬λ©μμ§κ° μΆλ ₯λλ€.
<sealedλλ¬Έμ μ»΄νμΌ μλ¬λλ μμ >
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;
namespace UsingOut
{
sealed class Base
{
protected string Name;
public Base(string Name)
{
this.Name = Name;
}
~Base()
{
WriteLine("~Base()");
}
protected void BaseMethod()
{
WriteLine("Unity");
}
}
class Derived : Base
{
public Derived(string Name) : base(Name)
{
WriteLine($"{this.Name}");
}
~Derived()
{
WriteLine("~Derived()");
}
}
class MainApp
{
static void Main(string[] args)
{
Derived derived = new Derived("1");
}
}
}
<κΈ°λ° ν΄λμ€μ νμ ν΄λμ€ μ¬μ΄μ νμ λ³ν, κ·Έλ¦¬κ³ isμ as>
κ°μ κ³ μμ΄λ μ’ μ λ€λ₯΄μ§λ§ μ μ λ¨ΉμΈλ€λ 곡ν΅μ λλ¬Έμ ν¬μ λ₯λ‘ λΆλ₯λλ€.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;
namespace UsingOut
{
class Mammal
{
public void Nurse() { }
}
class Dog: Mammal
{
public void Bark() { }
}
class Cat: Mammal
{
public void Meow() { }
}
class MainApp
{
static void Main(string[] args)
{
Mammal mammal = new Mammal();
mammal.Nurse();
Dog dog = new Dog();
dog.Nurse();
dog.Bark();
Cat cat = new Cat();
cat.Nurse();
cat.Meow();
}
}
}
κΈ°λ° ν΄λμ€μ νμ ν΄λμ€ μ¬μ΄μμλ 쑱보λ₯Ό μ€λ₯΄λ΄λ¦¬λ νμ λ³νμ΄ κ°λ₯νλ©°,
νμ ν΄λμ€μ μΈμ€ν΄μ€λ κΈ°λ° ν΄λμ€μ μΈμ€ν΄μ€λ‘μλ μ¬μ©ν μ μλ€.
μ΄λ₯Ό ν΅ν΄ μ½λμ μμ°μ±μ΄ λμμ§λ€.
-λλ¬Όμμ μμ-
Mammal ν΄λμ€μμ 300κ°μ§μ ν΄λμ€κ° νμλμλ€κ³ μΉκ³ ,
λλ¬Όμμ μ¬μ‘μ¬ ν΄λμ€λ₯Ό λ§λ€κ³ λλ¬Όλ€μ μ»κΈ°λ Wash()λ©μλλ₯Ό ꡬννλ€κ³ μκ°ν΄λ³΄μ.
λ€μκ³Ό κ°μ΄ 300κ°μ Wash()λ©μλλ₯Ό μ€λ²λ‘λ©ν΄μΌ νλ€.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;
namespace UsingOut
{
class ZooKeeper
{
public void Wash(Dog dog) {/*~Wash λ©μλ λ΄μ©~*/ }
public void Wash(Cat cat) {/*~Wash λ©μλ λ΄μ©~*/ }
public void Wash(Rabbit rabbit) {/*~Wash λ©μλ λ΄μ©~*/ }
public void Wash(Whale whale) {/*~Wash λ©μλ λ΄μ©~*/ }
//λ±λ±... 300κ° λ²μ μ Wash() λ©μλ μ μΈ
}
class Mammal
{
public void Nurse() { }
}
class Dog: Mammal
{
public void Bark() { }
}
class Rabbit : Mammal
{
public void Jump() { }
}
class Whale : Mammal
{
public void Swim() { }
}
class Cat : Mammal
{
public void Meow() { }
}
class MainApp
{
static void Main(string[] args)
{
Mammal mammal = new Mammal();
mammal.Nurse();
mammal = new Dog();
mammal.Nurse();
Dog dog = (Dog)mammal;
dog.Nurse();
dog.Bark();
mammal = new Cat();
mammal.Nurse();
Cat cat = (Cat)mammal;
cat.Nurse();
cat.Meow();
}
}
}
νμ§λ§ 300κ°μ λλ¬Ό ν΄λμ€κ° λͺ¨λ Mammal ν΄λμ€λ‘λΆν° μμλ°μκΈ° λλ¬Έμ
μ΄λ€μ λͺ¨λ Mammalλ‘ κ°μ£Όν μ μλ€.
λ°λΌμ λ€μκ³Ό κ°μ΄ λ± νλμ Wash()λ©μλλ§ μ€λΉνλ©΄ 300κ°μ λλ¬Ό ν΄λμ€μ μ¬μ©μ΄ κ°λ₯νλ€.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;
namespace UsingOut
{
class ZooKeeper
{
public void Wash(Mammal mammal) {/*~Wash λ©μλ λ΄μ©~*/ }
}
class Mammal
{
public void Nurse() { }
}
class Dog: Mammal
{
public void Bark() { }
}
class Rabbit : Mammal
{
public void Jump() { }
}
class Whale : Mammal
{
public void Swim() { }
}
class Cat : Mammal
{
public void Meow() { }
}
class MainApp
{
static void Main(string[] args)
{
Mammal mammal = new Mammal();
mammal.Nurse();
mammal = new Dog();
mammal.Nurse();
Dog dog = (Dog)mammal;
dog.Nurse();
dog.Bark();
mammal = new Cat();
mammal.Nurse();
Cat cat = (Cat)mammal;
cat.Nurse();
cat.Meow();
}
}
}