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 토실토실천재