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. 추상 클래스
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.(부모의 일반 메서드 호출)