Protected


    class Car
    {
        // member field
        private bool disel;     // disel은 파생 클래스에서 사용하지 못함
        protected bool gasoline;// gasoline은 파생 클래스에서 사용가능하나 클래스 외부에서는 호출하지 못함
        protected int wheel = 4;// wheel은 파생 클래스에서 사용가능하나 클래스 외부에서는 호출하지 못함


        // constructor
        protected Car() { disel = true; gasoline = true;  }
        protected Car(int wheel) { this.wheel = wheel; disel = false; gasoline = false; }


        // method
        protected void Move()
        {
            if (disel)
                Console.Write(“Car 디젤 “);
            Console.WriteLine(“바퀴 {0} 자동차가 굴러다닌다”, wheel);
        }
    }


    class Sedan : Car
    {
        // member field
        private bool gasoline;  // 파생 클래스에서 기반클래스에 멤버필드명이 같다면 default는 자신의 멤버부터 호출 &
Sedan.gasoline은 Car.gasoline을 숨김 => private new bool gasoline와 같은 의미


        // constructor
        public Sedan() { gasoline = false;  }                      // Sedan() : base() 호출
        public Sedan(int wheel) : base(wheel) { gasoline = true; } // Sedan(int wheel) :
base(int wheel)를 호출 – protected 생성자는 기반 클래스의 생성자 호출 base에서 사용됨


        // method
        public void SedanMove()
        {
            if (base.gasoline)                              // base의 gasoline과 this의 gasoline을 구분해야하는 경우
                Console.Write(“Car 가솔린 “);
            if (this.gasoline)
                Console.Write(“SedanCar 가솔린 “);
            Console.WriteLine(“바퀴 {0} 승용차가 굴러다닌다”, wheel);
        }


        static void Main(string[] args)
        {
            // error CS1540: ‘Car’형식의 한정자를 통해 보호된 ‘Car.Car()’ 멤버에 액세스할 수 없습니다. 한정자는 ‘Sedan’ 형식이거나 여기에서 파생된 형식이어야 합니다.
            //Car myCar = new Car();    // 기반 클래스 생성자 Car()는 상속되지 않음. 따라서 new를 이용하여 객체를 생성할 수 없음.
            //myCar.Move();             //  myCar 객체없이 myCar.Move() 호출할 수 없음
            //Console.WriteLine(“마이카의 바퀴는 {0}개 이다.”, myCar.wheel); // myCar 객체없이 myCar.wheel 호출할 수 없음


            // 바퀴 4개 디젤 자동차
            Sedan myCar1 = new Sedan();
            myCar1.Move();       // Car를 상속받았기 때문에 Move() 메소드를 사용할 수 있음
            myCar1.SedanMove();  // Sedan 자신의 메소드 사용가능
            Console.WriteLine(“마이카의 바퀴는 {0}개 이다.”, myCar1.wheel); // 상속된 객체에서 기반 객체의 protected 멤버 필드 호출가능


            Console.WriteLine();


            // 바퀴 6개 가솔린 자동차
            Sedan myCar2 = new Sedan(6);
            myCar2.Move();       // Car를 상속받았기 때문에 Move() 메소드를 사용할 수 있음
            myCar2.SedanMove();  // Sedan 자신의 메소드 사용가능
            Console.WriteLine(“마이카의 바퀴는 {0}개 이다.”, myCar2.wheel); // 상속된 객체에서 기반 객체의 protected 멤버 필드 호출가능
        }
    }


Leave a Reply

Your email address will not be published. Required fields are marked *