2019. 1. 31. 00:49

드디어 C#하면 빼놓을수 없는 객체지향에 대해서 언급할때가 왔습니다.
객체지향프로그래밍(object-oriented programming) OOP 라고 합니다.

OOP란 해석을 직역하자면 객체지향프로그래밍이라고 하는데, 저는 참 맘에 듭니다.
객체를 지향해서 프로그래밍을 하겠다라는뜻입니다.
하지만 OOP는 꼭 프로그래밍 기법만은 아닙니다.
객체지향이라는 철학에 가깝다고 말할수있습니다.
"세상의 모든것을 객체(사물의 특성과 행위/기능) 중심으로 보라"

MicroSoft사가 처음으로 객체지향언어인 C++을 만들어서, 자신들이 처음으로 객체지향기법을 썼다
라고 말을 하고 있지만, 저도 들은바로는 그건 프로그래밍 기법이 아니라, 실제 우리가 살아가는 환경
에 이미 있는 개념이라고 합니다.
그 철학적인(?) 개념을 프로그래밍설계기법으로 구현한것입니다.

지금까지의 절차지향의 대표적인 언어인 C를 예를 들고 싶지만,,,,
C언어를 하지 않으신분들이 많기 때문에, 그냥 설명해야겠네요.

객체지향기법과 절차지향기법에 대해서 간략히 비교해보고 클래스로 넘어가야할거 같습니다.

1. 절차지향기법 : 프로그래밍의 흐름을 마치 알고리즘에 기반을 두고 프로그램을 합니다.
  - 말그대로 흐름이 가는대로 쭈욱~~~늘여뜨려 프로그래밍을 하기때문에,
  - 완전히 컴퓨터의 로직(Logic)에 의해 프로그래밍이 됩니다.

2. 객체지향기법 : 실상활에서 프로그램의 중심을 객체라는 사물로 두어, 사물의 속성이나, 행위,
                        기능등을 추상적으로 표현하여 프로그램하는 기법입니다.
  - 여기서 추상적이란 !!!!? 
추상 : 여러 가지 사물이나 개념에서 공통되는 특성이나 속성 따위를 추출하여 파악하는 작용.
  - 간단한 코드를 보고 설명을 하겠습니다.

using System;
class Human
{
      public string Name;
       public int      Age;
       
       public Human(string name, int age)
       {
           this.Name = name;
           this.Age = age;
       }
       public void Eat() { Console.WriteLine("{0}은 밥을 먹습니다", Name); }
       public void Sleep() { Console.WriteLine("{0}은 잠을 잡니다", Name); }
       public void Walk() { Console.WriteLine("{0}은 걷습니다", Name); }
}
class TEST
{
        static void Main()
        {
               Human Kim ;
               Kim = new Human("Kim", 20);       // 이름이 Kim 나이가 20살인 사람(객체)를
               Kim.Eat();                                    // 생성했습니다.
               Kim.Sleep(); 
               Kim.Walk();
        }
}
코드자체에 대해 크게 해석하려 들지는 마시길바랍니다;;
클래스 Human이라는 안을 볼게요. 제일 위에는 사람의 이름(Name), 나이(Age) 속성이고,
사람의 행위, 기능에 대해서는 메소드(함수)로 구현을 했습니다.(자고, 먹고, 걷고)
물론 사람의 속성과, 행위는 참으로 많지만 이렇게 공통적인 속성과 행위를 일반화 시킨것이
추상화라고 할수있습니다.
그래서 추상적인 클래스를 정의 해놓은 상태에서 
Main 메소드에서 클래스를 본딴 객체를 생성합니다.

객체의 생김새는 (물론 메모리구조는 다르지만) 논리적으로 (클래스)저렇게 이루어져있습니다.
설명이 지나치게 프로그래밍적이라 죄송하긴 합니다.

그리고 Main메소드안에서는 우리는 일반적으로 객체를 생성해서, 편리하게 쓸수있는것이지요

결국은 객체를 잘 표현하기 위해서는 클래스를 잘 설계해야합니다.
객체 자체의 속성과 기능을 어떻게 표현하고, 설계를 할지가 중요합니다.

그렇기 때문에 클래스는 많은 기능이 있습니다.
상속, 포함, 다형성 이란것이 있는데 차차 설명해야 할거 같습니다.

그럼 여기까지로 하고, 혹시 이해를 돕기위해서 스택을 구현해봤습니다.
스택이란 개념을 아시는분은 참고하시고,
스택을 모른다라시는분은 너무 낙담마시고,  조금 익숙해지면 이 코드를 보시면 되겠습니다.
스택의 개념은 간단합니다. 전에 포스트를 참고하셔도 되고, 
검색창에 스택 을 검색하시면 많은 자료가 있으니 개인적인 공부 부탁드립니다.

using System;

class Stack
{
    private int top;          // top
    private int bottom;     // bottom
    private int[] buf;      // 스택배열       여기까지 객체의 속성(필드라고도 합니다)

    public Stack(int number)  // 생성자(즉 객체를 만들면 이렇게 정의된 된대로 초기화되어
    {                                   // 객체가 생성됩니다)
        this.buf = new int[number];
        this.top = -1;
        this.bottom = 0;
    }            

    public void push(int data) // push()  -- 객체의 행위
    {
        this.top++;
        this.buf[this.top] = data;
    }

    public int pop()            // pop()       -- 객체의 행위
    {
        int data;
        data = this.buf[this.top];
        buf[this.top] = 0;
        this.top--;

        if (this.top == this.bottom)
        {
            Console.WriteLine("버퍼에 더이상 데이타가 없습니다");
            return 0;
        }
        else 
            return data;
    } 

    public void ShowStack()    // 현재값 출력  -- 객체의 행위
    {
        for (int i = 0; i <= this.top; i++)
        {
            Console.WriteLine("top:{0}  data:{1}",i, this.buf[i]);
        }
    }

}

class program
{
    public static void Main()
    {
        Console.Write("스택크기 입력 : ");
        int number = Convert.ToInt32(Console.ReadLine()); 

        int pop;
        Stack s = new Stack(number);   // 객체의 생성(클래스에 정의되어있던 생성자와 같이....)

        s.push(10);
        s.push(20);
        s.push(30);
        s.push(34);
        s.push(43);

        pop = s.pop();
        Console.WriteLine(pop);
        s.ShowStack();
        
    }
}

설명이 많이 부족했지만, 혹시나 제가 언급한 위 글에서, 의미를 잘못해석했거나,
틀린부분이 있으면 댓글 바랍니다. 댓글환영입니다.


'프로그래밍 > C#' 카테고리의 다른 글

C#-9. 생성자  (0) 2019.02.05
C#-8. C# 응용프로그램의 기본구조  (0) 2019.02.03
C#-6. 데이타 타입  (0) 2019.01.29
C#-4. 컴파일러와 dll파일  (0) 2019.01.25
C#-3. 네임스페이스  (0) 2019.01.25
Posted by 토실토실천재