재밌고 어려운 IT를 이해해보자~!

클래스의 상속 본문

C#

클래스의 상속

언제나즐거운IT 2024. 6. 30. 15:54
class 부모 클래스
{
    // ...
}
 
class 자식 클래스 : 부모 클래스
{
    // 부모 클래스의 모든 상태와 행동이 전달 됨.
}

 

은 private로 선언된 멤버는 상속할 수 없다.

 

using System;
 
namespace ConsoleApplication8
{
    class Parent
    {
        public int num;
 
        public Parent()
        {
            Console.WriteLine("부모 클래스의 생성자가 호출되었습니다.");
        }
    }
 
    class Child : Parent
    {
        public Child(int num)
        {
            this.num = num;
            Console.WriteLine("자식 클래스의 생성자가 호출되었습니다.");
        }
 
        public void DisplayValue()
        {
            Console.WriteLine("num의 값은 {0} 입니다.", num);
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            Child cd = new Child(20);
 
            cd.DisplayValue();
        }
    }
}

 

sealed

클래스명 앞에다 sealed 키워드를 사용하게 되면, 이 클래스를 상속시키는 건 더이상 할 수 없다.

 

  sealed class Parent
    {
        public int num;
 
        public Parent()
        {
            Console.WriteLine("부모 클래스의 생성자가 호출되었습니다");
        }
    }
 
    class Child : Parent
    {
        public int num;
 
        public Child(int num)
        {
            this.num = num;
            Console.WriteLine("자식 클래스의 생성자가 호출되었습니다.");
        }
        public void DisplayValue()
        {
            Console.WriteLine("num의 값은 {0} 입니다.", num);
        }
    }

 

 

 

 set, get

 

set, get 접근자는 각각 속성을 읽거나, 새 값을 할당할 때 사용된다.

 

멤버변수 접근시 사용

 

using System;
 
namespace ConsoleApplication14
{
    public class MyClass
    {
        private string name = "John";
 
        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            MyClass mc = new MyClass();
 
            Console.WriteLine("mc.Name : {0}", mc.Name);
 
            mc.Name = "Bree";
 
            Console.WriteLine("mc.Name : {0}", mc.Name);
        }
    }
}

 

메소드 재정의(virtual, override)

 

부모 클래스의 메소드를 자식 클래스에서 다시 정의하고 싶을때 virtual, override 키워드가 사용딘다.

virtual 키워드는 자식 클래스에서 메소드를 재정의 하고 싶을때 재정의 될 부모 클래스의 메소드에 사용되며, override 키워드는 부모 클래스 내에서 virtual로 선언된 메소드를 재정의 하겠다는 표시를 하는 것과 같다.

 

using System;
 
namespace ConsoleApplication21
{
    class Parent
    {
        public virtual void A()
        {
            Console.WriteLine("부모 클래스의 A() 메서드 호출!");
        }
    }
    class Child : Parent
    {
        public override void A()
        {
            Console.WriteLine("자식 클래스(Child)의 A() 메서드 호출!");
        }
    }
    class Daughter : Parent
    {
        public override void A()
        {
            Console.WriteLine("자식 클래스(Daughter)의 A() 메서드 호출!");
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            Parent parent = new Parent();
            parent.A();
 
            Child child = new Child();
            child.A();
 
            Daughter daughter = new Daughter();
            daughter.A();
        }
    }
}

 

 

멤버 숨기기(new)

 

new 지정자를 사용하면 부모 클래스의 멤버를 숨길 수 있게된다.
부모 클래스에서 정의된 메소드, 멤버 변수의 이름이 자식 클래스에도 같은 이름으로 존재한다면 부모 클래스의 멤버는 new 지정자를 사용하지 않아도 숨길 수 있으나, 부모 클래스의 멤버가 숨겨진다는 경고가 발생합니다. 이 경고는 new 지정자를 사용하면 사라진다.

 

using System;
 
namespace ConsoleApplication21
{
    class Parent
    {
        public int x = 100;
        public void A()
        {
            Console.WriteLine("부모 클래스의 A() 메서드 호출!");
        }
    }
    class Child : Parent
    {
        public new int x = 200;
        public new void A()
        {
            Console.WriteLine("자식 클래스(Child)의 A() 메서드 호출!");
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            Parent parent = new Parent();
            parent.A();
            Console.WriteLine("x : {0}", parent.x);
 
            Child child = new Child();
            child.A();
            Console.WriteLine("x : {0}", child.x);
        }
    }
}
 

업캐스팅과 다운캐스팅(Upcasting and Downcasting)

 

class Animal {  }
 
class Dog : Animal {  }
 
Dog dog = new Dog();
Animal animal = dog; // 업캐스팅
Dog sameDog = (Dog)animal; // 다운캐스팅

'C#' 카테고리의 다른 글

확장 메소드, 분할 클래스, 중첩 클래스  (0) 2024.07.01
접근제한자  (0) 2024.06.30
클래스  (0) 2024.06.30
배열  (0) 2024.06.30
메소드  (0) 2024.06.29
Comments