관리 메뉴

Algo μ“°μž

08. baseν‚€μ›Œλ“œμ™€ sealedν•œμ •μž λ³Έλ¬Έ

πŸ’» Programming Language/C#

08. baseν‚€μ›Œλ“œμ™€ sealedν•œμ •μž

S.Honey 2022. 4. 6. 09:21
namespace inheritEx2
{
    // 기반(λΆ€λͺ¨) 클래슀의 λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” μƒμ„±μžμ—κ²Œ
    // νŒŒμƒ(μžμ‹) 클래슀의 μƒμ„±μžμ—μ„œ 인자λ₯Ό μ „λ‹¬ν•˜λŠ” 방법

    /*
     C# μ—μ„œλŠ” λΆ€λͺ¨ 클래슀 μƒμ„±μž μ€‘μ—μ„œ μ‚¬μš©μž 지정 μƒμ„±μž(λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” μƒμ„±μž)κ°€
    쑴재 ν•  λ•Œ λΆ€λͺ¨ 클래슀 μƒμ„±μžμ˜ λ§€κ°œλ³€μˆ˜ (Ex. λ§€κ°œλ³€μˆ˜ = p) λ₯Ό μžμ‹ν΄λž˜μŠ€μ—μ„œ μ „λ‹¬ν•˜μ—¬ ν™œμš©ν•  수 μžˆλ‹€. 
     즉, μžμ‹ 클래슀의 μΈμŠ€ν„΄μŠ€(λΆ€λͺ¨ν΄λž˜μŠ€λ₯Ό 상속받고 μžˆλŠ”κ²½μš°)λ₯Ό μƒμ„±ν• λ•Œ λΆ€λͺ¨ν΄λž˜μŠ€μ— λ§€κ°œλ³€μˆ˜λ₯Ό μ „λ‹¬ν•˜μ—¬ μ΄ˆκΈ°ν™” ν•  수 있음.
     cf) Java? Python인가? κ±°κΈ°μ„œ 봀던 super() 같은 것인듯함.
     */

    /* sealed */ class Parent 
        // 이와 같이 `sealed` ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•˜λ©΄ 
        // μ»΄νŒŒμΌλŸ¬μ—μ„œ μ—λŸ¬λ₯Ό λ°œμƒμ‹œμΌœ 상속을 λΆˆκ°€λŠ₯ν•˜κ²Œ ν•œλ‹€.
        // μ΄λ ‡κ²Œ sealedλ₯Ό ν΄λž˜μŠ€μ— μ΄μš©ν•˜λ©΄ λ΄‰μΈν•œλ‹€ 라고 ν•œλ‹€.
    {
        protected string name;
        public Parent(string name)
        {
            this.name = name;
            Console.WriteLine($"{this.name}.Parent()");
        }

        public void parent_method()
        {
            Console.WriteLine("parent method");
        }
    }

    class Child : Parent
    {
        public Child(string name) : base(name) 
            // baseλŠ” λΆ€λͺ¨ ν΄λž˜μŠ€μ— μ ‘κ·Όν•  λ•Œ μ‚¬μš©
        {   // μ΄λ ‡κ²Œ μ„ μ–Έν•˜λ©΄ Child(name)의 λ§€κ°œλ³€μˆ˜ name을 λΆ€λͺ¨μ˜ μƒμ„±μžλ‘œ μ „λ‹¬ν•˜λ©° ν˜ΈμΆœν•œκ²ƒ
            Console.WriteLine($"{this.name}.Child()");
        }

        // base ν‚€μ›Œλ“œλŠ” 기반 클래슀λ₯Ό κ°€λ¦¬ν‚€λŠ” ν‚€μ›Œλ“œμ΄λ‹€.
        //λ”°λΌμ„œ, 기반클래슀의 멀버λ₯Ό μ ‘κ·Όν•  λ•Œ μ‚¬μš©ν•  수 μžˆλ‹€.

        public void child_method()
        {
            Console.WriteLine("child method");
            base.parent_method(); 
            //base ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•΄ λΆ€λͺ¨ν΄λž˜μŠ€μ˜ λ©”μ†Œλ“œλ„ ν˜ΈμΆœν•  수 μžˆλ‹€.
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Child child = new Child("아이");
            child.child_method();
        }
    }
}
Output

아이.Parent()
아이.Child()
child method
parent method

  • base : 기반(λΆ€λͺ¨)클래슀λ₯Ό κ°€λ¦¬ν‚€λŠ” ν‚€μ›Œλ“œμ΄λ‹€. base ν‚€μ›Œλ“œλ₯Ό 톡해 기반클래슀의 멀버(ν•„λ“œ ν˜Ήμ€ λ©”μ†Œλ“œ)λ₯Ό μ ‘κ·Όν•  λ•Œ μ‚¬μš©ν•  수 μžˆλ‹€. μ½”λ“œ μ°Έκ³ ν•  것!

  • sealed : 기반(λΆ€λͺ¨)ν΄λž˜μŠ€μ— μ‚¬μš©ν•˜λŠ” ν‚€μ›Œλ“œλ‘œ 이λ₯Ό 톡해 μ»΄νŒŒμΌλŸ¬μ—μ„œ μ—λŸ¬λ₯Ό λ°œμƒμ‹œμΌœ 클래슀의 상속을 λΆˆκ°€λŠ₯ν•˜κ²Œ ν•œλ‹€. sealed ν‚€μ›Œλ“œλ₯Ό ν΄λž˜μŠ€μ— μ΄μš©ν•˜μ—¬ λ΄‰μΈν•œλ‹€ 라고 μΌμ»«λŠ”λ‹€.

  • 기반(λΆ€λͺ¨)클래슀의 λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” μƒμ„±μžμ—κ²Œ νŒŒμƒ(μžμ‹)클래슀의 μƒμ„±μžμ—μ„œ 인자λ₯Ό μ „λ‹¬ν•˜λŠ” 방식에 base와 sealedλ₯Ό μ‚¬μš©ν•œλ‹€.

  • C# μ—μ„œλŠ” λΆ€λͺ¨ 클래슀 μƒμ„±μž μ€‘μ—μ„œ μ‚¬μš©μž 지정 μƒμ„±μž(λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” μƒμ„±μž)κ°€ 쑴재 ν•  λ•Œ λΆ€λͺ¨ 클래슀 μƒμ„±μžμ˜ λ§€κ°œλ³€μˆ˜ (Ex. λ§€κ°œλ³€μˆ˜ = p) λ₯Ό μžμ‹ν΄λž˜μŠ€μ—μ„œ μ „λ‹¬ν•˜μ—¬ ν™œμš©ν•  수 μžˆλ‹€. 즉, μžμ‹ 클래슀의 μΈμŠ€ν„΄μŠ€(λΆ€λͺ¨ν΄λž˜μŠ€λ₯Ό 상속받고 μžˆλŠ”κ²½μš°)λ₯Ό μƒμ„±ν• λ•Œ λΆ€λͺ¨ν΄λž˜μŠ€μ— λ§€κ°œλ³€μˆ˜λ₯Ό μ „λ‹¬ν•˜μ—¬ μ΄ˆκΈ°ν™” ν•  수 있음. cf) Java? Python인가? κ±°κΈ°μ„œ 봀던 super() 같은 것 인듯함.