C# 초보 캠프

Day 10

C# 클래스 만들어 보기

지금까지 작성한 C# 코드들을 자세히 보면, 모든 코드들이 클래스(class) 안에 들어가 있는 것을 알 수 있다. 콘솔 프로그램이나 윈폼 프로그램의 시작 포인트인 Main() 메서드는 Program 이라는 클래스 안에 들어가 있으며, 윈폼의 Form 도 자세히 보면 class 로 정의되어 있고, 버튼이나 콤보박스 등의 컨트롤들도 사실은 class로 정의되어 있다.

윈폼에서 버튼을 드래그앤드롭하여 새로운 버튼을 만드는 것은 사실 Button 이라는 클래스로부터 하나의 인스턴스를 생성하여 button1 이라는 이름의 객체(이를 object 라 한다)를 만든 것이다. 우리가 버튼을 여러번 드래그앤드롭하여 여러 개의 버튼을 만들고 그 이름을 button1, button2, button3 등으로 명명하였는데, 이러한 과정을 클래스로부터 객체를 생성한다고 말한다. 즉, 하나의 클래스로부터 원하는 만큼의 객체를 생성할 수 있는 것이다. C#에서 "객체변수 = new 클래스명();" 과 같이 사용하여 클래스로부터 객체를 생성한다. 이렇게 만들어 진 버튼들은 개발자가 넓이, 높이, 버튼텍스트 등의 속성을 변경함으로써 실제 다른 버튼으로 기능하게 된다.

개발자는 이미 만들어 진 클래스를 많이 사용하지만, 필요에 따라 자신이 새로운 클래스를 정의하여 사용하기도 한다. 클래스는 기본적으로 필드와 메서드를 갖는데, 필드는 데이타를 의미하며, 메서드는 함수 즉 특정한 코드 블럭을 의미한다. 따라서 클래스는 자신에게 필요한 데이타와 그 데이타를 가지고 특정한 행위를 수행하는 함수를 함께 가지고 있다고 볼 수 있다. 물론 경우에 따라 클래스는 메서드 없이 필드만 가지고 있을 수도 있고, 필드 없이 메서드만 가질 수도 있다.

C# 에서 클래스를 정의할 때, 기본적으로 위에서 언급한 필드와 메서드를 정의할 수 있을 뿐만 아니라, 속성(Property)이나 이벤트(event) 등을 정의할 수도 있다. 일반적으로 클래스의 필드는 외부에서 접근할 수 없도록 만드는데, 속성을 사용하여 필요한 필드 (혹은 필드로부터 간단한 연산을 수행한 결과)를 외부에 노출시켜 접근을 허용할 수 있다. (주: Day 9 에 있는 Donation 클래스는 자동 속성이라 불리우는 특별한 속성을 사용한 것인데, 이 용법을 사용하면 컴파일러가 자동으로 해당 속성에 상응하는 필드들을 생성해 준다)

실습

간단한 Custom 버튼 클래스를 작성해 본다. 버튼의 실제 기능보다는 버튼 클래스의 필드, 속성, 메서드 등을 정의해 봄으로써 클래스를 어떻게 만드는지를 알아본다. 아래 예제는 CustomButton 이라는 클래스를 정의한 것으로 버튼의 내부 데이타 격인 필드들과 필드들을 외부에서 접근하게 하는 속성들, 그리고 버튼을 그리는 함수인 메서드를 표현해 본 것이다.
(주: 실제 이 Custom 버튼이 동작하기 위해서는 여러 기능이 추가되어야 하는데, 여기서는 간단한 예를 보이기 위해 의도적으로 복잡한 코드를 생략하였다.)

    using System;
    using System.Drawing;

    namespace Day10
    {
        class CustomButton
        {
            // 필드: 내부 데이타
            private int id;
            private string name;
            private int width;
            private int height;
            private string text;

            // 속성
            public string Name
            {
                get { return this.name; }
            }

            public int Width
            {
                get { return this.width; }
                set { this.width = value; }
            }

            public int Height
            {
                get { return this.height; }
                set { this.height = value; }
            }

            public string Text
            {
                get { return this.text; }
                set { this.text = value; }
            }

            // 메서드
            public void Draw()
            {
                // 버튼을 그리는 코드: 이 코드는 메서드가 어떤 것인지를 보이기 위한
                // 예로서 실제 동작하지는 않음
                Graphics g = this.CreateGraphics();
                Pen p = new Pen(Color.Black);
                Rectangle r = new Rectangle(0, 0, width, height);
                g.DrawRectangle(p, r);
            }

            private Graphics CreateGraphics()
            {
                // Fake
                return Graphics.FromHdc((IntPtr)0);
            }
        }
    }
  • 클래스의 정의는 class 뒤에 클래스명을 써서 정의를 시작한다
  • 클래스에서 필드는 내부 데이타를 의미하므로 일반적으로 외부에서 접근할 수 없도록 private 이라고 설정한다. 외부에서 접근을 허용하기 위해서는 public 으로 표시한다
  • Name 속성은 get 만 있고, set 이 없는데, 이는 외부에서 읽을 수 만 있다는 뜻이다. 외부에서 쓸 수 있게 하기 위해서는 Width 처럼 set 을 작성해야 한다. set 에서 value는 외부에서 할당한 값을 의미한다
  • Draw() 메서드는 public 이므로 외부에서 사용할 수 있고, CreateGraphics() 메서드는 private 이므로 외부에서 사용할 수 없다
  • Draw() 메서드는 버튼을 그리기 위한 코드들을 표현하고 있는데, 실제 그리기 위해서 여러 사항들이 추가되어야 하므로 여기서는 실제 동작하지는 않지만 이런 식의 코드가 들어간다는 점만을 표현하고 있다

C# 코딩 지도를 원하시는 분을 위한 프로그램.
C# 코딩 멘토링



본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.