... | ... | @@ -17,15 +17,15 @@ |
|
|
#### **실수형**
|
|
|
| **자료형** | **크기** | **기본값** | **범위** | **.NET Framework 형식** |
|
|
|
| -------- | -------- | -------- | -------- | -------- | -------- |
|
|
|
| `float` | 4byte | 0.0F | 0~255 | System.Single |
|
|
|
| `double` | 8byte | 0.0D | -128~127 | System.Double |
|
|
|
| `decimal` | 162byte | 0.0M | -32,768~32,767 | 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 | System.Char |
|
|
|
| `string` | | | 문자열 | System.String |
|
|
|
| **자료형** | **크기** | **기본값** | **범위** | **인코딩 방식** | **.NET Framework 형식** |
|
|
|
| -------- | -------- | -------- | -------- | -------- | -------- | -------- |
|
|
|
| `char` | 2byte | ‘\0’ | U+0000~U+FFFF | UTF-16 | System.Char |
|
|
|
| `string` | 글자당 2byte | `null` | 문자열 | UTF-16 | System.String |
|
|
|
|
|
|
#### **논리형**
|
|
|
| **자료형** | **크기** | **기본값** | **범위** | **.NET Framework 형식** |
|
... | ... | @@ -33,32 +33,39 @@ |
|
|
| `bool` | | false | true, false | System.Boolean |
|
|
|
|
|
|
### **var 형식**
|
|
|
변수의 형식을 반드시 지정해줄 필요 없이 **var 형식**을 사용하여 값의 종류에 따라 컴파일러가 유추하여 사용한다.
|
|
|
변수의 형식을 반드시 지정해줄 필요 없이 **var 형식**을 사용하여 값의 종류에 따라 컴파일러에서 가장 적합한 형식을 결정한 후 할당한다.
|
|
|
```javascript
|
|
|
var i = 3; // int
|
|
|
var d = 3.0; // double
|
|
|
var s = "value"; // String
|
|
|
|
|
|
Console.WriteLine(i.GetType().FullName()); // 출력 결과 : System.Int32
|
|
|
Console.WriteLine(i.GetType().FullName()); // 출력 결과 : System.Double
|
|
|
Console.WriteLine(i.GetType().FullName()); // 출력 결과 : System.String
|
|
|
Console.WriteLine(d.GetType().FullName()); // 출력 결과 : System.Double
|
|
|
Console.WriteLine(s.GetType().FullName()); // 출력 결과 : System.String
|
|
|
```
|
|
|
|
|
|
#### **var 형식 사용의 제약 사항**
|
|
|
* 클래스의 속성으로 선언할 수 없으며, 지역 변수로 선언하여 사용 할 수 있다.
|
|
|
* 선언과 동시에 변수를 초기화를 해줘야며, null 또는 Anonymous Method로는 초기화 할 수 없다.
|
|
|
* var를 사용하여 선언된 변수를 초기화 식에서 사용할 수 없다. (ex. `var i = (i = 10));`)
|
|
|
|
|
|
### **Nullable 형식**
|
|
|
**Nullable 형식**은 내부 형식의 값 이외에도 `null` 값을 저장할 수 있는 형식이다. `Nullable<T>`과 같이 구조체로 표기하지만, 값 형식에 ‘?’를 붙여 사용할 수 있다. 예를 들어 `Nullable<bool>` 또는 `bool?` 형식은 내부 값인 `true`, `false` 또는 `null` 값을 저장할 수 있다. `HasValue` 속성을 사용하면 값이 저장됐는지를 Boolean 값으로 반환하고, 값이 있다면 `Value` 속성을 사용하면 실제 저장된 값을 반환한다.
|
|
|
**Nullable 형식**은 일반적인 형식의 값 이외에도 `null` 값을 저장할 수 있는 형식이다. `Nullable<T>`와 같이 구조체 형태로 선언하지만, 값 형식에 ‘?’를 붙여 사용할 수도 있다. 예를 들어 `Nullable<bool>` 또는 `bool?` 형식은 내부 값인 `true`, `false` 또는 `null` 값을 저장할 수 있다. `HasValue` 속성을 사용하면 값이 저장됐는지를 Boolean 값으로 반환하고, 값이 있다면 `Value` 속성을 사용하면 실제 저장된 값을 반환한다.
|
|
|
```javascript
|
|
|
int? intValue1 = null;
|
|
|
int? intValue2 = 2;
|
|
|
int? number1 = null;
|
|
|
int? number2 = 2;
|
|
|
Nullable<int> number3 = null;
|
|
|
|
|
|
intValue2++; // 값이 저장되어 있으므로 연산할 수 있다.
|
|
|
|
|
|
if ( intValue1 == null ) // true
|
|
|
if ( intValue2 == null ) // false
|
|
|
if ( number1 == null ) { } // true
|
|
|
if ( number2 == null ) { } // false
|
|
|
if ( number2 == 3) { } // true
|
|
|
|
|
|
Console.WriteLine(intValue1.HasValue); // 출력 결과 : false
|
|
|
Console.WriteLine(intValue2.HasValue); // 출력 결과 : true
|
|
|
Console.WriteLine(intValue2.Value); // 출력 결과 : 3
|
|
|
Console.WriteLine(intValue2); // 출력 결과 : 3
|
|
|
Console.WriteLine(number1.HasValue); // 출력 결과 : false
|
|
|
Console.WriteLine(number2.HasValue); // 출력 결과 : true
|
|
|
Console.WriteLine(number2.Value); // 출력 결과 : 3
|
|
|
Console.WriteLine(number2); // 출력 결과 : 3
|
|
|
```
|
|
|
|
|
|
### **구조체**
|
... | ... | @@ -87,7 +94,7 @@ public struct Position |
|
|
|
|
|
### **Stack vs. Heap**
|
|
|
#### **Stack**
|
|
|
*Stack*은 가장 나중에 들어간 데이터가 먼저 출력(LIFO, Last In First Out)된다는 특징을 가진 자료구조이다. **Stack**은 자료구조에서 다루는 *Stack*의 원리로 데이터를 저장하는 메모리 공간이다. Thread는 이 공간을 활용해서 Method의 실행, 지역변수 선언, 호출 후 실행될 주소를 처리한다. **Stack**은 기본적으로 1MB 공간을 할당하는데 이 공간을 넘어가면 *Stack Overflow*가 발생한다. 예를 들어 재귀(recursive)로 Method를 계속해서 호출하면 **Stack**의 공간이 모두 사용되어 *Stack Overflow*가 발생한다. 이 경우 오류를 알리는 Method를 호출할 공간조차 없기 때문에 정확한 원인을 파악하는 데 어려움이 있다.
|
|
|
**Stack**은 자료구조에서 다루는 *Stack*의 원리로 데이터를 저장하는 메모리 공간이다. Thread는 이 공간을 활용해서 Method의 실행, 지역변수 선언, 호출 후 실행될 주소를 처리한다. **Stack**은 기본적으로 1MB 공간을 할당하는데 이 공간을 넘어가면 *Stack Overflow*가 발생한다. 예를 들어 재귀(recursive)로 Method를 계속해서 호출하면 **Stack**의 공간이 모두 사용되어 *Stack Overflow*가 발생한다. 이 경우 오류를 알리는 Method를 호출할 공간조차 없기 때문에 정확한 원인을 파악하는 데 어려움이 있다.
|
|
|
|
|
|
#### **Heap**
|
|
|
**Heap**은 프로그램 실행 중 필요로 요청했을 때 저장하는 메모리 공간이다. 어느 시점에 어느 정도의 메모리 공간이 필요한지를 예상할 수 없으므로 **Heap**의 크기는 프로그램 실행 중에 결정된다. C#에서는 `new` 연산자로 참조 형식의 변수 또는 객체를 선언하면 **Heap**에 할당된다. 또한, **CLR(Common Language Runtime)**의 Garbage Collector가 실행되면서 **Heap**을 관리하기 때문에 사용되지 않는 공간은 해제하여 여유 공간을 확보한다.
|
... | ... | @@ -147,7 +154,7 @@ Console.WriteLine(result); // 출력 결과 : 홀수 |
|
|
```
|
|
|
|
|
|
#### **switch 문**
|
|
|
**switch 문**은 *조건식*과 같은 경우를 선택하여 해당 구문을 실행한다. `case` 안에 구문 마지막에는 `break`을 사용해야 **swtich 문**을 끝낼 수 있으며, `default` 사용하여 나머지 조건에 해당하는 구문을 실행할 수도 있다.
|
|
|
**switch 문**은 *조건식*과 같은 경우를 선택하여 해당 구문을 실행한다. `case` 안에 구문 마지막에는 `break`을 사용해야 **swtich 문**을 끝낼 수 있으며, `default` 사용하여 나머지 조건에 해당하는 구문을 실행할 수도 있다. `switch`의 *조건식*에는 정수형 변수(`int`, `long` 등), `bool`, `char`, `string`, `enum` 또는 이러한 형식들의 *Nullable 형식*을 사용할 수 있다. 따라서 `case`에는 이러한 형식들의 값과 `null`을 사용할 수 있다.
|
|
|
```javascript
|
|
|
int value = 1;
|
|
|
|
... | ... | @@ -197,7 +204,7 @@ int sum = 0; |
|
|
|
|
|
foreach (int element in array )
|
|
|
{
|
|
|
sum+= element;
|
|
|
sum += element;
|
|
|
}
|
|
|
|
|
|
Console.WriteLine(sum); // 실행 결과 : 15
|
... | ... | @@ -299,18 +306,129 @@ int computeArea(int width, int height) |
|
|
* **논리 연산자** : `&&`, `||`, `^`, `!`, `|`
|
|
|
* **산술 연산자** : `+`, `-`, `*`, `/`, `%`
|
|
|
* **대입 연산자** : `=`, `+=`, `-=`, `*=`, `/=`, `&=`
|
|
|
* **대입 연산자** : `++`, `--`
|
|
|
* **증감 연산자** : `++`, `--`
|
|
|
|
|
|
| **연산자** | **특징** | **예시** |
|
|
|
| -------- | -------- | -------- |
|
|
|
| `new` | 배열 선언하거나, 객체를 선언하고 생성자를 호출 | Object obj = new Object(); |
|
|
|
| `typeof(T)` | T에 대한 형식 객체를 반환 | Type t = typeof(int); |
|
|
|
| `checked` | 산술 연산 및 변환에 대한 Overflow를 검사 | checked(2147483647 + ten) |
|
|
|
| `unchecked` | 산술 연산 및 변환에 대한 Overflow 검사를 무시 | unchecked(2147483647 + ten) |
|
|
|
| `default(T)` | T 형식의 기본값을 반환 | T temp = default(int); |
|
|
|
| `delegate` | Anonymous Method를 정의 | Del d = delegate() { } |
|
|
|
| `await` | 기다리던 작업이 완료될 때까지 비동기 Method를 일시 중단 | string urlContents = await getStringTask; |
|
|
|
| `is` | 형 변환에 대한 가능성 여부를 `true`, `false`로 반환 | if (d is Base) |
|
|
|
| `as` | 형 변환이 가능하면 변환된 값을 반환하고, 불가능하면 `null`을 반환 | Base b = d as Base; |
|
|
|
| `??` | 피연산자가 `null`이 아닐 경우 왼쪽 피연산자를 반환하고, `null`일 경우 오른쪽 피연산자를 반환 | x ?? -1 |
|
|
|
| `=>` | Lambda 식을 사용 | (a, b) => a + b | |
|
|
\ No newline at end of file |
|
|
#### **new** : 배열 선언하거나, 객체를 선언하고 생성자를 호출한다.
|
|
|
```javascript
|
|
|
int array = new int[5];
|
|
|
Object obj = new Object();
|
|
|
```
|
|
|
#### **typeof(T)** : T 형식의 형식 객체를 반환한다.
|
|
|
```javascript
|
|
|
Type typeInt = typeof(int);
|
|
|
Type typeObject = typeof(Object);
|
|
|
|
|
|
Console.WriteLine(typeInt); // 실행 결과 : System.Int32
|
|
|
Console.WriteLine(typeObject); // 실행 결과 : System.Object
|
|
|
```
|
|
|
|
|
|
#### **checked** : 정수 계열 형식의 산술 연산 및 변환에 대한 Overflow를 검사한다.
|
|
|
```javascript
|
|
|
int number = 10;
|
|
|
int result;
|
|
|
|
|
|
try
|
|
|
{
|
|
|
result = checked(2147483647 + number); // OverflowException
|
|
|
}
|
|
|
catch (System.OverflowException e)
|
|
|
{
|
|
|
Console.WriteLine(e.ToString());
|
|
|
}
|
|
|
|
|
|
// 실행 결과 : System.OverflowException: 산술 연산으로 인해 오버플로가 발생했습니다. (이후 생략)
|
|
|
```
|
|
|
|
|
|
#### **unchecked** : 정수 계열 형식의 산술 연산 및 변환에 대한 Overflow 검사를 무시한다.
|
|
|
```javascript
|
|
|
int number = 10;
|
|
|
int result;
|
|
|
|
|
|
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.");
|
|
|
|
|
|
// 출력 결과 : 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 { }
|
|
|
```
|
|
|
```javascript
|
|
|
BaseClass b = new BaseClass();
|
|
|
BaseClass d = new DerivedClass();
|
|
|
|
|
|
if (b is BaseClass) { } // true
|
|
|
if (b is DerivedClass) { } // false
|
|
|
if (d is BaseClass) { } // true
|
|
|
if (d is DerivedClass) { } // true
|
|
|
```
|
|
|
|
|
|
#### **as** : 형 변환이 가능하면 변환된 값을 반환하고, 불가능하면 `null`을 반환해 준다.
|
|
|
```javascript
|
|
|
class BaseClass { }
|
|
|
class DerivedClass : BaseClass { }
|
|
|
```
|
|
|
```javascript
|
|
|
BaseClass b = new BaseClass();
|
|
|
DerivedClass d = new DerivedClass();
|
|
|
|
|
|
BaseClass b2 = d as BaseClass;
|
|
|
DerivedClass d2 = b as DerivedClass;
|
|
|
|
|
|
if(b2 != null) { } // true
|
|
|
if(d2 != null) { } // false
|
|
|
```
|
|
|
|
|
|
#### **??** : 피연산자가 `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 |