Media Log


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에 대해 알아보도록 하겠습니다.

  1. C# at 2012.10.18 17:07 신고 [edit/del]

    강의 감사합니다 ㅎㅎ

    Reply
  2. 김승현 at 2012.10.20 13:25 신고 [edit/del]

    감사합니다~

    Reply
  3. UW at 2012.11.27 18:55 신고 [edit/del]

    질문이 있는데요
    왜 굳이 클래스를 여러개 만드는거죠?
    위에 예제를 보면 메소드를 여러개 만들면 클래스를 굳이 더 만들지않아도 충분히 원하는 결과를 얻을수잇을거같은데...
    제가 잘 모르는건가요ㅠㅠ 아직 클래스에 대해 제대로 이해못한거같아요

    Reply
    • BlogIcon EXYNOA at 2012.11.27 19:15 신고 [edit/del]

      지금은 필요없다고 느껴지실지도 모르겠지만, 규모가 큰 프로젝트를 진행하다 보면 기능을 추가하게 될때 클래스의 도움을 받지 않고 오로지 메서드로, 배열로 채워버린 경우 무엇하나 건들이면 프로그램 전체가 꼬여버릴 수 있습니다.

      클래스를 사용하면, 프로그램의 관리가 용이하고 유지보수시에 상당히 큰 도움이 되는 녀석입니다. 그리고 클래스의 특징을 좀 더 살펴보시면 '다형성'이라는 녀석이 있는데, 한번 클래스를 만들고 사용하다 보시면 알게 되실거에요.

    • UW at 2012.11.28 11:00 신고 [edit/del]

      아...편리성떄문이 가장 큰 이유인건가요?

    • BlogIcon EXYNOA at 2012.11.28 19:11 신고 [edit/del]

      꼭 편리성뿐만은 아닙니다. 구조적 프로그래밍을 이해하시면 클래스를 왜 사용하게 되는지, 조금이라도 아시게 될 것 같네요.

  4. KkK at 2013.08.03 19:19 신고 [edit/del]

    window 응용 프로그램에서 예제 연습하려면 어떤식으로 예제 적용해야 하나요 ?

    Reply
    • BlogIcon EXYNOA at 2013.08.04 01:18 신고 [edit/del]

      콘솔 환경에서 적응하시다가, 어느정도 개념을 익히신 정도면 MSDN 참고하시면서 윈도우 폼 환경에서 진행해보세요.

      MSDN가 설명이 난해하거나 오역때문에 이해가 안되는 경우는, MSDN 말고도 윈도우 폼을 설명해둔 게시글들이 많이 있으니 한번 검색하셔서 찾아보세요.

    • KkK at 2013.08.05 10:44 신고 [edit/del]

      네 감사합니다~

  5. ZiNee at 2013.10.15 10:49 신고 [edit/del]

    드디어 객체지향 강좌까지 왔네요. OOP를 단 10% 만이라도 이해할 수 있다면 좋겠어요. 좋은 강좌 감사합니다.

    Reply
  6. BlogIcon L0GIC at 2013.12.08 17:10 신고 [edit/del]

    오호, 멤버와 필드가 같은 의미인거 처음알아가네요.

    좋은 강좌 감사합니다.

    Reply
  7. PohnNoies at 2013.12.09 10:22 신고 [edit/del]

    음... Class가 객체가 되는건지 Namespace가 객체가 되는건지 햇갈리네요..
    Class를 구성하는것은 Method와 Value이고.
    Namespace를 구성하는것은 Class...
    여기서 Namespace는 그냥 공간만 할당해주는것이지.. 객체라고 따로 지정되지않는건가요..?
    Namespace는 항상 만들어지면서도 기능을 잘 모르겠어요..

    Reply
    • BlogIcon EXYNOA at 2013.12.11 18:46 신고 [edit/del]

      클래스는 객체가 아니라 객체를 만들어내는 틀일 뿐이고, 네임스페이스는 논리적 그룹으로 나누는 것입니다. 저도 지식이 미약하여 자세한 설명을 못해드리는 점은 죄송합니다 (_ _)..

    • oz at 2015.08.04 14:34 신고 [edit/del]

      namespace 는 클래스가 속해 있는 주소 개념으로 보면 됩니다.
      자바에서의 package 의 개념과 비슷하죠 (맞죠? ㅎㅎ)

      언제 유용하냐하면,
      이 세상에 C#으로 정의된 클래스가 1억개 정도 있다고 치면,
      이중에 똑같은 이름의 클래스가 없다고 보장할 수 있을까요?
      단연코 없습니다.
      그래서 namespace 로 묶어 두면 편하게 분류해서 해당 클래스를 가져올 수 있죠.

  8. peter at 2014.09.08 07:51 신고 [edit/del]

    public void bark()는 왜 뒤에 세미콜론이 붙지 않는 이유가 궁금해요?
    그리고,뒤에 ()만 있을 때의 기능이 궁금해요...

    좋은 강의 감사합니다.

    Reply
    • oz at 2015.08.04 14:30 신고 [edit/del]

      함수를 사용할 땐 뒤에 ; 을 붙이지만
      구현(define) 할땐 붙이지 않습니다.

      C/C++ 에서는 정의(declare)할땐 붙입니다만...

  9. MT at 2017.07.31 15:24 신고 [edit/del]

    언제나 강좌 잘 보고 있습니다.
    위에 Dog 클래스에서 접근자를 private로 설정하셨는데 아래에 new Class 예문에서는 public으로 접근자가 변경되었는데 위에서 복붙해서 자기가 덛붙이려고 시도한 학생들은 왜 안되는지 고민할 가능성이 있을 것 같아요. 추가설명 또는 수정이 있으면 좋을 것 같습니다!(위에 접근자 공부하다가 다시 돌아와서 비교해보니 보여서 달아봤습니다. 지금 컴파일러를 켜볼 수 없는 환경이라, 혹시 제가 잘못 이해하고 있는거면 리플 삭제하겠습니다. ㅠ..)

    Reply

submit

티스토리 툴바