본문 바로가기
Unity/c#

7. C# 상속성

by RongBee 2023. 9. 21.

객체 지향 프로그래밍에서 매우 중요한 개념인 상속성과 다형성에 대해 알아보자.

 

우선 상속과 다형성이 필요한 이유는 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 : 부모를 나타내는 키워드)

 

 

 

 

 

 

댓글