2019. 2. 18. 09:01

프로그래밍을 제일 처음하시는분들 그리고 저또한 프로그래밍을 처음할때 여러가지 우여곡절이

많았습니다. 함수가 없는 프로그래이밍 언어는 거의 없습니다. 함수는 프로그래밍을 이루는 아주 중요한 요소입니다. 함수용어 및 함수의 기능에 대해 완벽하지 않다면, 프로그래밍을 할 수가 없습니다.

절대로....

프로그래밍 기초부분이니까 다시 한번 보시겠습니다

그중에 함수의 return에 대해서만 오늘은 알아 보고, 다형성으로 넘어가지요

 

 

@. 리턴(return)의 정의

   - "돌아가겠다" 라고 해석하시는분들도 계시고, "끝내겠따", "반환하겠다"라고 해석하시는

      분들이 있는데 맞는말입니다.

   - 정의를 하기 위해서는 기능을 알아보겠습니다.

 

 1. 리턴의 의미

     - 보이는그대로 return 이라는 글자만 있습니다. 종료의 의미만을 나타냅니다.

       무엇을 종료하는냐?

     - 함수를 종료할때 쓰입니다.

     - 예를 들어보죠

 

class A

{

     public int plus(int a, int b)

     {

             int c = a + b;

             return c;

      }

}       

class program

{

      static void Main()

      {

            A a = new A();

            int result = a.plus(3, 4);

            Console.WriteLine(result);

       }

}

 A클래스안에 plus라는 함수(메서드)가 있습니다. 함수라고 통칭하지요

 

public int plus(int a, int b)

1.함수이름 : plus

2.함수매개변수값 : int a, int b(2개)

3.함수의 리턴값 : int        (함수이름앞에 int를 붙인거)

 

1,2,3번을 잘 보십시오, 함수자체로의 이러한 속성을 딱 봤을때 바로 보여야 합니다. 쉽지요?

물어보죠...함수의 이름이 뭔데요?? plus....

그렇다면...함수의 반환값은 뭔데요?? int형

오..그럼....함수의 매개변수는 뭔가요 int형 변수 a, int형 변수 b 이렇게 2개입니다.

 

자 정확히 답변이 되야합니다.

그렇다면 다시

 

public void Minus(string s) {......}

이 함수에 대해서 설명해보세요.

 

1. 함수이름 : Minus

2. 함수의 반환값 : void(없음) ;

   // void는 return할 값이 없기때문에 {} 몸체부분에 return을 안적어주셔됩니다.

3. 함수의 매개변수값 : string s (문자열 s)

 

다시 아래 소스를 보겠습니다.

class A

{

     public int plus(int a, int b)

     {

             int c = a + b;

             return c;

      }

}       

class program

{

      static void Main()

      {

            A a = new A();

            int result = a.plus(3, 4);

            Console.WriteLine(result);

       }

}

 

지금 A클래스내의 plus라는 함수의 선언부분(public int plus(int a, int b))만 보다 각이 나와야합니다.

아...이함수는 plus라는 이름이니깐 대략 더하겠다는 기능의 개발자의 의미가 있구나.

아...이함수는 void가 아니니깐 일단은 return값이 존재하며 return값은 int형이구나.

아...이함수는 매개변수 2개구나, 매개변수가 두개다 int형이고, 이름은 a, b이구나 라고 아셔야합니다.

그리고 {.............}이것을 우리는 함수 몸체라고 합니다.

자 이제 몸체를 보겠습니다. 내용을 보겠다는것이지요

 

int c = a +  b; 입니다.

매개변수로 즉, a, b를 이용해서 main 함수에서 던져진 값이 이 변수에 할당됩니다.

3, 4가 할당되었으므로,

a = 3

b = 4

가 할당됩니다.

그리고 int c 변수가 만들어짐과 동시에 a+b의 연산결과인 7이 할당되어

c변수에는 7이 저장이 되는것이지요;

 

그렇다면 여기서 return c; 라는것이 중요한데 이것을 보죠

return은 끝내겠다는 함수를 종료하겠다는 동시에 c값을 main함수에서 호출한 곳으로 던져주겠다는 뜻입니다.

 

메인함수안을 보죠

int result = a.plus(3, 4);

이부분에서 a.plus(3,4);가 함수를 호출한 부분이고, 호출(부르는것)을 하게 되면 아까 위에서 본 연산의 결과가

리턴이 되어서 a.plus(3,4)는 7이라는 값이 되는셈이지요.

그리고 7이라는 값이 result;에 대입이 되어

result는 7이 대입되는것입니다.

 

여기서 return 이라는 것은 역시나 함수를 종료하겠다는것이고, 이와 동시에 return 뒤에

적어준 변수나 값을 호출을 한곳으로 던져준다는것이지요. 이것이 함수의 기능입니다.

 

 

자 그럼 void라고 적힌 함수는 어떤의미일까요.

void는 그냥 아무것도 없다는 뜻입니다.

public void print();라는 함수가 있으면 print라는 함수는 아무런값도 리턴할것이 없다는 뜻입니다.

고로 호출한 메인함수에서는 그냥 호출만 할뿐이지 받을 값이 없기때문에, 주로 출력을 할때 자주 쓰입니다.

 

public void Print(int a, int b)

{

       Console.WriteLine(a+b);

       //return ; 이런식으로 끝내겠다는 의미만을 위해서 return만 적어주셔도 괜찬습니다.

       //값은 넣을수 없습니다.

}

 

단지 호출만 되면 void이기 때문에 return [값]식으로 적어주면 error가 납니다.

class A

{

  public string Print(string s)

  {

       s = s + " hello";

       return s;

  }

}

class program

{

   static void Main()

   {

          A a = new A();

          string result = a.Print("hi~ ");

          Console.WriteLIne(result);

    }

}

 

위의 소소로 복습을 합니다.

위의 Print함수는 return할값이 있는데 그 형식은 string입니다.

매개변수는 string s; 문자열 하나만 받을수 있지요

return값은 당연히 string으로 만들어졌으니 string 형 변수가 되야하지요

몸체설명은 어떤 특정한 문자열이 오면 거기에다가 hello라는 글자를 더해서 그 글자를

리턴하는것입니다.

 

메인함수에서 함수를 hi라는 값을 준후에 Print함수를 호출합니다.

그럼 Print함수는 값을 처리해서 hi~hello 라는 글자를 리턴해주고 그값역시 string이기 때문에

string result 를 선언해서 값을 대입해줘야 합니다.

그리고 값을 출력을 하는것이지요.

 

예가 적절했는지 설명이 적절했는지 잘모르겠지만,

의외로 모르는 사람들이 많아서 다시 한번 정리했습니다. 솔직히 놀랬습니다.

이것을 모르고 계속 수업 듣고 계신줄은......꼭 이것을 알고 넘어가시길

바랍니다. 왜냐면 return과 함수는 밥먹듯이 쓰이기 때문입니다.

 

정말 중요합니다.


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

C#-11. 객체지향에서 용어정리  (0) 2019.02.09
C#-10. 클래스의 정적멤버  (0) 2019.02.06
C#-9. 생성자  (0) 2019.02.05
C#-8. C# 응용프로그램의 기본구조  (0) 2019.02.03
C#-7. 객체지향과 클래스  (0) 2019.01.31
Posted by 토실토실천재
2019. 2. 9. 17:36

이번장에는 상속을 할려고 했는데, 제가 정리를 잘 못 한탓도 있고, 여러가지 이유로 해서 다시 한번 용어에 대해서 정리하는 시간을 가져봐야 할거 같습니다

결과적으로는 모든 학습은 용어에서 지면 될것도 안된다는것을 항상 명심해야

한다는 말이 생각나는군요 모든 시작은 용어정리입니다.

 

 

1. 클래스와 객체(object)

  - 객체를 만들기 위한 하나의 틀이라고 보시면 됩니다.

  - 먼 미래에 사람을 복제하는 기술이 있다고 치면, 사람이라는 모든 속성(키, 생김새, 피부색)

    이 복사가 되고, 그 사람의 모든 행동(모든 메서드)이 복사가 됩니다.  ( -->> 클래스로

   부터 객체 완성한 부분) 이런것을 만들어주는것이 클래스입니다. 그리고, 우리는 무조건

    똑같을 순 없잖습니까...아무리 복제인간이라해도

    사람이니깐 성격까지는 복사를 못하겠지요,

    그러면서 성격에 따라 밥먹는 습관(메서드)이나, 잠자는 모습(메서드), 노는것(메서드)이

    다 다를 수 있겠지요.

  - 같은 엄마 배속(클래스) 에서 태어난 쌍둥이(객체)라도 성격이 다르니깐 추상적인

    메서드(밥먹기, 놀기)의 내용이 구체적으로 달라지는것이지요

 

  ==> 클래스는 객체를 생성하기 위한 하나의 추상적인 형태 입니다.

 

 

2. 인스턴트화

   - 보통은 코드만으로만 봤을때 new 를 써서 객체를 만듭니다.

   - 그전에 객체란것은 모든 하나의 사물이라지만, 참 애매모호 하시지요?

     >> 객체 : 핸드폰, 나, 너, 라면, TV, 컴퓨터, 개, 고양이, 호랑이, 공룡, 책, 등등

         모든 사물을 객체라고 말합니다.

   - 그렇다면 우리가 열심히 머리 싸메면서 하는 C#에서 객체를 만들었다는것은 내가

     클래스를 바탕으로 객체를 만든것인데 객체가 만들어졌다는것은 메모리에 올라갔다는

    뜻이기도 합니다. 실세계에서 사물(객체)를 사용하기 위해서는  실세계가 존재해야

    하듯, 내가 만든 프로그램이 컴퓨터세계에서 돌기위해선 Ram(메모리)에 적재가

    되야 하는것입니다.

     그것을 우리는 인스턴트화 됐다고 합니다.

  - 인스턴트란 뜻은 즉석식품이 아니라, 엄밀히 따지면 바로 먹을수 있다는것으로,

    바로 사용할수 있다 즉, 이제 사용할수있다.

    그렇기때문에 클래스를 기반으로 만든 객체는 인스턴트화...즉 바로 사용이

   가능하단말입니다.

 

    classA A ;             // 객체를 담을 그릇을 만든것뿐..인스턴트화는 아님

    A = new ClassA() ; // 생성자를 호출해서 인스턴트화가 되었음! 클래스내의

                                // 객체 생성자로 인해서 객체가 만들어짐

                                // 인스턴트화가 되었음.

   

3. 추상화

   - 미술분야에서 추상화를 많이 말을 하는데, 추상적으로....라는말이 참...애매모호 합니다.

   - 추상을 정의하게 전에 예를 들어보죠

      >> 먹는다, 잔다, 공부한다.

     무슨 말인지는 알겠지만, 뜻이 참 함축적입니다. 구체적으으로 뭘 먹는다는거고,

     언제자고 어떻게 언제 잘래,  뭘 공부해서 어떻게 공부해서 얼마나 무엇을 위해서 공부한다

     라고 구체적으로 다시 말하면 좀더 낫지요

     구체화의 반대말로 접근하시면 이해가 빠를거 같습니다.

   

     잔다 -> 낮잠을 잔다 -> 코를 걸면서 잔다 -> 코를 걸고, 잠꼬대를 하면서 잔다 ->

                코걸고, 잠꼬대에 옆으로 누워잔다.

     잔다 : 상당히 추상적이지요?(어떻게 해석이 될지 잠재력이 대단히 많지요?)

 

     코골면서 잠꼬대하면서 옆으로 누워서 낮잠을 잔다 : 상당히 구체적입니다.

 

     결국은 추상적으로 객체를 표현해야 되는것입니다.

     일일히 사람에 대해서 다 표현을 하자면 무지하게 많습니다.

    사람에 대한 속성과 행동은 누구나 공통적인것이  있을것입니다.

    그것을 메서드(함수)로 표현합니다.

 

     왜 그럼 추상적으로 표현해야 하나?? 너무 구체적이면  어떻게 될까요?

     사람이라는 클래스를 만든다면, 이제 그 클래스로 여러가지 사람을 나타낼수가 있는데,

     너무 구체적으로 사람을 정의 하면 클래스 자체가 함수가 되어버립니다.

     함수는 특정 기능을 절차적으로 완벽한 답을 도출해야 하기때문이지요

    

     눈사람을 만들때 딱 눈사람 모형만 만들면 거기서 꾸밀것이 참 많습니다.

    하지만 눈사람을 완전히 사람같이 구체적으로 만들고, 옷입히고, 눈코입 그리고,

    장갑끼우고 신발 입히고, 색칠하면,,,,좋겠지만,

    그 눈사람은 그냥 사람이 되어버리는것이지요, 클래스 재사용도 불가능합니다.

 

     결국은 추상화란 구체적이지 않는 사물의 일반적이고,

     얼마든지 구체적으로 만들수있는가를 준비하는 방법이지요

    

 4. Static (정적)

   - 모든 프로그램에서 매우 중요하게 쓰이는 용어입니다. 여기서는 하드웨어에 대한 지식이

     약간 필요합니다.

   - 결국은 static을 앞에 쓰고 안쓰고 차이는 엄청난 차이가 납니다.

   - static을 앞에 붙인 메소드나, 변수는 무조건 프로그램이 실행되면,

    메모리에 로딩이 되어, 제일 먼저 생성이 됩니다.

     그렇기 때문에 언제든지 사용이 가능해집니다.

     전역변수와 같이 똑같은 의미로 사용되어 지는데, 전역변수(javascript)에서 했었지요?

      어느 함수나 어느 영역에도

     포함되지 않는 변수였지요, 어느 함수에서든지 호출해서 사용할수 있는 변수였습니다.

     프로그램이 실행되자마자 Main() 메서드와 똑같이 생성되어 프로그램이 끝날때

    까지 메모리에 계속 상주하게 되어, 자유롭게 쓸수있습니다.

 

Class A

{

      public int a;

      public void Write(){ Console.WriteLine("안녕");}

}

Class B

{

      public static int b;

      public static void Write() {Console.WriteLine("정적 안녕"); }

}

 

여기서 A클래스를 사용하기 위해선 객체를 만들어야 사용할수있습니다.

 

A a = new A() ; 반드시 인스턴트화...객체를 만들어(메모리에 적재시킨뒤)

사용이 가능합니다.

이렇게 ... a.Write(); a.a = 3;

 

하지만 정적은 이미 메모리에 적재가 되어있기때문에

인스턴트화가 필요없이 B.Write()라고만 하지면 메소드가 호출이 됩니다.

그리고 정적변수... B.b 이건 이렇게 사용하게 전역변수처럼 쓸수있습니다.

 

 

5. 필드 / 메소드

  - 클래스에서 속성이 정의된 영역을 필드라 부르고,

    행위가 정의된 것을 메소드라고 합니다.

 

class Dog

{

      protected string TypeDog;  // 개종류

      protected string gender;    // 암수구분

      protected string name ;     // 개이름

      protected int age       ;      // 개나이

      // 저위에 4개의 속성이 필드영역입니다. 필드라고 합니다.

 

      // 나머지 Dog의 행위가 있는 밑을 메소드라고 합니다.

      public void Cry() {....};          // 짖는행위

      public void Run() {....};         // 달리는 행위

      public void Sleep() {....};       // 자는 행위

      pubilc void Fee(){....};           // 먹이를 먹는 행위

 

}

 

이렇게 아주 기초적이면서 매우 자주쓰이며, 중요한 부분만 나름대로...많이 부족하네요

다시 읽어보니...저도 아직 많이 부족해서 설명이 참......쉽지가 않네요

틀린부분은 언제든 지적감사드리면, 다같이 힘내시기 바랍니다!!

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

C# - 보충 : 함수와 return  (0) 2019.02.18
C#-10. 클래스의 정적멤버  (0) 2019.02.06
C#-9. 생성자  (0) 2019.02.05
C#-8. C# 응용프로그램의 기본구조  (0) 2019.02.03
C#-7. 객체지향과 클래스  (0) 2019.01.31
Posted by 토실토실천재
2019. 2. 6. 10:43


1. 정적 멤버
  - 클래스 : 객체를 만들기 위한 형틀 (마치 붕어빵을 만들기 위한 붕어빵 틀)
  - 객   체 :  클래스가 메모리에 구현되어 생성된 실체
  - 인스턴스  : 메모리에 구현된 클래스의 실체
     >> 하나의 클래스로부터 많은 인스턴스의 생성 가능

참고)  같은 클래스타입의 객체 3개를 생성했을때의 메모리 구조




필드는 특정 객체에 서로 다른 메모리에 생성되지만, 메소드는 공유됩니다.

요악하자면 객체끼리 필드는 따라 가지고 메서드는 공유됩니다.
이것은 모든 객체 지향언어들의 공통점이라고 할수있습니다. 
객체별의 필드, this에 의해 구분되는 메서다를 멤버 또는 비정적 멤버라고 합니다. 
반대개념이 정적개념이며, 키워드 static 으로 지정합니다.


정적메서드 
  - 클래스에 소속, 클래스 차원의 동작 처리
  - 특정 객체에 대한 처리를 하는것이 아님(this 영향 안받음)
  - 클래스 소속의 정적 필드만 엑세스 가능
  - 특정 객체에 소속되지 않으므로 반드시 클래스로부터 호출해야 함.
  Class A
   {
        public static void B()
        {
               Console.WriteLine("스태틱 메소드입니다. 클래스에서 호출하셔함");
         }
   }

   - A.B() 이런식으로 호출해야 합니다. 
   - 정적생성자는 당연히 특성상 클래스가 로드될때 딱한번 자동 호출됩니다.
  
좀 말이 어렵네요. 정적(Static)이라함은 호출순서에 상관없이
즉시 메모리에 옮겨진다는 말입니다. 한마디로 전역함수, 전역변수와 같이, 프로그램이 
실행될때 즉시, 메모리에 올라가서 실행이 되는데, 이는 프로그램이 종료되기까지 계속해서
남아있습니다. 이런식으로 대표적인 함수가 바로 진입점인 Main() 메서드 입니다.
최초 실행될때 어떤 객체도 생성 되지 않으므로 객체에 소속될수가 없지요.


2. 상수 멤버
  ; 한번 초기화 되면 절대 변경할수 없는 멤버입니다.

  - 1. const 상수 : public const int Day = 24; 컴파일할때 값이 딱한번 초기화 됨
     ->  Day란 변수는 이제 24 값만 가질수 있고, 수정이 불가하다.
         객체생성전에 호출되야 하므로 정적메서드가 될수밖에 없습니다.
         Console클래스의 WriteLine도 정적 메서드 입니다. 어디서든 자유롭게 호출 가능합니다.
        - 지역변수에도 적용가능
  
  - 2. readonly 생성자에 의해 한번만 초기화 된다. : readonly public int A; (읽기전용)
         - 클래스 필드에만 적용
         - 실행중에 생성자에서 초기화 

 - 사실 메서드내의 지역상수는 const만으로도 충분합니다.



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

C# - 보충 : 함수와 return  (0) 2019.02.18
C#-11. 객체지향에서 용어정리  (0) 2019.02.09
C#-9. 생성자  (0) 2019.02.05
C#-8. C# 응용프로그램의 기본구조  (0) 2019.02.03
C#-7. 객체지향과 클래스  (0) 2019.01.31
Posted by 토실토실천재
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 토실토실천재
2019. 1. 29. 00:05

어떠한 프로그래밍을 공부한다고 해도 제일 먼저 배우는 코딩문법은 변수입니다. 

본인이 프로그래밍 강의 들었을때는 어떤 교수님께서 프로그래밍을 요리에 비교했던 기억이 나네요
여기서에서는 변수를 보겠지만, 요리를 만들기위해서, 
재료를 담기위한 그릇이 항상 필요하다고 강조를 하셨고, 그 변수의 타입(type)에 따라서
그릇의 종류나 크기가 달라져야 음식이 넘치지 않는다고, 비유를 했습니다.

어떤 그릇은 정수형 숫자만 저장하고, 어떤 그릇은 글자를 담고,
어떤 그릇은 실수만을 저장하는 그릇이지요

우리는 C#을 배우기 때문에, C#에 대한 데이타 타입..즉, 어떤 그릇인가, 어떠한 특징을 가지는지
알아봐야할것입니다.
C#은 객체 지향언어이자, 타입안정성을 최우선으로 하는 언어입니다.


1. 닷넷의 타입
  - C#은 닷넷언어이기때문에 type이 모두 System 네임스페이스에 정의 되어 있습니다.
  - 결국은 닷넷프레임워크에 정의되어 있다는것입니다.(CTS정의)
  - 타입에 따라서 변수의 메모리 공간크기, 이름, 부호의 여부가 다릅니다.

2. 타입의 종류
a. 정수형

타 입

실제이름

범위

sbyte

System.SByte

-128 ~ 127

byte

System.Byte

0 ~ 255

char

System.Char

하나의 유니코드 문자. U+0000 ~ U+FFFF

short

System.Int16

-32,768 ~ 32,767

ushort

System.UInt16

0 ~ 65,535

int

System.Int32

-2,147,483,648 ~ 2,147,483,647

uint

System.UInt32

0 ~ 4,294,967,295

long

System.Int64

-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

ulong

System.UInt64

0 ~ 18,446,744,073,709,551,615


사실 이것을 일일이 다 외울필요는 없습니다. 코딩을 하시다보면, 익숙해지기 때문에 자동적으로
외워지게 됩니다. 특히 타입앞에 u가 붙으면 음수값이 없어지고, 양수값이 2배로 커진다는점
인식하셔야 합니다.
타입명이 있고, 실제이름이 있는데, 이는 CTS에 따라서 닷넷 타입의 내북적인 실제 타입명입니다.
코딩할때 저렇게 직접 적으셔도 무방합니다. 
예를 들어보죠
int x = 10;
System.Int32 x = 10;

int의 실제이름은 System.Int32라고 했습니다.
위의 두 문장은 같은 뜻입니다. 둘중에 어느것을 써도 괜찮은거죠.


b. 실수형 

타 입

실제이름

정밀도

범 위

float

System.Single

7개의 자릿수

±1.5 ×10~45 ~ ±3.4 × 1038

Double

System.Double

15~16개의 자릿수

±5.0 ×10~324 ~ ±1.7 × 10308

Decimal

System.Decimal

28~29개의 자릿수

1.0 ×10~28 ~ 7.9× 1028

 

c. 참조형

타 입

실제이름

특 징

Object

System.Object

모든 타입의 최상위 부모 클래스. C#에서 모든 객체들은 이 Object 클래스로부터 상속받는다.

String

System.String

문자열을 나타내는 타입이다.

Bool

System.Boolean

Boolean 값이며 참(true) 또는 거짓(false)를 나타낸다.



C#은 모든 변수를 
사용하기 전에 초기화를 해주어야 합니다. 안그러면 에러가 날 수도 있죠..
변수에 초기값을 지정해 주지 않으면 디폴트 값으로 초기화가 됩니다.

 

타 입

디폴트 값

bool

false

byte

0

char

'\0'

decimal

0.0M

double

0.0D

enum

0

float

0.0F

int

0

long

0L

sbyte

0

short

0

struct

구조체안의 모든 타입은 그에 해당하는 디폴트 값으로 할당된다.

uint

0

ulong

0

ushort

0

 




2. 값 타입(Value type) / 참조 타입(Reference type)
 a. 값타입 : 스텍에 할당되어 변수가 값 자체를 직접 가집니다. 여기서 Stack(스택)이란것은
     메모리(Ram)내에 데이타를 쌓는기법인데 First In Last Out(FILO)라는 구조로 자료가 저장됩니다.
     자세한 설명은 댓글로 질문주시면, 설명해드릴게요, 즉, 변수를 선언하는 동시에 기억장소에
     저장되고, 일반적으로 별 무리없이 값을 저장, 대입하여 쓸수있는 타입입니다.
     위의 표를 보시고, 참조형이 아닌것은 모두 값타입이라 보시면 됩니다.
    
 a. 참조타입 : 값자체를 가지는것이 아니라, 주소값(저장된 위치)를 가집니다.
     이것은 스택영역이 아닌 힙(heap)이라는 아주 큰 메모리에 저장되는데, 여기 저장된 데이타는
     Garbage Collection 에 의해 자동으로 관리가 됩니다. 즉, 메모리를 이제는 프로그래머가 직접
     관여하지 않아도 되는것이지요. 주로 덩치가 큰 타입들이 참조형입니다.

3. 스택 영역과 힙 영역
  프로그래머라면 반드시 알아야 합니다. 너무 크게 해석하면 힘들기 때문에, 닷넷에서의 스택과
  힙에 대해서만 설명 합니다.
  
1. 스택(Stack)
스택은 지역변수(메소드 내에 존재하는 변수, 메소드의 인자)가 존재하는 공간입니다.
메소드를 호출하면 호출 스택(call stack)의 맨 위에 stack frame(코드, 지역 변수 값)이 쌓이게 되죠. 함수호출이 끝나야만 호출 스택에서 해당 스택 프레임을 pop(제거 및 값을 리턴)하게 됩니다.
참고로 간단한 예를 들면, 책이 쌓인것과 같은데, 책이 10권이 쌓여있습니다. 제일 밑에 있는책이
제일 처음에 쌓은 책이지만, 제일 위에 있는 책은 제일 마지막에 쌓은것이겠지요. 그렇다면, 책을 한개씩 옮기기 위해서는 제일 위에 있는 책부터 손이 갈것입니다. 이것이 스택구조인데, 즉, 자료저장방식
으로 본다면, 제일 먼저 들어온책(데이타)가 제일 늦게 출력(사용)이 되고, 제일 마지막에 쌓여있는 제일 위에 있는 책이 제일 먼저 나갈수 있는 메모리 구조. 그래서 First In Last Out 방식이라합니다


2. 힙(Heap)
힙은 객체가 존재하는 공간이고, 당연히 인스턴스 변수(클래스 내에 선언되어 있는 변수)도 이 안에 존재한다. 여기에서 힙은 일반적인 힙과는 약간 다르다. 왜냐하면 garbage collection을 하는 힙이기 때문이다.(자동 쓰레기 처리기) : 필요없는 데이타는 자동으로 삭제/관리

이러한 데이터 타입을 사용하여 변수를 사용할 수 있습니다.


담는 그릇도 중요하지만, 그 그릇이 있어야 하는 공간도 다르다는걸 인지 하셔야합니다.
참조라는 것은 힙이라는 데이타영역의 해당 데이타의 위치를 참조한다는것

4. 데이타 자동 형변환
    먼저 예문을 통해서 본론으로 넘어가도록 하겠습니다.

int number_1 = 15;
int number_2 = 20;
int result = number_1 +  number_2 ;

Console.WriteLine(result);

결론은 당연히 35가 나옵니다. 그리고 다음 예제

string number_1 = "안녕";
string number_2 = "알라뷰!";
string result = number_1 +  number_2 ;

Console.WriteLine(result);

자 이렇게 결론은 본다면 "안녕알라뷰!"라고 출력이 됩니다.
아주 당연해 보일수도 있겠지만, 같은 + 라는 연산이 숫자에도 적용, 문자열도 적용되는데
데이타 타입에 따라서 각기 다른 의미로 해석되어 결론을 도축해냅니다.
이것은 + 연산이라지만, 데이타 타입에 따라서 즉, int, string 에 따라서 작동되는 기능이 
자동으로 달라집니다. 참 신기한 현상입니다. 물론 당연하다고 보는분들도 계시겠지만,
그냥 넘기기엔 좀 찝찝해지셔야합니다. 

string number_1 = "안녕";
int number_2 = 1111;
string result = number_1 +  number_2 ;

Console.WriteLine(result);

이렇게 다른 타입으로 되면 어떻게 되는가? 상식적으로는 에러가 나야한다. 하지만, 나름 융통성있는
CLR은 이를 안녕1111이라고 출력을 합니다. 묵시적으로number_2는 문자열로 인식이 되어 버린것.
그렇지만 이것이 오히려 불편할때도 있긴 할것입니다.

데이타 타입에 관해 정리좀 할랬드만, 이거 너무 데이타타입내용이 방대하니, 한계가 오네요
오늘은 여기까지 정리하고, 다음에 다시 언급하도록 하겠습니다. 


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

C#-8. C# 응용프로그램의 기본구조  (0) 2019.02.03
C#-7. 객체지향과 클래스  (0) 2019.01.31
C#-4. 컴파일러와 dll파일  (0) 2019.01.25
C#-3. 네임스페이스  (0) 2019.01.25
C#-2. C#으로 첫 발자국  (0) 2019.01.24
Posted by 토실토실천재
2019. 1. 25. 15:11

procedure TForm1.Button1Click(Sender: TObject); 
begin 
… 
end; 

위의 Button1Click 메소드는 Sender라는 TObject 포인터를 매개변수로 받는다. 

델파이에서 모든 이벤트핸들러는 최소한 한 개의 Sender 매개변수를 가진다. 

버튼이 클릭될 때 OnClick에 대한 이벤트핸들러가 호출되는데 Sender라는 매개변수는 해당 이벤트핸들러를 호출하는데 사용된 버튼(여기서는 당연히 버튼)을 참조한다. Button1을 클릭하면 Button1Click이 호출되며 Button1이라는 객체의 포인터가 Sender라는 매개변수를 통해 전달받게 된다. 
그렇다면 왜 Sender라는 매개변수를 넘겨주는 것일까? 


Sender 매개변수의 역할은 해당 이벤트를 실행한 주체가 어떤 컴포넌트인지 알려준다. 

이를 통해 서로 다른 두 컴포넌트가 동일한 이벤트 핸들러를 사용하는 것이 가능해진다. 

예를 들어  button1과 button2이 동일한 기능을 수행하도록 할 때 이벤트 핸들러를 각각 작성하지 않고 한 개만 작성하여 두 컴포넌트가 이를 공유하도록 하면 된다. 


이벤트 핸들러를 공유하기 위해서 해주어야 할 작업은 다음과 같다. 


첫째,    컴포넌트에 대한 이벤트 핸들러를 작성한다. 
둘째,    컴포넌트를 작성한다. 
셋째,    Object Inspector에 event 페이지를 클릭한다. 
넷째,    컴포넌트의 액션에 해당하는 event에 기작성된 이벤트 핸들러 리스트를 연다. 
다섯째, 공유하고자 하는 첫번째 컴포넌트의 이벤트 핸들러를 선택한다. 


이제 한 이벤트 핸들러를 두 개(혹은 그 이상)의 컴포넌트가 공동으로 사용하는 것이 가능하다. 
그럼 다음 예제를 통해 어떤 컴포넌트가 이벤트 핸들러를 실행하고 있는지 Sender를 통해 확인해 보자. 


procedure TForm1.Button1Click(Sender: TObject); 
begin 
if Sender = Button1 then 
  ShowMessage(‘Button1 clicked!’) 
else if Sender = MenuItem1 then 
  ShowMessage(‘Button2 clicked!’) 
else 
  ShowMessage(‘??? clicked’); 
end;          

procedure TForm1.Button2Click(Sender: TObject); 
begin 
    Button1Click(Button2); 
end; 

procedure TForm1.Button2Click(Sender: TObject);의 결과는 어떻게 될까? 


그렇다 ‘??? clicked’이 될 것이다.

Posted by 토실토실천재
2019. 1. 25. 12:54

1. 컴파일러

 

프로그래밍 언어를 한답시고 컴파일러를 모른다는것은

영어알파벳 자체를 모르는 사람이 가이드없이 영어권 나라에 가는 경우입니다.

물론.....사람사는것은 워낙 변수가 많아서 바디 랭귀지가 가능하긋지만 그냥 받아들였으면 합니다.

 

a. 컴파일러란 대체 뭔가?

 1. 프로그래밍을 한다는것은 컴퓨터 cpu에게 명령을 하기위해서 인데,

    실제적으로 은밀하게 보자면 우리는 cpu에게 우리가 직접적으로

    명령문을 내리기 위해서가 아닙니다

    그럼 누구에게 알아듣는 코드를 작성한다는것일까요?

    컴파일러입니다. 컴파일러가 없는 프로그래밍 랭귀지는 거의 없을겁니다.

    물론....초저급언어(low level language)인 어셈블리어나 기계어는 작성해서

    바로 넣지만 말이죠. 코드가 16진수나, 0,1로만 이뤄져있지요

    가끔 컴파일에러가 나서 디버깅 창을 열면 볼수가 있습니다. 어셈블리코드;;

    마치....암호같습니다...

 

2. 이 컴파이일러는 워낙 똑똑해서 사람이 치는 코드도 인식하고 이것을 기계어로 바꿔줍니다.

   한국사람이 한국어로 통역관한테 말을 하면, 잘 번역해서 영어로 번역해서 말해줍니다.

 

     결론은 우리는 컴파일코드를 작성한다고 해도 과언이 아니죠

 

b. 닷넷에서의 컴파일러란?

   하지만 C#.NET은 좀다릅니다.

   바로 MicroSoft에서는 통합솔루션이라는 개념으로 닷넷 프레임워크에서 동작하는

   실행파일을 만들기 위한 닷넷언어들만의 컴파일러를 만들었지요

   그것이 CLR입니다. 즉, Common Language Runtime 인데,

   우리가 C#으로 작성한 코드를 IL(중간언어)로 바꿔줍니다.(CIL, MSIL 이라고도 합니다)

 

   그리고 이 IL언어로 실행파일로 저장을 하고

   우리는 닷넷프레임워크상에서 실행을 하는거죠

   여기서 끝이면 좋겠지만 이 IL자체로써 cpu에게 명령을 내릴순 없습니다.

   이 변환된 코드는 다시 JIT(Just In Time) 컴파일러로 변환을 하게 되어 직접적인 기계어로 만들어져

   cpu에게 인식됩니다. 물론 이것도 CLR로 컴파일이 되는거죠

 

  C#코드  -> (CLR컴파일)  -> IL 코드  -> JIT 컴파일(CLR)  ->  기계어(네이티브어)

 

우리가 C#프로그램을 만들려면 C#컴파일러를 사용해야하며,

상대방에 컴파일러 뭐 쓰냐란 질문이 나온다면,,,,

 1. C#컴파일러

 2. CLR컴파일러

 3.  비쥬얼 스튜디오 닷넷  버전

 이 3가지 말은 거의 같다고 생각해도 무방하겠네요

 

 

2. dll 파일 (Dynamic Link Library) : 동적링크라이브러리 파일

 

가끔씩 윈도우의 이상한 폴더(?)ㅋ 폴더를 이리저리 다니거나, 간단한 게임을 받으면

dll 파일이라고 있을겁니다. 이것이 없으면 실행파일이 실행이 되지가 않지요

물론 더블클릭해도 내용을 볼수가 없습니다.

즉...코드가 은닉되어 있기때문에, 어떻게 구현되있는지 알수가 없지요.

이것은 다른관점으로 볼때, 프로그래머의 능력을 은폐시킨것과 같습니다.

나아가 프로그래머의 재산을 보호한것이기도 합니다.

 윈도우 운영체제에만 있는것으로 기능적으로 본다면 참으로 괜찮은것 같습니다.

 

2-1. dll파일의 정의

  소프트웨어를 몇개의 파일로 나누어 따로 저장해서, 필요한것만 메모리에 로드시켜 사용합니다.

  이것은 기능이 특정기능이라면 다른 응용프로그램에서 사용이 가능합니다.

  다른 프로그램인데 똑같은 기능을 쓴다면, 또 다시 코드를 작성해야하는데, 이는 시간과,

  메모리 등을 절약이 가능하고,  경제적인 프로그램 작성이 가능하다는것입니다.

 

1. 프로그래머의 코드 은닉, 재산보호

2. 효율적인 프로그램

    - 코드의 재사용, 메모리/시간 절약

그렇기 때문에 dll파일이라는것을 만들어서 이런 이런 사정상 만드는것입니다.

 

자 그럼 다음에는 이 dll파일을 만들어서,

프로그램을 작성하기로 하겠습니다.


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

C#-7. 객체지향과 클래스  (0) 2019.01.31
C#-6. 데이타 타입  (0) 2019.01.29
C#-3. 네임스페이스  (0) 2019.01.25
C#-2. C#으로 첫 발자국  (0) 2019.01.24
C#-1. C#의 특징  (1) 2019.01.23
Posted by 토실토실천재
2019. 1. 25. 09:04
using System;

namespace A
{
    class B
    {
           static void Main()
           {
                   System.Console.WriteLine("hello, C# this is my First C# programing Code");
           }
    }
}
 
위의 코드를 본다면 어색한 분들도 계실것이고, 익숙하신분들도 계실것이고,
뭔 암호인지 하시는분들 제 각각 다른 생각이 드실겁니다.
위의 예제코드는 매우 간단하면서도 많은것을 담고 있기 때문에, 그냥 휭하니 넘기시면
차후에 C#의 기본에 ... 프로그래밍 자체의 기본기에 약점이 생길것입니다.
 
우선은 네임스페이스가 뭔지 한번 알아봐야 겠습니다.
(컴파일러에 대한 설명에 다음장에서 하겠습니다)
 
네임스페이스(namespace) 말그대로 이름공간입니다. 직역그대로이죠
학교 한 반에 김철수라는 학생이 2명이나 있다고 치면, 김철수는 2명이기때문에
출석을 부를때마다 항상 충돌과 학생들과 선생님들의 혼돈이 오기 마련입니다.
원초적으로 같은 이름을 가진 학생들은 차라리 다른반에 배치시켜서,
1반의 김철수 2반의 김철수라고 구분이 될것입니다. 물론....그런경우는 좀 냉혹하지요?
 
마찬가지로 프로그램상에서는 이런 현상, 변수, 메소드, 클래스 등을 구분해서 하나의
반에다가 넣어서 구분하는것입니다. 다른 용도의 변수, 메소드, 클래스라도 이름이
같으면 컴퓨터도 혼돈이 오기 마련입니다. 나아가 클래스를 기능별로 분류가 가능해지고
방대한 길이 코드에서 여러명의 개발자가 같은 프로젝트를 진행할때 우연찮게 같은 이름을 쓸수가 있습니다. 이렇게 혼돈도 방지하고, 클래스를 기능에 따라 분류하여 네임스페이스로 하나로
묶어두면 쳬게적으로 클래스를 좀더 효과적으로 쓸수있습니다.
 
예를 들어볼게요
 
class Chulsu { int a;}
class Chulsu { int b;}
두 클래스는 내용은 다르지만 이름이 똑같기 때문에 그냥 딱봐도 컴파일러(번역기)가 헷갈려합니다.
당연히 오류입니다. 철수가 2명일때 철수를 부르면 부른사람도 당황하고, 철수 2명도 누굴 부른거지
하고 짜증나겠지요?
자 이렇기 때문에 반을 나눠보죠
namespace A
{
    class Chulsu {int a;}
}
 
namespace B
{
    class Chulsu {int a;}
}
 
이렇게 하면 똑같은 클래스라고 할지라도 다른 이름공간(namespace)에 있기때문에
에러가 나지 않고, 구분이 가능합니다. A.Chulsu , B.Chulsu 이런식으로요
 
모든 명칭은 항상 특정한 네임스페이스 안에 정의 되어 있어야 하지만
위의 예제처럼 namespace 가 없으면 기본 네임스페이스로 인식되게 됩니다.
그리고 네임스페이스 안에 네임스페이스가 중복해서 정의 될수 있습니다.
 
namespace A
{
   namespace B
   {
        class C_Class
        {
            ............
         }
    }
}
이것은 또한 A.B.C_Class 라고 참조 할수 있습니다.
 
그리고 참조되는 네임스페이스 사용이 잦아지고, 네임스페이스길이가 길어지면 참으로
코딩하기가 귀찮아집니다.
그러므로 using을 쓸수가 있는데
using K = A.B;
라고 하면 K라는 별칭으로 이 네임스페이스에 속한 명칭을 바로 참조 가능합니다.
K.C_Class라고 하면 됩니다.


유용하게 봤다면 팁 감사합니다

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

C#-7. 객체지향과 클래스  (0) 2019.01.31
C#-6. 데이타 타입  (0) 2019.01.29
C#-4. 컴파일러와 dll파일  (0) 2019.01.25
C#-2. C#으로 첫 발자국  (0) 2019.01.24
C#-1. C#의 특징  (1) 2019.01.23
Posted by 토실토실천재