2019. 2. 5. 13:59


c#은 객체의 생성과 소멸 과정에 자동으로 호출되는 두 매커니즘이 있습니다.
바로 생성자, 소멸자 입니다.
닷넷은 소멸자의 역할을 프로그래머가 딱히 해줄필요가 없으므로, c/c++과 같이 메모리 반납을
명시적으로 해줄 필요가 없습니다. 참 편리한 닷넷이네요.


1. 생성자
  - 객체가 생성이 될때 자동으로 호출되는 메서드 입니다.
  - 일반적으로 객체의 초기화 작업시 많이 이용합니다.

class A{

   public A(){

       Console.WriteLine("생성자 호출");

   }

}
  
이렇게 정의가 되어 있다면 Main() 메소드에서
A a = new A();
이렇게 하면 객체가 생성되면서 생성자가 호출됩니다.


물론 호출과 정의시 규칙이 있습니다.
  ㄱ. 생성자는 클래스 이름과 반드시 동일해야합니다.
      - 이것은 두말나위 없습니다.(클래스이름을 그대로 적으셔야 합니다)

  ㄴ. 생성자는 반환타입이 없어야 합니다.
      - 메서드의 일종이라고 해도, return 타입을 가져서는 안됩니다.

  ㄷ. 생성자는 여러개의 매개변수를 가질수 있고, 
      일반적인 메서드 오버로딩이 가능합니다.
     - 여러개의 매개변수를 가지며, 다양한 생성자를 여러개 만들수 있습니다.
       >> public A(int a, string str){}  A(int a, int b){} 이런식으로도 가능합니다.

  ㄹ. 생성자를 정의하지 않으면 디폴트(기본) 생성자가 자동으로 만들어진다.
    - 매개변수를 가지지 않는 A(){} 라는 생성자가 자동으로 만들어집니다.

  ㅁ. 생성자는 상속되지 않는다.
    - 메서드나, 필드는 상속되지만 생성자는 자식클래스에 상속되지 않습니다.


2. 생성자 오버로딩
  - 생성자도 일종의 메서드에 속합니다. 그러므로 오버로딩 규칙이 적용됩니다.
  - 오버로딩이란 용어를 잘 모르셔도 그냥 보시면 이해가 될것입니다.

class A{

   public A(){          

        Console.WriteLine("기본생성자");                  // 1번 생성자

   }

   public A(int i){

       Console.WriteLine("int 매개변수 생성자");          // 2번 생성자

   }

   public A(string s){

       Console.WriteLine("string 매개변수 생성자");       // 3번 생성자

   }      

}


자 생성자가 총 3개이군요

A a = new A();           // 실인수가 없으므로 오버로딩 규칙으로 1번 생성자로!!
A b = new A(3);          // 실인수가 int형인 3인 정수형이므로 2번 생성자로
A c = new A("hello");  //실인수가 string type 이므로 3번 생성자로!!


3. 상속과 생성자
  - 생성자는 상속되지 않습니다.
  - 그러므로 당연히 생성자에 키워드에 virtual, override, sealed 는 사용불가입니다.


위 그림은 닷넷 상속구조입니다. 제일 중요한 Object 클래스 부터 상속되어집니다.

베이스 키워드를 사용하면 자식 객체의 생성자에서 부모 객체의 생성자를 명시적으로
호출할수는 있습니다. 

class Child : Parent{

   public Child() : base(1){

       Console.WriteLine("자식생성자");

   }

}

위와 같이 자식 객체 생성자에서 부모 객체 특정 생성자를 명시적으로 호출합니다.


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

C#-11. 객체지향에서 용어정리  (0) 2019.02.09
C#-10. 클래스의 정적멤버  (0) 2019.02.06
C#-8. C# 응용프로그램의 기본구조  (0) 2019.02.03
C#-7. 객체지향과 클래스  (0) 2019.01.31
C#-6. 데이타 타입  (0) 2019.01.29
Posted by 토실토실천재
2019. 2. 3. 18:02


1. C#의 기본골격

Ctrl+Shift+N 키를 누르거나 [파일->프로젝트]를 클릭하셔서  C#을 클릭하시면 위와같은 화면이 나오는데 저는 익스프레스버전이기때문에 위와같은 화면이 뜹니다. 여러분들의 화면이랑 좀 다릅니다.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace HelloWorld

{

    class Program

    {

        static void Main(string[] args)

        {

            Console.WriteLine("안녕하세요"); //콘솔창에 문자열 출력

        }

    }

}

이번장은 역시나 당연하다고 지나칠수 있는부분을 (매우 중요하다고 생각됩니다)

한번 살펴보겠씁니다.



   1. Main 메서드

       - 오직 하나의 진입점만 허용(즉 프로그램은 하나의 Main 메서드만 가짐!!!!)

       - 즉, 프로그램의 진입점(시작점) 역할을 하는 함수로써 닷넷 런타임에 의해 호출됩니다.

       - 하나의 응용프로그램에는 하나의 Main 메서드만 가능합니다.


       > 대문자 M? : 반드시 대문자여야 합니다

          (C#은 대소문자를 구분하지요? 즉, 소문자 a, 대문자 A는 다른겁니다)

       > static 의 의미는? : 사전적으로는 정적이라는 해석입니다.


C#에서는 전역변수가 존재 하지 않습니다!!,

  왜냐하면 모든 변수나 메서드는 클래스의 소속이 되야하기때문입니다.

  그런데 전역변수가 있다고 치면, 전역변수는 프로그램의 시작할때부터 자동으로 생성되어,

  프로그램이 끝날때까지 계속해서

  메모리에 존재하기때문에, 전역변수나 전역함수등을 쓴다면, 메모리 소비도 많아지고,

  잘못 사용시에는 프로그램에 뒤죽박죽 엉키는 [일명 : 스파게티 소스] 가 되어 버립니다. 

  그와 함께 static 이 변수나 메소드 앞에 붙는다면?? 마찬가지로 프로그램이

  시작할때 자동으로 생성되어 프로그램이 끝날때까지 없어지지 않습니다.

  즉...전역변수와 비슷한 기능을 합니다.

   마찬가지로 Main 메소드는 무조건 제일 먼저 실행되야 함

   ...제일 먼저 메모리에 로딩이 되어하므로, static을 반드시 명시해주셔야 합니다.



   2. namespace

       - 프로그램 요소를 논리적으로 구분하게 하는 키워드입니다.        

       - 여기서는 helloworld 로 지정되었는데, 

          지정하지 않게 되면, 기본 네임스페이스로 자동으로 지정되게 됩니다.

       - 논리적으로 프로그램 구성요소를 그룹화 시킴으로써 이름 충돌을 자동으로 방지하고,

         의미있게 부여/구분하여  공용 어셈블리의 구성을 보다 직관적으로 관리할수 있겠습니다.

         밑에 그림 참조하세요


         참조란 것은 외부에 정의된 어셈블리를 참조하는것입니다^^
         우린 보통 System; 만 쓰지요? 그렇기때문에 갖다쓸거를 텍스트편집기에다가
         using System;이라고 적지요
         수업시간에 들은적 있지요?
         mscorlib.dll 이라는 에셈블리에 정의된 System 네임스페이스 하위의 Console 클래스를 이용
         해서 우린 Console 클래스를 쓰는것이지요^^(mscorlib.dll : 닷넷 핵심 어셈블리입니다)

   3. using 
        -  참조한 어셈블리의 네임스페이스를 한번만 지정하여 코드에서 매번 네임스페이스를
           지정할필요없이 지정하는것입니다
           만약에 한번만 지정할수 없다면 우린
           System.Console.WriteLine("어저꾸저쩌구"); 라고 매번 귀찮게 다 입력을 해야하지요
        - 또 한가지 : 네임스페이스의 별칭을 부여할수 있는데 이건 지난번에 설명했으므로 생략합니다.


   4. 기본클래스
        - 우리가 기본적으로 c#프로젝트를 만들면 기본 클래스는 program 이라고
          디폴트(기본값/자동값)으로 설정되어집니다.
          물론 프로그래머가 다시 수정이 가능합니다. 정하기 나름이지요

이것이 대략적인 기본구조입니다. 
"뭐가 이리 시시해~"라고 할수 있지만, 매우 중요해서 어떻게 보면 전에 했던 내용을
다시 짜집기해서 정리했다는 개념일수도 있네요.
그리고 사실 static이란것은 하나의 단원이 될수도 있는데, 간단히 소개했습니다.


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

C#-10. 클래스의 정적멤버  (0) 2019.02.06
C#-9. 생성자  (0) 2019.02.05
C#-7. 객체지향과 클래스  (0) 2019.01.31
C#-6. 데이타 타입  (0) 2019.01.29
C#-4. 컴파일러와 dll파일  (0) 2019.01.25
Posted by 토실토실천재
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 토실토실천재