본문 바로가기

C#

C# - 프로퍼티 문법/상속 복습(0603)

반응형

프로퍼티 

접근자/설정자 메서드를 둬서 필드 접근에 대한 단일 창구를 제공하는 것은 바람직하지만 호출을 위한 메서드 정의를 일일이 코드로 작성하자면 분명 번거로울 것이다. 이같은 단점을 보완하기 위해 c#에서는 특별히 프로퍼티라는 문법을제공한다.

 

*아쉽게ㅔ도 프로퍼티도 속성으로 번역되는데 이경우 객체지향에서 말하는 속성과 혼동될 수 있다 ,즉 객체지향에서 말하는 속성은  c# 에서는 필드에 해당하고 속성은 접근자 설정자 메서드에 대한 편리한 구문에 해당한다.  경우에 따라

c# 의 프로퍼티는 보통 public으로 되는 경우가 많아 공용 속성이라고 구분해서 부르기도 한다. 

 

프로퍼티 정의는 필드를 접근자/설정자 메서드로 정의하던 것과 비교하면 확실히 간단하다.

namespace _20200603_복습에대한_의지가_자꾸_꺾이고_있다
{ 
    class Car
    {
        int iSpeed;
        public int getspeed()
        {
            return iSpeed;
        }
        public void setspeed(int _iSpeed)
        {
            
            if (_iSpeed > 150)
            {
                _iSpeed = 150;
            }
            iSpeed = _iSpeed;

        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Car Mycar = new Car();
            Mycar.setspeed(300);
            Console.WriteLine("현재속도는 : 시속 {0} 입니다.", Mycar.getspeed());
        }
    }
}

 

위의 코드를 프로퍼티 문법을 통해 변경해보자

 

namespace _20200603_프로퍼티_문법_아_어렵네
{
    class car
    {
        int _ispeed;
        public int ispeed
        {
            get { return _ispeed; }
            set {
                if (value > 150)
                {
                    value = 150;
                }
                _ispeed = value;
                }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            car mycar = new car();
            mycar.ispeed = 100;
            //int _ispeedValue = mycar.ispeed;
            Console.WriteLine(mycar.ispeed);
            mycar.ispeed = 3000;
            Console.WriteLine(mycar.ispeed);



        }
    }
}

이렇게 변경할 수 있다 이거 외워야하는 거 같다 .

 

 

 

 

 

Pi 프로퍼티의 정의를 보면 대체로 어렵지 않게 이해할 수 있지만 set의 value는 도대체 어디서 온 것일까 ? 설정자 메서드는 사용자가 전달하는 값을 

 

 

상속

 

현실세계를 다시한번 관찰해 보자 인간과 침팬지는 영장류에 속한다그리고 영장류와 고래 ,기린 둥운 포유류에 속한다.

이런 식으로 현실 세계는 어떤 공통적인 특징이 있고 그특징을 상속 받아 다른 세부적인 항목을 정의 하는데 일상적인 많은 객체가 이러한 계층적인 관계를 따르고 있다 .또 다른 예로 노트북 데스크톱 넷북이라는 타입을 정의한다고 해보자 공통적으로 그것들은 부팅 끄기 리셋과 같은 행위와 전원이 들어와 있는지에 대한 상태값을 제공하는데 이를 정리하면 모두 컴퓨터라는 특징에서 나온것입을 알수 있다 만약 상속이라는 개념이 없다면 노트북 데스크톱 넷북 클래스는 다음과 같이 각각 개별적을 메서트와 상태 값을 정의해야만 한다.

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _20200603_상속_간단하게
{
    public class Computer
    {
        protected bool PowerOn; 
        public void Boot()
        {
            Console.WriteLine("컴퓨터 전원을 킵니다.");
        }
        public void ShutDown()
        {
            Console.WriteLine("컴퓨터 전원을 끕니다.");
        }
        public void Reset()
        {
            Console.WriteLine("컴퓨터를 재부팅 합니다.");
        }
    }

    public class NoteBook : Computer
    {

    }
    public class DeskTop : Computer
    {

    }
    public class NetBook : Computer
    {

    }
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("===================");
            NoteBook noteBook = new NoteBook();
            noteBook.Boot();
            noteBook.ShutDown();
            noteBook.Reset();
            Console.WriteLine("===================");
            DeskTop deskTop = new DeskTop();
            deskTop.Boot();
            deskTop.ShutDown();
            deskTop.Reset(); 
            Console.WriteLine("===================");
            NetBook netbook = new NetBook();
            netbook.Boot();
            netbook.ShutDown();
            netbook.Reset();

        }
    }
}

 부모 클래스는 다른 말로 기반 클래스 또는 슈퍼 클래스라고도 한다 그 자식 클래스는 다른 말로 파생 클래스 또는 서브 클래스라고도 한다. 아울러 부모 또한 부모를 가질 수 있기 때문에 조상 클래스라는 표현이 있으면 반대로 자손 클래스라는 표현도 있다.

namespace _20200603_상속_간단하게
{
    public class Computer
    {
        protected bool PowerOn; 
        public void Boot()
        {
            Console.WriteLine("컴퓨터 전원을 킵니다.");
        }
        public void ShutDown()
        {
            Console.WriteLine("컴퓨터 전원을 끕니다.");
        }
        public void Reset()
        {
            Console.WriteLine("컴퓨터를 재부팅 합니다.");
        }
    }

    public class NoteBook : Computer
    {
        void test()
        {
            Boot();
            ShutDown();
            Reset(); //부모 클래스에서 생성된 객체를 자식 객체에 대입해도 문제가 없다.
        }
    }
    public class DeskTop : Computer
    {

    }
    public class NetBook : Computer
    {

    }
    class Program
    {
        static void Main(string[] args)
        {
            NoteBook noteBook1 = new NoteBook();
            Computer computer = noteBook1; //이게 나타내는 게 조상클래스에서 생성된 객체가 후손클래스 객체와 같다고 명시하는데 문제가 없다.
            
            

 

 

 

클래스의 형변환에서 빠질 수 없수 없는 것이 바로  as 연산자다 예제 4.10을 통해 캐스팅 연산자를 사용해 명시적 형변환을 하는 경우 컴파일 단계가 아닌 프로그램을 샐행할 때 옲가 발생한다는 것을 알았다. 

닷넷 프로그램에서 옲를 발생시키는 것은 내부적으로 제법 부하가 큰 동작에 속한다. 따라서 오류를 발생시키지 않고도 형변환이 가능한지 확인할 수 있는 방법이 필요했고 이를 위해 as 연산자가 추가 됐다 예제 4.10을 오류가 발생하지 않는 코드로 바꾸려면 다음과 같이 as를 사용할수 있다 .

반응형