C#/이것이 C#이닀

37. μΆ”μƒν΄λž˜μŠ€ : μΈν„°νŽ˜μ΄μŠ€μ™€ 클래슀 사이

Rainbow🌈Coder 2022. 2. 22. 11:03
728x90

좔상 ν΄λž˜μŠ€λŠ” "κ΅¬ν˜„"을 κ°€μ§ˆ 수 μžˆλ‹€.

ν•˜μ§€λ§Œ ν΄λž˜μŠ€μ™€ 달리 μΈμŠ€ν„΄μŠ€λ₯Ό κ°€μ§ˆ 수 μ—†λ‹€.

ν•œλ§ˆλ””λ‘œ 좔상 ν΄λž˜μŠ€λŠ” κ΅¬ν˜„μ„ κ°–λ˜ μΈμŠ€ν„΄μŠ€λŠ” λ§Œλ“€μ§€ λͺ»ν•œλ‹€.

그리고 좔상 λ©”μ†Œλ“œλ₯Ό κ°€μ§ˆ 수 μžˆλ‹€.

(μΆ”μƒλ©”μ†Œλ“œλŠ” μΆ”μƒν΄λž˜μŠ€κ°€ μΈν„°νŽ˜μ΄μŠ€μ˜ 역할도 ν•  수 있게 ν•΄μ£ΌλŠ” μž₯μΉ˜μ΄λ‹€. μ™œλƒν•˜λ©΄ κ΅¬ν˜„μ„ κ°–μ§€λŠ” λͺ»ν•˜μ§€λ§Œ νŒŒμƒ ν΄λž˜μŠ€μ—μ„œ λ°˜λ“œμ‹œ κ΅¬ν˜„ν•˜λ„λ‘ κ°•μ œν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. λ‹€μ‹œλ§ν•΄ μΆ”μƒν΄λž˜μŠ€λ₯Ό μƒμ†ν•˜λŠ” ν΄λž˜μŠ€λ“€μ΄ λ°˜λ“œμ‹œ 이 λ©”μ†Œλ“œλ₯Ό κ°–κ³  μžˆμ„ κ±°λž€λŠ” '약속'이닀.)

C# μ»΄νŒŒμΌλŸ¬λŠ” 좔상 λ©”μ†Œλ“œκ°€ λ°˜λ“œμ‹œ public, protected, internal, protected internal ν•œμ •μž 쀑 ν•˜λ‚˜λ‘œ μˆ˜μ‹λ  것을 κ°•μš”ν•œλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ 클래슀의 μ ‘κ·Όμ„± 원칙도, μΈν„°νŽ˜μ΄μŠ€μ˜ μ ‘κ·Όμ„± 원칙도 μ§€μΌœμ§ˆ 수 μžˆλ‹€.

좔상 ν΄λž˜μŠ€λŠ” abstract ν•œμ •μžμ™€ class ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•΄μ„œ μ„ μ–Έν•œλ‹€.

 

abstract class ν΄λž˜μŠ€μ΄λ¦„
{
	//ν΄λž˜μŠ€μ™€ λ™μΌν•˜κ²Œ κ΅¬ν˜„
}

μ•„λž˜λŠ” μΆ”μƒλ©”μ†Œλ“œ μ„ μ–Έ μ˜ˆμ΄λ‹€.

    public abstract class Abs
    {
        public abstract void baseAbs();
    }

    public class Son : Abs
    {
        public override void baseAbs()
        {
            Console.WriteLine("μΆ”μƒλ©”μ†Œλ“œ μƒμ†λ°›μ•˜μŠ΅λ‹ˆλ‹€.");
        }
    }

 

μΆ”μƒν΄λž˜μŠ€λŠ” μΈν„°νŽ˜μ΄μŠ€μ™€ 클래슀의 쀑간에 μžˆλ‹€.

...λΌκ³ λŠ” ν•˜μ§€λ§Œ

사싀 μΆ”μƒν΄λž˜μŠ€λŠ” ν΄λž˜μŠ€μ— 더 가깝닀. μΆ”μƒν΄λž˜μŠ€μ˜ μ ‘κ·Όμ„± 같은 κ²½μš°λŠ” ν΄λž˜μŠ€μ™€ λ˜‘κ°™λ‹€.

그리고 μΈν„°νŽ˜μ΄μŠ€μ—μ„œ λͺ¨λ“  λ©”μ†Œλ“œκ°€ public으둜 μ„ μ–Έλ˜λŠ” 반면,

ν΄λž˜μŠ€λŠ” ν•œμ •μžλ₯Ό λͺ…μ‹œν•˜μ§€ μ•ŠμœΌλ©΄ λͺ¨λ“  λ©”μ†Œλ“œκ°€ private둜 μ„ μ–Έλœλ‹€.

 

ν•œνŽΈ, 좔상 ν΄λž˜μŠ€μ—λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€ 수 μ—†λ‹€λŠ” 점 외에도 ν΄λž˜μŠ€μ™€ λ‹€λ₯Έ 점이 또 ν•˜λ‚˜ 더 μžˆλ‹€.

좔상 λ©”μ†Œλ“œλ₯Ό κ°€μ§ˆ 수 μžˆλ‹€λŠ” 사싀이닀.

 

좔상 λ©”μ†Œλ“œλŠ” 좔상 ν΄λž˜μŠ€κ°€ μΈν„°νŽ˜μ΄μŠ€ 역할도 ν•  수 있게 ν•΄μ£ΌλŠ” μž₯μΉ˜μ΄λ‹€.

γ„΄ κ΅¬ν˜„μ„ κ°–μ§€ λͺ»ν•˜μ§€λ§Œ νŒŒμƒ ν΄λž˜μŠ€μ—μ„œ λ°˜λ“œμ‹œ κ΅¬ν˜„ν•˜λ„λ‘ κ°•μ œν•¨

γ„΄ 좔상 클래슀λ₯Ό μƒμ†ν•˜λŠ” ν΄λž˜μŠ€λ“€μ€ λ°˜λ“œμ‹œ 이 좔상 λ©”μ†Œλ“œλ₯Ό κ°–κ³  μžˆμ–΄μ•Ό ν•œλ‹€.  [그것이 μ•½μ†μ΄λ‹ˆκΉŒ....(λ‚˜λ£¨ν† ν†€)]

<좔상 λ©”μ†Œλ“œμ˜ κΈ°λ³Έ μ ‘κ·Όμ„±>은...

μΈν„°νŽ˜μ΄μŠ€μ²˜λŸΌ publicμΌμˆ˜λ„, 클래슀처럼 private 일 μˆ˜λ„ μžˆλ‹€.

좔상 ν΄λž˜μŠ€λ‚˜ ν΄λž˜μŠ€λŠ” κ·Έ μ•ˆμ—μ„œ μ„ μ–Έλ˜λŠ” λͺ¨λ“  ν•„λ“œ, λ©”μ†Œλ“œ, ν”„λ‘œνΌν‹°, 이벀트 λͺ¨λ‘ μ ‘κ·Ό ν•œμ •μžλ₯Ό λͺ…μ‹œν•˜μ§€ μ•ŠμœΌλ©΄ private이닀. 여기에 좔상 λ©”μ†Œλ“œλ„ μ˜ˆμ™Έκ°€ 될 수 μ—†λ‹€λ§Œ!

μ»΄νŒŒμΌλŸ¬λŠ” '약속' 역할을 ν•˜λŠ” '좔상 λ©”μ†Œλ“œ'κ°€ λ°˜λ“œμ‹œ public, protected, internal, protected internal ν•œμ •μž 쀑 ν•˜λ‚˜λ‘œ μˆ˜μ‹λ  것을 κ°•μš”ν•œλ‹€. ('약속' 역할을 μˆ˜ν–‰ν•΄μ•Όν•˜λŠ”λ° privateλŠ” κ°€λ‹ΉμΉ˜λ„ μ•Šλ‹€!)-> μ΄λ ‡κ²Œ ν•˜λ©΄ 클래슀의 μ ‘κ·Όμ„± 원칙도, μΈν„°νŽ˜μ΄μŠ€μ˜ μ ‘κ·Όμ„± 원칙도 μ§€μΌœμ§ˆ 수 μžˆλ‹€.

abstract class AbstractBase
{
	public abstract void SomeMethod();
}

class Derived : AbstractBase
{
     public override void SomeMethod()
     {
          //Something
     }
}

 

 

<좔상 ν΄λž˜μŠ€κ°€ 또 λ‹€λ₯Έ 좔상 클래슀λ₯Ό μƒμ†ν•˜λŠ” 경우>

좔상 ν΄λž˜μŠ€λŠ” 또 λ‹€λ₯Έ 좔상 클래슀λ₯Ό 상속할 수 있으며,

이 경우 μžμ‹ 좔상 ν΄λž˜μŠ€λŠ” λΆ€λͺ¨ 좔상 클래슀의 좔상 λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.

좔상 λ©”μ†Œλ“œλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 ν΄λž˜μŠ€μ—μ„œ κ΅¬ν˜„ν•˜λ©΄ 되기 λ•Œλ¬Έμ΄λ‹€.

 

 

<μΆ”μƒν΄λž˜μŠ€ 예제>

using System;

namespace AbstractClass
{
    abstract class AbstractBase
    {
        protected void PrivateMethodA()
        {
            Console.WriteLine("AbstractBase.PrivateMethodA()");
        }
        public void PublicMethodA()
        {
            Console.WriteLine("AbstractBase.PublicMethodA()");
        }
        public abstract void AbstractMethodA();
    }
    class Derived : AbstractBase
    {
        public override void AbstractMethodA()
        {
            Console.WriteLine("Derived.AbstractMethodA()");
            PrivateMethodA();
        }
    }

    class MainApp
    {
        static void Main(string[] args)
        {
            AbstractBase obj = new Derived();
            obj.AbstractMethodA();
            obj.PublicMethodA();
        }
    }
}

<좜λ ₯κ²°κ³Ό>

Derived.AbstractMethodA()
AbstractBase.PrivateMethodA()
AbstractBase.PublicMethodA()

 

<이건 κΆκΈˆν•΄μ„œ 돌렀본 것> : μ•„λž˜μ™€ 같이 좔상 λ©”μ†Œλ“œκ°€ μ—†λŠ” 좔상 ν΄λž˜μŠ€λ„ λ¬Έλ²•μ μœΌλ‘œ ν•˜μžκ°€ μžˆλŠ” 것은 μ•„λ‹ˆμ§€λ§Œ, μ‹€μ§ˆμ μœΌλ‘œλŠ” 별 μ˜λ―Έκ°€ μ—†λŠ” μ½”λ“œλΌκ³  ν•  수 μžˆλ‹€.

using System;

namespace AbstractClass
{
    abstract class AbstractBase
    {
        protected void PrivateMethodA()
        {
            Console.WriteLine("AbstractBase.PrivateMethodA()");
        }
        public void PublicMethodA()
        {
            Console.WriteLine("AbstractBase.PublicMethodA()");
        }
    }
    class Derived : AbstractBase
    {
    }

    class MainApp
    {
        static void Main(string[] args)
        {
            AbstractBase obj = new Derived();
            obj.PublicMethodA();
        }
    }
}

 

<좜λ ₯ κ²°κ³Ό>

AbstractBase.PublicMethodA()

 

<μΆ”μƒν΄λž˜μŠ€μ˜ μ“Έλͺ¨>

"이 ν΄λž˜μŠ€λŠ” 직접 μΈμŠ€ν„΄μŠ€ν™”ν•˜μ§€ 말고 νŒŒμƒν΄λž˜μŠ€λ₯Ό λ§Œλ“€μ–΄ μ‚¬μš©ν•˜μ„Έμš”. μ•„, 그리고 μΆ”μƒλ©”μ†Œλ“œλ₯Ό κΌ­ μ˜€λ²„λΌμ΄λ”©ν•΄μ•Όν•©λ‹ˆλ‹€. μ»΄νŒŒμΌλŸ¬λŠ” 심지어 ν”„λ‘œκ·Έλž˜λ¨Έλ“€μ΄ 이λ₯Ό μ€€μˆ˜ν•˜λ„λ‘ κ°•μ œμ‹œν‚¬ κ²ƒμž…λ‹ˆλ‹€."

 

λ‚΄κ°€ λ§Œλ“  좔상 클래슀λ₯Ό μ΄μš©ν•˜λŠ” λ‹€λ₯Έ ν”„λ‘œκ·Έλž˜λ¨Έκ°€ νŒŒμƒ 클래슀λ₯Ό λ§Œλ“€μ–΄μ•Ό ν•˜λ©΄ λͺ¨λ“  좔상 λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€λŠ” 사싀을 μžŠμ–΄λ²„λ¦°λ‹€ 해도, μ»΄νŒŒμΌλŸ¬κ°€ 이λ₯Ό μƒκΈ°μ‹œμΌœμ€„ 것이닀. 이것이 μΆ”μƒν΄λž˜μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” μ΄μœ μ΄λ‹€.

728x90