더북(TheBook)

47.6 클래스의 멤버 종합 연습: 자동차 클래스 구현하기

이번에는 자동차 클래스를 만들고 클래스의 주요 멤버를 모두 사용하는 예제를 작성하면서 전체 키워드를 정리하는 연습을 하겠습니다. 코드에 있는 #region#endregion은 예제 다음 단락에서 바로 이어서 설명할 것입니다. 소멸자 내용을 보려면 닷넷 프레임워크(.NET Framework) 기반으로 콘솔 앱을 만드세요. 일단 다음 내용을 입력한 후 실행해 보세요.

자동차 클래스 구현: CarWorld.cs

using System;
using System.Collections;

/*
*① 네임스페이스: 클래스 이름 충돌 방지
*/
namespace CarWorld
{
    //② 인터페이스: 표준, 다중 상속
    interface IStandard { void Run(); }

    ///<summary>
    ///③ 클래스: 설계도
    ///</summary>
    class Car : IStandard
    {
        #region ④ 필드: Private Member Variables
        private string name;                       //필드: 부품
        private string[] names;                   //배열형 필드
        private readonly int _Length;              //읽기 전용 필드
        #endregion

        #region ⑤ 생성자: Constructors
        public Car()
        {
            this.name = "좋은차";                  //필드를 기본값으로 초기화
        }
        public Car(string name)                    //생성자: 시동, 필드 초기화
        {
            this.name = name;
        }
            public Car(int length)
        {
            this.Name = "좋은차";
            _Length = length;                     //읽기 전용 필드는 생성자로 초기화 가능
            names = new string[length];           //넘어온 값으로 요소 생성
        }
        #endregion

        #region ⑥ 메서드: Public Methods
        //메서드: 기능/동작
        public void Run() => Console.WriteLine("{0} 자동차가 달립니다.", name);
        #endregion

        #region ⑦ 속성: Public Properties
        public string Name                        //속성: private 필드 -> 외부 공개
        {
            get { return name; }
            set { name = value; }
        }
        public int Length { get { return _Length; } }
        #endregion

        #region ⑧ 소멸자: Destructor
        ~Car()                                    //소멸자: 폐차, 만들어진 객체가 소멸될 때
        {
            Console.WriteLine("{0} 자동차가 폐차됨.", name);
        }
        #endregion

        #region ⑨ 인덱서: Indexer
        public string this[int index]              //인덱서: 카탈로그화
        {
            get { return names[index]; }
            set { names[index] = value; }
        }
        #endregion

        #region ⑩ 이터레이터: Iterators
        public IEnumerator GetEnumerator()    //반복기
        {
            for (int i = 0; i < _Length; i++)
            {
                yield return names[i];
            }
        }
        #endregion

        #region ⑪ 대리자: Public Delegates
        public delegate void EventHandler(); //대리자: 다중 메서드 호출
        #endregion

        #region ⑫ 이벤트: Public Events
        public event EventHandler Click;     //이벤트
        #endregion

        #region ⑬ 이벤트 처리기: Event Handlers
        public void OnClick()               //이벤트 핸들러
        {
            if (Click != null)
            {
                Click();
            }
        }
        #endregion
    }

    class CarWorld
    {
        static void Main()
        {
            //ⓐ 클래스, 생성자, 메서드 테스트
            Car campingCar = new Car("캠핑카");
            campingCar.Run();              //캠핑카 자동차가 달림

            //ⓑ 속성 테스트
            Car sportsCar = new Car();
            sportsCar.Name = "스포츠카";
            sportsCar.Run();              //스포츠카 자동차가 달림

            //ⓒ 인덱서 테스트
            Car cars = new Car(2);
            cars[0] = "1번 자동차";
            cars[1] = "2번 자동차";
            for (int i = 0; i < cars.Length; i++)
            {
                Console.WriteLine(cars[i]);
            }

            //ⓓ 이터레이터 테스트
            foreach (string name in cars)
            {
                Console.WriteLine(name);
            }

            //ⓔ 대리자, 이벤트, 이벤트 처리기 테스트
            Car btn = new Car("전기자동차");
            btn.Click += new Car.EventHandler(btn.Run);
            btn.Click += new Car.EventHandler(btn.Run);
            btn.OnClick();
        }
    }
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.