객체 지향 프로그래밍에서 매우 중요한 개념인 상속성과 다형성에 대해 알아보자.
우선 상속과 다형성이 필요한 이유는 C#에서 반복된 코드를 줄이기 위해 사용된다.
이래야 가독성 향상과 해석하는 시간을 줄일 수 있기 때문이며, 유지보수 하기 편리하기 때문이다.
먼저 강아지, 고양이 클래스를 생성 후 동물 클래스를 만들어보자.
class Dog
{
public int Age { get; set; }
public string Color { get; set; }
public Dog()
{
this.Age = 0;
}
public void Eat() { Console.WriteLine("[강아지] 냠냠"); }
public void Sleep() { Console.WriteLine("[강아지] 쿨쿨"); }
public void Bark() { Console.WriteLine("[강아지] 왈왈"); }
}
class Cat
{
public int Age { get; set; }
public Cat()
{
this.Age = 1;
}
public void Eat() { Console.WriteLine("[고양이] 냠냠"); }
public void Sleep() { Console.WriteLine("[고양이] 쿨쿨"); }
public void Meow() { Console.WriteLine("[고양이] 냥냥"); }
}
이렇게 강아지 클래스와 고양이 클래스가 있는데 강아지와 고양이는 같은 동물이라는 개념을 상속한 개체이며
강아지와 고양이의 Eat, Sleep이 같은 기능이라고 가정해보자.
그렇다면 냠냠과 쿨쿨의 데이터 형식만 다를 분 기능은 같고 동물이라는 개념을 상속했으므로
동물 클래스를 따로 만들어 냠냠 쿨쿨은 동물 클래스에 묶는다면 아래처럼 코드의 중복을 줄일 수 있다.
class Animal
{
public int Age { get; set; }
public Animal()
{
this.Age = 0;
}
public void Eat() { Console.WriteLine("[동물] 냠냠"); }
public void Sleep() { Console.WriteLine("[동물] 쿨쿨"); }
}
class Dog : Animal
{
public string Color { get; set; }
public void Bark() { Console.WriteLine("[강아지] 왈왈"); }
}
class Cat : Animal
{
public Cat()
{
this.Age = 1;
}
public void Meow() { Console.WriteLine("[고양이] 냥냥"); }
}
부모 클래스의 필드 멤버가 모두 public이므로 Dog 클래스의 인스턴스를 만들 시
해당 인스턴스에서 자신의 멤버는 물론 부모의 멤버에 모두 접근이 가능하다.
접근 제한자 | 내부 클래스 | 외부 클래스 | 파생 클래스 | 프로젝트 |
public | O | O | O | O |
internal | O | O | O | |
protected | O | O | ||
private | O | |||
protected internal | O | 사용하는 클래스가 같은 어셈블리에 있을 때 접근 가능하다. | O |
protected 접근 제한자는 상속 관계에서만 사용할 수 있다.
private와 비슷하지만 상속한 클래스(파생 클래스)에서 접근이 가능하다.
class Animal // 기반(Base) 클래스에서 다양한 접근 제한자로 메서드 생성
{
private void Private() { }
protected void Protected() { }
public void Public() { }
public void TestA()
{
Private();
Protected();
Public();
}
}
class Dog : Animal // 파생(Derived) 클래스에서 접근할 수 있는 제한자로 생성
{
public void TestB()
{
Protected();
Public();
}
}
static void Main(string[] args)
{
Dog dog = new Dog();
dog.Public(); // 클래스 외부에서 접근이 가능한 메서드는 public만 있다.
}
이름이 겹치는 등 특수한 이유로 부모 메서드에 접근이 불가할 경우 this 키워드와 같은 형태로
base 키워드를 사용한다.(this : 자신을 나타내는 키워드, base : 부모를 나타내는 키워드)
'Unity > c#' 카테고리의 다른 글
6. C# 값 복사와 참조 복사 (0) | 2023.09.08 |
---|---|
5. C# 캡슐화와 프로퍼티 (0) | 2023.09.01 |
4. C# 생성자(Constructor)와 소멸자(Destructor) (0) | 2023.08.06 |
3. C# 메서드, 접근 제한자 (0) | 2023.08.01 |
2. C# - 많이 쓰는 Math 클래스와 클래스의 인스턴스 (0) | 2023.07.17 |
댓글