C#/이것이 C#이닀

23. 상속, μ½”λ“œ μž¬ν™œμš©, 기반 클래슀, νŒŒμƒ 클래슀, base, sealed

Rainbow🌈Coder 2022. 2. 11. 10:39
728x90

ν΄λž˜μŠ€λŠ” λ‹€λ₯Έ ν΄λž˜μŠ€λ‘œλΆ€ν„° μœ μ‚°μ„ 물렀받을 수 μžˆλ‹€.(ν•„λ“œ, λ©”μ†Œλ“œ, ν”„λ‘œνΌν‹° 같은 멀버듀)

 

νŒŒμƒ ν΄λž˜μŠ€λŠ” 객체λ₯Ό 생성할 λ•Œ λ‚΄λΆ€μ μœΌλ‘œ 기반 클래슀의 μƒμ„±μžλ₯Ό λ¨Όμ € ν˜ΈμΆœν•œ 뒀에 μžμ‹ μ˜ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜κ³ ,

객체가 μ†Œλ©Έλ  λ•ŒλŠ” λ°˜λŒ€μ˜ μˆœμ„œλ‘œ(νŒŒμƒν΄λž˜μŠ€ -> 기반 클래슀)μ’…λ£Œμžλ₯Ό ν˜ΈμΆœν•œλ‹€. 

 

: 기반 클래슀 λ¨Όμ € μƒμ„±λ˜κ³  λ§ˆμ§€λ§‰κΉŒμ§€ 버티닀 κ°€μž₯ λ‚˜μ€‘μ— μ’…λ£Œμž ν˜ΈμΆœν•¨!

 

λ§Œμ•½ 기반 클래슀의 μƒμ„±μžκ°€ λ§€κ°œλ³€μˆ˜λ₯Ό μž…λ ₯받도둝 μ„ μ–Έλ˜μ–΄ μžˆλ‹€λ©΄

νŒŒμƒ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 λ•Œ ν˜ΈμΆœλ˜λŠ” 기반 클래슀의 μƒμ„±μžμ—λŠ” μ–΄λ–»κ²Œ λ§€κ°œλ³€μˆ˜λ₯Ό 전달할 수 μžˆμ„κΉŒ.

이럴 λ•Œ 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();
        }
    }
}
728x90