... | ... | @@ -5,26 +5,26 @@ |
|
|
#### **정수형**
|
|
|
| **자료형** | **크기** | **기본값** | **범위** | **.NET Framework 형식** |
|
|
|
| -------- | -------- | -------- | -------- | -------- | -------- |
|
|
|
| `sbyte` | 1byte | 0 | 0~255 | System.SByte |
|
|
|
| `byte` | 1byte | 0 | -128~127 | System.Byte |
|
|
|
| `short` | 2byte | 0 | -32,768~32,767 | System.Int16 |
|
|
|
| `ushort` | 2byte | 0 | 0~65,535 | System.UInt16 |
|
|
|
| `int` | 4byte | 0 | -2,147,483,648~2,147,483,647 | System.Int32 |
|
|
|
| `uint` | 4byte | 0 | 0~4,294,967,295 | System.Int32 |
|
|
|
| `long` | 8byte | 0L | -9,223,372,036,854,775,808~9,223,372,036,854,775,807 | System.Int64 |
|
|
|
| `ulong` | 8byte | 0 | 0~18,446,744,073,709,551,615 | System.UInt64 |
|
|
|
| `sbyte` | 1byte | 0 | 0 ~ 255 | System.SByte |
|
|
|
| `byte` | 1byte | 0 | -128 ~ 127 | System.Byte |
|
|
|
| `short` | 2byte | 0 | -32,768 ~ 32,767 | System.Int16 |
|
|
|
| `ushort` | 2byte | 0 | 0 ~ 65,535 | System.UInt16 |
|
|
|
| `int` | 4byte | 0 | -2,147,483,648 ~ 2,147,483,647 | System.Int32 |
|
|
|
| `uint` | 4byte | 0 | 0 ~ 4,294,967,295 | System.UInt32 |
|
|
|
| `long` | 8byte | 0L | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | System.Int64 |
|
|
|
| `ulong` | 8byte | 0 | 0 ~ 18,446,744,073,709,551,615 | System.UInt64 |
|
|
|
|
|
|
#### **실수형**
|
|
|
| **자료형** | **크기** | **기본값** | **범위** | **.NET Framework 형식** |
|
|
|
| -------- | -------- | -------- | -------- | -------- | -------- |
|
|
|
| `float` | 4byte | 0.0F | ±1.5e-45~±3.4e38 | System.Single |
|
|
|
| `double` | 8byte | 0.0D | ±5.0e-324~±1.7e308 | System.Double |
|
|
|
| `decimal` | 162byte | 0.0M | ±1.0×10e−±7.9×10e28 | System.Decimal |
|
|
|
| `float` | 4byte | 0.0F | ±1.5e-45 ~ ±3.4e38 | System.Single |
|
|
|
| `double` | 8byte | 0.0D | ±5.0e-324 ~ ±1.7e308 | System.Double |
|
|
|
| `decimal` | 162byte | 0.0M | ±1.0×10e ~ ±7.9×10e28 | System.Decimal |
|
|
|
|
|
|
#### **문자형**
|
|
|
| **자료형** | **크기** | **기본값** | **범위** | **인코딩 방식** | **.NET Framework 형식** |
|
|
|
| -------- | -------- | -------- | -------- | -------- | -------- | -------- |
|
|
|
| `char` | 2byte | ‘\0’ | U+0000~U+FFFF | UTF-16 | System.Char |
|
|
|
| `char` | 2byte | ‘\0’ | U+0000 ~ U+FFFF | UTF-16 | System.Char |
|
|
|
| `string` | 글자당 2byte | `null` | 문자열 | UTF-16 | System.String |
|
|
|
|
|
|
#### **논리형**
|
... | ... | @@ -33,7 +33,8 @@ |
|
|
| `bool` | | false | true, false | System.Boolean |
|
|
|
|
|
|
### **var 형식**
|
|
|
변수의 형식을 반드시 지정해줄 필요 없이 **var 형식**을 사용하여 값의 종류에 따라 컴파일러에서 가장 적합한 형식을 결정한 후 할당한다.
|
|
|
변수의 형식을 지정해줄 필요 없이 **var 형식**으로 선언하면 값의 종류에 따라 컴파일러에서 가장 적합한 형식으로 결정하여 할당한다.
|
|
|
|
|
|
```javascript
|
|
|
var i = 3; // int
|
|
|
var d = 3.0; // double
|
... | ... | @@ -46,15 +47,16 @@ Console.WriteLine(s.GetType().FullName()); // 출력 결과 : System.String |
|
|
|
|
|
#### **var 형식 사용의 제약 사항**
|
|
|
* 클래스의 속성으로 선언할 수 없으며, 지역 변수로 선언하여 사용 할 수 있다.
|
|
|
* 선언과 동시에 변수를 초기화를 해줘야며, null 또는 Anonymous Method로는 초기화 할 수 없다.
|
|
|
* var를 사용하여 선언된 변수를 초기화 식에서 사용할 수 없다. (ex. `var i = (i = 10));`)
|
|
|
* 변수 선언과 동시에 반드시 초기화되어야 하며, `null` 또는 *Anonymous Method*로는 초기화할 수 없다.
|
|
|
* **var 형식**으로 선언된 변수를 초기화 식에서 사용할 수 없다. (ex. `var i = (i = 10));`)
|
|
|
|
|
|
### **Nullable 형식**
|
|
|
**Nullable 형식**은 일반적인 형식의 값 이외에도 `null` 값을 저장할 수 있는 형식이다. `Nullable<T>`와 같이 구조체 형태로 선언하지만, 값 형식에 ‘?’를 붙여 사용할 수도 있다. 예를 들어 `Nullable<bool>` 또는 `bool?` 형식은 내부 값인 `true`, `false` 또는 `null` 값을 저장할 수 있다. `HasValue` 속성을 사용하면 값이 저장됐는지를 Boolean 값으로 반환하고, 값이 있다면 `Value` 속성을 사용하면 실제 저장된 값을 반환한다.
|
|
|
|
|
|
```javascript
|
|
|
int? number1 = null;
|
|
|
int? number2 = 2;
|
|
|
Nullable<int> number3 = null;
|
|
|
Nullable<int> number3 = null; // Nullable<int>와 int?는 같은 형태
|
|
|
|
|
|
intValue2++; // 값이 저장되어 있으므로 연산할 수 있다.
|
|
|
|
... | ... | @@ -69,7 +71,8 @@ Console.WriteLine(number2); // 출력 결과 : 3 |
|
|
```
|
|
|
|
|
|
### **구조체**
|
|
|
**구조체**는 *Field*, *Method*, **Event**, *Indexer* 등을 묶어 사용자가 원하는 형식으로 정의한 것이다. *Filed*는 구조체 내부에 선언된 속성으로 임의 형식의 변수를 말한다. **구조체**는 **Value Type**이기 때문에 선언할 때 **Stack** 공간에 할당된다. 구조체의 *Field*는 매개 변수가 있는 생성자를 호출하거나, ‘.’ 연산자를 이용해 접근하여 값을 초기화할 수 있다.
|
|
|
**구조체**는 *Field*, *Method*, *Event*, *Indexer*와 같은 *멤버(Member)*들을 묶어 사용자가 원하는 형식으로 정의한 것이다. *Filed*는 클래스 내부에 선언된 속성으로 임의 형식의 변수를 말한다. 멤버를 선언할 때 접근 한정자(`private`, `protected`, `public`)를 생략하면 `private`으로 정의된다. **구조체**는 **Value Type**으로 할당되기 때문에 선언할 때 **Stack** 공간에 데이터들이 저장된다. 구조체의 *Field*는 매개 변수가 있는 생성자를 호출하거나, ‘.’ 연산자를 이용해 값을 초기화할 수 있다.
|
|
|
|
|
|
```javascript
|
|
|
public struct Position
|
|
|
{
|
... | ... | @@ -83,6 +86,11 @@ public struct Position |
|
|
}
|
|
|
}
|
|
|
```
|
|
|
```javascript
|
|
|
Position position;
|
|
|
position.x = 2;
|
|
|
position.y = 3;
|
|
|
```
|
|
|
|
|
|
#### **구조체의 특징**
|
|
|
* 구조체의 필드는 `const` 또는 `static`으로 선언한 경우에만 초기화를 할 수 있다.
|
... | ... | @@ -102,17 +110,17 @@ public struct Position |
|
|
|
|
|
### **Value Type vs. Reference Type**
|
|
|
#### **Value Type**
|
|
|
**Value Type**은 변수의 값 자체가 **Stack**에 할당되는 형식이다. 기본 자료형(string은 예외) 또는 구조체 중 배열이 아닌 하나로 선언한 변수가 **Value Type**에 속하다,
|
|
|
**Value Type**은 변수의 값 자체가 **Stack**에 할당되는 형식이다. 배열로 선언되지 않은 기본 자료형(string은 제외), 구조체 또는 열거형 변수가 **Value Type**에 속하다,
|
|
|
|
|
|
#### **Reference Type**
|
|
|
**Reference Type**은 데이터를 저장하기 위해 **Heap**에 메모리를 할당하고, **Stack**의 변수에는 **Heap**에 할당된 데이터의 주소를 가리키는 형식이다. 기본 자료형의 string, 배열, 클래스, 클래스 등이 **Reference Type**에 속한다.
|
|
|
**Reference Type**은 데이터가 **Heap**에 할당되고, 그 공간의 주소를 **Stack**의 변수에 저장하여 데이터를 가리키는 형식이다. 기본 자료형의 string, 배열, 클래스 등이 **Reference Type**에 속한다.
|
|
|
|
|
|
#### **Value type과 Reference type 비교**
|
|
|
| **구분** | **Value type** | **Reference type** |
|
|
|
#### **Value Type과 Reference Type 비교**
|
|
|
| **구분** | **Value Type** | **Reference Type** |
|
|
|
| -------- | -------- | -------- |
|
|
|
| **할당 위치** | Stack | Heap |
|
|
|
| **저장 내용** | 데이터(값) | 데이터가 위치한 메모리 주소 |
|
|
|
| **변수 종류** | 기본 자료형(string 제외), 구조체, 열거형 | string, 배열, 클래스 등 |
|
|
|
| **저장 내용** | 데이터(값) | 데이터가 위치한 메모리의 주소 |
|
|
|
| **변수 종류** | 기본 자료형(string 제외), 구조체, 열거형 | string, 기본 자료형의 배열, 클래스 등 |
|
|
|
| **매개 변수** | Call by Value | Call by Reference |
|
|
|
| **소멸 시기** | 정의한 범위를 벗어날 때 | Garbage Collector에 의해 |
|
|
|
|
... | ... | @@ -121,6 +129,7 @@ public struct Position |
|
|
### **제어문 (선택문)**
|
|
|
#### **if 문**
|
|
|
**if 문**은 괄호 안에 조건식을 지정한 후에 그 결과가 `true`이면 포함된 구문을 실행하고, `false`이면 실행하지 않고 다음 코드로 넘어간다. 결과가 `false`인 경우에도 `else`를 사용해 구문을 추가할 수 있고, `else if`를 사용해 조건을 중첩할 수도 있다.
|
|
|
|
|
|
```javascript
|
|
|
int number = 3;
|
|
|
|
... | ... | @@ -140,22 +149,9 @@ else |
|
|
// 출력 결과 : Positive Number
|
|
|
```
|
|
|
|
|
|
#### **조건 연산자**
|
|
|
**조건 연산자**(또는 ***삼항 연산자***)는 조건식의 결과인 `treu` 또는 `false`에 따라 표현식의 두 값 중 하나를 반환한다. *조건식*의 결과가 `true`이면 *표현식1*을 반환하고, `false`이면 *표현식2*를 반환한다.
|
|
|
```
|
|
|
(조건식) ? 표현식1 : 표현식2;
|
|
|
```
|
|
|
```javascript
|
|
|
int number = 3;
|
|
|
string result;
|
|
|
|
|
|
result = (number % 2 == 0) ? "짝수" : "홀수";
|
|
|
|
|
|
Console.WriteLine(result); // 출력 결과 : 홀수
|
|
|
```
|
|
|
|
|
|
#### **switch 문**
|
|
|
**switch 문**은 *조건식*과 같은 경우를 선택하여 해당 구문을 실행한다. `case` 안에 구문 마지막에는 `break`을 사용해야 **swtich 문**을 끝낼 수 있으며, `default` 사용하여 나머지 조건에 해당하는 구문을 실행할 수도 있다. `switch`의 *조건식*에는 정수형 변수(`int`, `long` 등), `bool`, `char`, `string`, `enum` 또는 이러한 형식들의 *Nullable 형식*을 사용할 수 있다. 따라서 `case`에는 이러한 형식들의 값과 `null`을 사용할 수 있다.
|
|
|
|
|
|
```javascript
|
|
|
int value = 1;
|
|
|
|
... | ... | @@ -178,6 +174,7 @@ switch (value) |
|
|
### **제어문 (반복문)**
|
|
|
#### **for 문**
|
|
|
**for 문**은 *초기화* 코드가 실행 후 *조건식* -> *구문* -> *반복문*을 번갈아 가며 *조건식*의 결과가 `false`가 될 때까지 실행을 반복한다.
|
|
|
|
|
|
```
|
|
|
for ( 초기화; 조건식; 반복문 )
|
|
|
구문;
|
... | ... | @@ -195,6 +192,7 @@ Console.WriteLine(sum); // 실행 결과 : 15 |
|
|
|
|
|
#### **foreach 문**
|
|
|
**foreach 문**은 배열이나 **Collection**에 있는 데이터를 처음부터 끝까지 반복하면서 선언된 변수에 각 요소를 넣어 구문 안에서 해당 변수를 사용할 수 있게 해준다.
|
|
|
|
|
|
```
|
|
|
foreach ( 자료형 변수명 in 표현식 )
|
|
|
구문;
|
... | ... | @@ -233,6 +231,7 @@ Console.WriteLine(sum); // 실행 결과 : 15 |
|
|
|
|
|
#### **do-while 문**
|
|
|
**do-while 문**은 **while 문**과 마찬가지로 *조건식*의 결과가 `false`일 때까지 포함된 구문을 실행하면서 반복한다. **while 문**은 처음 실행될 때 *조건식*을 먼저 확인하지만, **do-while 문**은 *조건식*의 결과와 상관없이 반복할 구문을 최소 한번은 실행한다.
|
|
|
|
|
|
```
|
|
|
do
|
|
|
구문;
|
... | ... | @@ -255,6 +254,7 @@ Console.WriteLine(sum); // 실행 결과 : 15 |
|
|
### **제어문 (점프문)**
|
|
|
#### **break 문**
|
|
|
**break 문**은 `switch` 또는 `for`/`foreach`/`while`/`do`와 같은 반복문 내에서만 사용될 수 있다. **switch 문** 또는 `break`를 둘러싸고 있는 반복문을 종료하는 데 사용한다.
|
|
|
|
|
|
```javascript
|
|
|
int sum = 0;
|
|
|
|
... | ... | @@ -290,10 +290,11 @@ Console.WriteLine(sum); // 실행 결과 : 25 |
|
|
```
|
|
|
|
|
|
#### **goto 문**
|
|
|
**goto 문**은 미리 선언된 *레이블 문*으로 제어의 흐름을 옮기는 데 사용한다.
|
|
|
**goto 문**은 *레이블*로 지정한 위치로 이동할 때 사용한다. **goto 문**을 사용하기 위해 원하는 위치에 *레이블*을 미리 지정해야 한다,
|
|
|
|
|
|
#### **return 문**
|
|
|
**return 문**은 자신이 속한 Method의 실행을 종료하고 호출한 Method로 반환시킨다. 이때 반환할 값이 있으면 같이 반환된다. `void` 형식의 Method의 경우는 **return 문**을 생략할 수 있다.
|
|
|
|
|
|
```javascript
|
|
|
int computeArea(int width, int height)
|
|
|
{
|
... | ... | @@ -303,18 +304,64 @@ int computeArea(int width, int height) |
|
|
```
|
|
|
|
|
|
### **연산자**
|
|
|
* **관계 연산자** : `>`, `<`, `>=`, `<=`, `==`, `!=`
|
|
|
* **논리 연산자** : `&&`, `||`, `^`, `!`, `|`
|
|
|
* **산술 연산자** : `+`, `-`, `*`, `/`, `%`
|
|
|
* **대입 연산자** : `=`, `+=`, `-=`, `*=`, `/=`, `&=`
|
|
|
* **증감 연산자** : `++`, `--`
|
|
|
#### **관계 연산자** : `>`, `<`, `>=`, `<=`, `==`, `!=`
|
|
|
|
|
|
#### **논리 연산자** : `&&`, `||`, `^`, `!`, `|`
|
|
|
|
|
|
#### **산술 연산자** : `+`, `-`, `*`, `/`, `%`
|
|
|
|
|
|
#### **대입 연산자** : `=`, `+=`, `-=`, `*=`, `/=`, `&=`
|
|
|
|
|
|
#### **증감 연산자** : `++`, `--`
|
|
|
|
|
|
#### **기타 연산자**
|
|
|
* **:?** : **조건 연산자**(또는 ***삼항 연산자***)라고도 하며 *조건식*의 결과인 `true` 또는 `false`에 따라 표현식의 두 값 중 하나를 반환하는 연산자이다. *조건식*의 결과가 `true`이면 *표현식1*을 반환하고, `false`이면 *표현식2*를 반환한다.
|
|
|
|
|
|
```
|
|
|
(조건식) ? 표현식1 : 표현식2;
|
|
|
```
|
|
|
```javascript
|
|
|
int number = 3;
|
|
|
string result;
|
|
|
|
|
|
result = (number % 2 == 0) ? "짝수" : "홀수";
|
|
|
|
|
|
Console.WriteLine(result); // 출력 결과 : 홀수
|
|
|
```
|
|
|
|
|
|
* **??** : 피연산자가 `null`이 아닐 경우 왼쪽 피연산자를 반환하고, `null`일 경우 오른쪽 피연산자를 반환한다.
|
|
|
|
|
|
```javascript
|
|
|
int? number1 = null;
|
|
|
int? number2 = 3;
|
|
|
|
|
|
int result1 = number1 ?? -1;
|
|
|
int result2 = number2 ?? -1;
|
|
|
|
|
|
System.Console.WriteLine(result1); // 출력 결과 : -1
|
|
|
System.Console.WriteLine(result2); // 출력 결과 : 3
|
|
|
```
|
|
|
|
|
|
* **new** : 배열 선언하거나, 객체를 선언하고 생성자를 호출한다.
|
|
|
|
|
|
#### **new** : 배열 선언하거나, 객체를 선언하고 생성자를 호출한다.
|
|
|
```javascript
|
|
|
int array = new int[5];
|
|
|
Object obj = new Object();
|
|
|
```
|
|
|
#### **typeof(T)** : T 형식의 형식 객체를 반환한다.
|
|
|
|
|
|
* **default(T)** : T 형식의 기본값을 반환한다.
|
|
|
|
|
|
```javascript
|
|
|
int defaultInt = default(int);
|
|
|
double defaultDouble = default(double);
|
|
|
Object defaultObjet = default(Object);
|
|
|
|
|
|
Console.WriteLine(defaultInt); // 실행 결과 : 0
|
|
|
Console.WriteLine(defaultDouble); // 실행 결과 : 0.0
|
|
|
Console.WriteLine(defaultObjet); // 실행 결과 : null
|
|
|
```
|
|
|
* **typeof(T)** : T 형식의 대한 객체를 반환한다.
|
|
|
|
|
|
```javascript
|
|
|
Type typeInt = typeof(int);
|
|
|
Type typeObject = typeof(Object);
|
... | ... | @@ -323,7 +370,8 @@ Console.WriteLine(typeInt); // 실행 결과 : System.Int32 |
|
|
Console.WriteLine(typeObject); // 실행 결과 : System.Object
|
|
|
```
|
|
|
|
|
|
#### **checked** : 정수 계열 형식의 산술 연산 및 변환에 대한 Overflow를 검사한다.
|
|
|
* **checked** : 정수 계열 형식의 산술 연산 및 변환에 대한 Overflow를 검사한다.
|
|
|
|
|
|
```javascript
|
|
|
int number = 10;
|
|
|
int result;
|
... | ... | @@ -340,7 +388,8 @@ catch (System.OverflowException e) |
|
|
// 실행 결과 : System.OverflowException: 산술 연산으로 인해 오버플로가 발생했습니다. (이후 생략)
|
|
|
```
|
|
|
|
|
|
#### **unchecked** : 정수 계열 형식의 산술 연산 및 변환에 대한 Overflow 검사를 무시한다.
|
|
|
* **unchecked** : 정수 계열 형식의 산술 연산 및 변환에 대한 Overflow 검사를 무시한다.
|
|
|
|
|
|
```javascript
|
|
|
int number = 10;
|
|
|
int result;
|
... | ... | @@ -350,38 +399,8 @@ result = unchecked(2147483647 + number); |
|
|
Console.WriteLine(result); // 실행 결과 : -2147483639
|
|
|
```
|
|
|
|
|
|
#### **default(T)** : T 형식의 기본값을 반환한다.
|
|
|
배열 선언하거나, 객체를 선언하고 생성자를 호출한다.
|
|
|
```javascript
|
|
|
int defaultInt = default(int);
|
|
|
double defaultDouble = default(double);
|
|
|
Object defaultObjet = default(Object);
|
|
|
|
|
|
Console.WriteLine(defaultInt); // 실행 결과 : 0
|
|
|
Console.WriteLine(defaultDouble); // 실행 결과 : 0.0
|
|
|
Console.WriteLine(defaultObjet); // 실행 결과 : null
|
|
|
```
|
|
|
|
|
|
#### **delegate** : Anonymous Method를 정의한다.
|
|
|
```javascript
|
|
|
delegate void Printer(string str);
|
|
|
```
|
|
|
```javascript
|
|
|
Printer printer = delegate(string s)
|
|
|
{
|
|
|
System.Console.WriteLine(s);
|
|
|
};
|
|
|
|
|
|
printer("The delegate using the anonymous method is called.");
|
|
|
* **is** : 형 변환에 대한 가능성 여부를 `true`, `false`로 반환해 준다.
|
|
|
|
|
|
// 출력 결과 : The delegate using the anonymous method is called.
|
|
|
```
|
|
|
|
|
|
#### **await** : 기다리던 작업이 완료될 때까지 Async Method를 일시 중단한다.
|
|
|
```javascript
|
|
|
string result = await WaitAsynchronouslyAsync();
|
|
|
```
|
|
|
#### **is** : 형 변환에 대한 가능성 여부를 `true`, `false`로 반환해 준다.
|
|
|
```javascript
|
|
|
class BaseClass { }
|
|
|
class DerivedClass : BaseClass { }
|
... | ... | @@ -396,7 +415,8 @@ if (d is BaseClass) { } // true |
|
|
if (d is DerivedClass) { } // true
|
|
|
```
|
|
|
|
|
|
#### **as** : 형 변환이 가능하면 변환된 값을 반환하고, 불가능하면 `null`을 반환해 준다.
|
|
|
* **as** : 형 변환이 가능하면 변환된 값을 반환하고, 불가능하면 `null`을 반환해 준다.
|
|
|
|
|
|
```javascript
|
|
|
class BaseClass { }
|
|
|
class DerivedClass : BaseClass { }
|
... | ... | @@ -411,25 +431,3 @@ DerivedClass d2 = b as DerivedClass; |
|
|
if(b2 != null) { } // true
|
|
|
if(d2 != null) { } // false
|
|
|
``` |
|
|
\ No newline at end of file |
|
|
|
|
|
#### **??** : 피연산자가 `null`이 아닐 경우 왼쪽 피연산자를 반환하고, `null`일 경우 오른쪽 피연산자를 반환한다.
|
|
|
```javascript
|
|
|
int? number1 = null;
|
|
|
int? number2 = 3;
|
|
|
|
|
|
int result1 = number1 ?? -1;
|
|
|
int result2 = number2 ?? -1;
|
|
|
|
|
|
System.Console.WriteLine(result1); // 출력 결과 : -1
|
|
|
System.Console.WriteLine(result2); // 출력 결과 : 3
|
|
|
```
|
|
|
|
|
|
#### **=>** : Lambda 식에 사용하여 오른쪽의 Lambda 본문과 왼쪽의 입력 변수를 구분한다.
|
|
|
```javascript
|
|
|
delegate int computeSum(int number1, int number2);
|
|
|
```
|
|
|
```javascript
|
|
|
computerSum sum = (a, b) => a+ b;
|
|
|
|
|
|
System.Console.WriteLine(sum(2, 3)); // 출력 결과 : 5
|
|
|
``` |
|
|
\ No newline at end of file |