본문 바로가기
컴퓨터/C#

[C#] 캡슐화, 상속

by 아기상어  2020. 6. 1.
            Computer[] machines;
            machines = new Computer[3];

            machines[0] = new NoteBook();
            machines[1] = new Desktop();
            machines[2] = new NetBook();

            DeviceManager manager = new DeviceManager();
            foreach(Computer device in machines)
            {
                manager.TurnOff(device);
            }

캡슐화

클래스 내에 외부에서 바로 수정할수 없도록 변수를 private로 선언한 다음 메소드를 통해 값을 호출하거나

수정하는 방식. 이 메서드를 통해 값을 수정할때 개발자가 정한 범위 내에서만 사용할 수 있게끔 만들수도 있다.

 

 

프로퍼티

캡슐화를 쉽게 하기위한 수단. get 으로 클래스의 원하는 변수값을 리턴받고 set으로 클래스이 변수값을 수정할 수 있게 만들어 준다. 컴파일 할때에는 각각 get메서드와 set 메서드로 비주얼 스튜디오가 자동으로 바꿔서 컴파일 하게된다.

 

 

예제) 차의 시속이 150km가 넘지 않도록 하기

        class Car
        {
            int iSpeed; //  iSpeed를 캡슐화 시켰다
            public int Speed    //  프로퍼티는 컴파일 할떄 set, get 메서드로 분리된다.눈속임
            {
                get { return iSpeed; }
                set 
                { 
                    if (150 < value)
                    { 
                        value = 150; 
                    }
                    iSpeed = value; 
                }
            }
        }
        static void Main(string[] args)
        {
            Car mycar = new Car();
            mycar.Speed = 100;// set으로 speed 설정
            Console.WriteLine("현재 속도 : 시속 {0}km", mycar.Speed);//get에서 리턴값받음
            mycar.Speed = 300;
            Console.WriteLine("현재 속도 : 시속 {0}km", mycar.Speed);
        }
    }

 

 

 

 

상속 136p

상속받을 때 기호를 사용한다

public 자녀클래스 : 부모클래스

상속을 못받도록도 가능함. sealed

sealed class Pen

C#은 단일상속만 가능하다 예를들어 class NoteBook : Computer, Machine 이 불가능 

 

 

 

    public class Computer
    {
        protected bool powerOn;
        public void Boot()
        {
            Console.WriteLine("컴퓨터를 킵니다");
        }
        public void Shutdown()
        {
            Console.WriteLine("컴퓨터를 종료합니다");
        }
        public void Reset()
        {
            Console.WriteLine("컴퓨터를 리셋합니다");
        }
        bool fingerScan;
        public bool HasFingerScanDevice()
        {
            return fingerScan;
        }
    }
    public class NoteBook : Computer
    {

    }
    public class Desktop : Computer
    {

    }
    public class NetBook : Computer
    {

    }
    class Program
    {
        static void Main(string[] args)
        {
            NoteBook notebook = new NoteBook();
            Computer pc1 = notebook;   //   자식클래스는 부모클래스를 가지고있음. 묵시적 형변환을 허용함
        
            NoteBook note2 = (NoteBook)pc1; //명시적 형변환,노트북 형이 없는데 있다고 하고 컴파일 했기 때문에 이것으로 인한 문제점은 개발자 책임.
            object z = pc1; //  z는 최고 조상
        }
    }

 

  부모클래스를 두고 자식클래스를 여러개 두면 부모클래스를 상속받아 자식클래스로 선언할 수 있어서

 

여러개의 클래스를 관리하기가 쉬워진다.

 

            NoteBook notebook = new NoteBook();
            Desktop desktop = new Desktop();
            NetBook netbook = new NetBook();

            DeviceManager manager = new DeviceManager();
            manager.TurnOff(notebook);
            manager.TurnOff(desktop);
            manager.TurnOff(netbook);