[C# 객체지향] 타입 유형 확장1_클래스

eunjin lee·2022년 6월 25일
0

C# 9.0 프로그래밍

목록 보기
9/50


1. 중첩 클래스

  • 한 클래스 안에서만 쓰이는 클래스가 있다면, 중첩 클래스로 만든다.

  • 클래스 내부에 접근 제한자를 생략한 클래스를 멤버로 정의하면, private이 지정되어 클래스 외부에서 인스턴스를 직접 생성하는 것이 불가능하다.

  • ✍ 샘플 코드

namespace Pjt0618
{
    class Test
    {
        static void Main(string[] args)
        {
            Computer computer  = new Computer();
            CPU cpu = new CPU(); // 컴파일 오류
            Ram ram = new Ram(); // 컴파일 오류
        }
    }
}
namespace Pjt0618
{
    internal class Computer
    {
        CPU cpu;
        RAM ram;
        public Computer()
        {
            cpu = new CPU();
            ram = new RAM();
        }
        class CPU
        {

        }

        class RAM
        {

        }
    }

}


2. 추상 클래스

  • 부모 클래스의 인스턴스를 생성하지 못하게 하면서, 자식 클래스가 반드시 특정 메서드를 재정의하도록 강제하고 싶을 때 사용한다.
  • 재정의를 강제하고 싶은 메서드 앞에 abstract 예약어를 지정하고, 해당 메서드가 있는 클래스 앞에도 abstract 예약어를 지정한다.
  • abstract 메서드에는 접근 제한자로 private을 지정할 수 없다. 반드시 자식 클래스에서 재정의해야하기 때문이다.
  • 자식 클래스에서 abstract 메서드를 재정의 하지 않으면, 컴파일 오류가 발생한다.
  • ✍ 샘플 코드
    class Test
    {
        static void Main(string[] args)
        {
            Animal dog = new Dog();
            Animal cat = new Cat();

            dog.Cry();
            cat.Cry();

            dog.Sleep();
            cat.Sleep();

            dog.Eat();
            cat.Eat();  
        }
    }

    abstract class Animal
    {
        int energy = 0;

        public abstract void Cry();
        public virtual void Sleep()
        {
            Console.WriteLine("zzzzzz");
        }
        public void Eat()
        {
            Console.WriteLine(++this.energy+" is my energy."); 
        }
    }

    class Cat : Animal
    {
        public override void Cry()
        {
            Console.WriteLine("Meow");
        }
    }

    class Dog : Animal
    {
        public override void Cry()
        {
            Console.WriteLine("Bow-wow");
        }

        public override void Sleep()
        {
            Console.WriteLine("Go to its master.");
            base.Sleep();
        }
    }
  • ✅ 결과
    Bow-wow (abstract 메서드를 재정의 한 것)
    Meow (abstract 메서드를 재정의한 것)

    Go to its master. (virtual 메서드를 재정의 한 것)
    zzzzzz (base.Sleep()으로 virtual 메서드 호출)
    zzzzzz (별도로 재정의 하지 않아 virtual 메서드 호출)

    1 is my energy.(부모의 일반 메서드 호출)
    1 is my energy.(부모의 일반 메서드 호출)

0개의 댓글