끝나지 않는 프로그래밍 일기


1. 객체(Object)


이번 강좌에서는 강력한 기능을 제공하는 클래스에 대해서 배우기 전에, 객체 지향 프로그래밍(Object Oriented Programming, OOP)에 대해 알고 넘어가야 하기에 객체 지향 프로그래밍이 도대체 무엇인지에 대해서 설명을 해드리도록 하겠습니다. 우리가 알고있듯 C#은 객체 지향 언어입니다. C#에서의 객체(Object)는 핵심 중에 핵심이라 말할 수 있죠.


오로지 객체만을 다루는 책이 있을정도로 객체를 완벽히 이해하기에는 많은 어려움이 있습니다.


우리 주위에서 객체는 쉽게 찾아볼 수 있습니다. 눈에 보이는 모든 것이 객체가 될 수 있습니다. 지금 앞에 보이는 모니터, 마우스, 키보드, 프린터, 달력, 가방, 자동차 등과 같이 개념상으로 존재하는 것은 모두가 객체가 됩니다. 심지어 생각, 날씨 정보 등도 객체가 될 수 있습니다.



객체들은 각각 상태(state)와 행동(behavior)을 지니고 있습니다. 실세계의 모든 것은 상태와 행동으로 표현할 수 있죠. 전화기를 예로 들자면, 전화기의 색은 상태가 되고 전화기로 전화를 걸거나, 전화를 끊거나 하는 등의 동작은 행동이 됩니다. 또, 자동차를 예로 들자면 자동차의 속도 등이 상태가 될 수 있고, 속도를 올리거나, 속도를 내리거나, 브레이크를 밟거나 하는 등의 동작은 행동이 됩니다.


C# 프로그래밍에선 상태는 데이터(변수)로, 행동은 메소드로 표현할 수 있습니다. 즉, 객체는 데이터와 메소드로 이루어진다는 말과 같습니다. 쉽게 이해하기 위하여 흔히 드는 예를 하나 들겠습니다. 붕어빵이라는 객체를 만들기 위해서는 붕어빵을 찍어낼 틀이 필요합니다. 여기서 붕어빵을 찍어낼 틀은 클래스라고 할 수 있습니다. 붕어빵 틀(클래스)은 하나만 있어도 붕어빵(객체)를 여러 개 찍어낼 수 있죠. 이해되시죠?


2. 클래스(Class)


이제는 우리가 직접 클래스를 한번 만들어보도록 하겠습니다. 클래스는 아래와 같이 선언할 수 있습니다.

[접근 제한자] class 클래스명
{
    // 필드, 메소드 ...
}

위의 예제에서 보이는 접근 제한자는 말 그대로 해당 클래스로의 접근을 제한하고자 할 때 넣는 공간입니다. 접근 제한자에 대해서는 클래스를 배운 뒤에 자세히 다루도록 하겠습니다. 그리고 클래스 내에선 필드, 메소드가 있는데 상태를 필드(field)로 나타내고, 행동을 메소드(method)로 가진다고 생각하시면 됩니다.


클래스에 대한 이해를 돕기위해, 개를 추상화하여 클래스로 만들어 보도록 하겠습니다. 여기서 추상화란, 불필요한 부분은 과감히 없애버리고 중요한 부분에만 중점을 두어 간략화 시킨 것을 말합니다. 아래는 개를 추상화하여 클래스로 선언한 예제입니다.

..
class Dog {
    private string name; // 개의 이름을 나타내는 필드
    private string gender; // 개의 성별을 나타내는 필드
    private string ownernames; // 개의 주인 이름을 나타내는 필드

    public void Bark() // 짖는 행동
    {
        Console.WriteLine("{0} : 멍멍!", name);
    }
}
...

아래는 위의 코드에서 덧붙여 완성시킨 예제입니다.

using System;

namespace ConsoleApplication1
{
    class Dog
    {
        public string name; // 개의 이름을 나타내는 필드
        public string gender; // 개의 성별을 나타내는 필드
        public string ownernames; // 개의 주인 이름을 나타내는 필드

        public void Bark() // 짖는 행동
        {
            Console.WriteLine("{0} : 멍멍!", name);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Dog dog = new Dog();
            dog.name = "칸";
            dog.gender = "남";
            dog.ownernames = "철수";

            dog.Bark();

            Console.WriteLine("개의 이름: {0}, 개의 성별: {1}, 개의 주인이름: {2}", dog.name, dog.gender, dog.ownernames);
        }
    }
}

결과:

칸 : 멍멍!

개의 이름: 칸, 개의 성별: 남, 개의 주인이름: 철수

계속하려면 아무 키나 누르십시오 . . .


코드를 보시면 5행에서 Dog라는 클래스가 등장합니다. 이 클래스 안을 살펴보면 개의 이름을 나타내는 필드, 성별을 나타내는 필드, 주인 이름을 나타내는 필드와 짖는 행동을 취하는 메소드가 존재합니다. 24행을 보시면 Dog라는 틀로 dog라는 객체를 만들고 있습니다. 25~28에서 멤버 변수(필드와 같은 말)의 값을 초기화시키고 있습니다. 그런 뒤에 dog 객체 내에 있는 Bark라는 메소드를 호출하고 있습니다. 그 후에는 개의 이름, 개의 성별, 개의 주인이름을 가져와 출력시키고 프로그램이 종료됩니다.


이 코드중에서 주목하셔야 할 부분은 바로 21행의 코드입니다.

Dog dog = new Dog();

위 코드는 new 키워드 뒤에 등장하는 Dog 클래스를 기반으로 하여 dog라는 객체를 만듭니다. 마지막에 등장하는 Dog()는 생성자라고 하는데, 생성자는 접근 제한자, 소멸자, this와 같이 다음 강좌에서 배워보도록 하겠습니다. 아래는 new 키워드를 이용한 객체의 생성 방법입니다.

클래스명 식별자 = new 클래스명();

지금까지, 클래스의 선언 방법과 객체의 생성 방법, 멤버 변수에 접근하는 등 여러 가지를 알아보았습니다. 클래스는 여기가 끝이 아니라 지금부터 시작임을 명심하셔야 합니다. 여기까지 보느라 수고하셨고, 다음 강좌에서는 접근 제한자, this에 대해 알아보도록 하겠습니다.