... | @@ -1385,46 +1385,47 @@ namespace ConsoleApplication1 |
... | @@ -1385,46 +1385,47 @@ namespace ConsoleApplication1 |
|
## 질문사항
|
|
## 질문사항
|
|
|
|
|
|
* 스택 영역의 사이즈는 어떻게 결정되는가?
|
|
* 스택 영역의 사이즈는 어떻게 결정되는가?
|
|
스택 영역은 스레드 당 1개씩 생성되며, 기본 크기는 1MB이다. 하지만 1MB를 다 commit 한 상태는 아니고 reserve 상태에서 4KB씩 commit 한다.
|
|
스택 영역은 스레드 당 1개씩 생성되며, 기본 크기는 1MB이다. 하지만 1MB를 다 commit 한 상태는 아니고 reserve 상태에서 4KB씩 commit 한다.
|
|
|
|
<br />
|
|
* 생성자 내에서 exception이 발생되면 객체에는 어떤 값이 리턴되는가?
|
|
* 생성자 내에서 exception이 발생되면 객체에는 어떤 값이 리턴되는가?
|
|
|
|
실제 코드로 실험해보려 했지만 객체가 해제되는 적당한 예제를 만들기가 쉽지 않았다. 아래는 MSDN 검색 결과이다.
|
|
>생성자에서 예외가 발생했을 때, 생성자가 호출돼서 객체 자체의 메모리는 이미 할당된 상태입니다. 따라서 컴파일러는 예외가 발생 된 후 객체가 차지하는 메모리를 자동으로 해제합니다. (MSDN)
|
|
>생성자에서 예외가 발생했을 때, 생성자가 호출돼서 객체 자체의 메모리는 이미 할당된 상태입니다. 따라서 컴파일러는 예외가 발생 된 후 객체가 차지하는 메모리를 자동으로 해제합니다. (MSDN)
|
|
|
|
<br />
|
|
실제 코드로 실험해보려 했지만 객체가 해제되는 적당한 예제를 만들기가 쉽지 않았다.
|
|
|
|
|
|
|
|
* C#에서 전역 변수는 언제 쓰는가?
|
|
* C#에서 전역 변수는 언제 쓰는가?
|
|
> C#은 일부 다른 언어와 달리 전역 변수 또는 메서드가 없습니다.(MSDN)
|
|
> C#은 일부 다른 언어와 달리 전역 변수 또는 메서드가 없습니다.(MSDN)
|
|
|
|
<br />
|
|
* 추상클래스와 인터페이스는 프로퍼티를 가질 수 있는가?
|
|
* 추상클래스와 인터페이스는 프로퍼티를 가질 수 있는가?
|
|
추상클래스는 가질 수 있고, 인터페이스는 가질 수 없다.
|
|
추상클래스는 가질 수 있고, 인터페이스는 가질 수 없다.
|
|
|
|
<br />
|
|
* 추상클래스와 인터페이스의 차이는?
|
|
* 추상클래스와 인터페이스의 차이는?
|
|
|
|
|
|
|
|
|
|
|
|
<br />
|
|
* sealed 예약어를 쓰는 이유는?
|
|
* sealed 예약어를 쓰는 이유는?
|
|
가상 함수를 호출하게 되면 CLR은 런타임에 호출 변수가 실제로 참조하는 타입을 확인해서 그에 맞는 메서드를 호출한다. 하지만 sealed 예약어를 쓰면 CLR은 더이상 메서드를 찾을 클래스가 없다는 것을 알려주기 때문에 작업 속도가 향상된다.
|
|
가상 함수를 호출하게 되면 CLR은 런타임에 호출 변수가 실제로 참조하는 타입을 확인해서 그에 맞는 메서드를 호출한다. 하지만 sealed 예약어를 쓰면 CLR은 더이상 메서드를 찾을 클래스가 없다는 것을 알려주기 때문에 작업 속도가 향상된다.
|
|
|
|
<br />
|
|
* object 객체를 new 써서 생성할 수 있는가?
|
|
* object 객체를 new 써서 생성할 수 있는가?
|
|
가능하다.
|
|
가능하다.
|
|
|
|
<br />
|
|
|
|
|
|
* 배열을 GetType해서 IsClass를 출력하면 결과값이 어떻게 나오는가?
|
|
* 배열을 GetType해서 IsClass를 출력하면 결과값이 어떻게 나오는가?
|
|
결과는 다음과 같다.
|
|
결과는 다음과 같다.
|
|
```c#
|
|
|
|
|
|
```c#
|
|
Type type = arr.GetType();
|
|
Type type = arr.GetType();
|
|
Console.WriteLine(type.IsClass); //배열은 IsClass 했을 때 true;
|
|
Console.WriteLine(type.IsClass); //배열은 IsClass 했을 때 true
|
|
|
|
|
|
type = enumTest.GetType();
|
|
type = enumTest.GetType();
|
|
Console.WriteLine(type.IsClass); //열거형은 IsClass 했을 때 false;
|
|
Console.WriteLine(type.IsClass); //열거형은 IsClass 했을 때 false
|
|
|
|
|
|
Vector v = new Vector() { x = 1, y = 2 }; //이렇게 간단 초기화 가능
|
|
Vector v = new Vector() { x = 1, y = 2 }; //이렇게 간단 초기화 가능
|
|
type = v.GetType();
|
|
type = v.GetType();
|
|
Console.WriteLine(type.IsClass); //구조체는 IsClass 했을 때 false;
|
|
Console.WriteLine(type.IsClass); //구조체는 IsClass 했을 때 false
|
|
```
|
|
```
|
|
|
|
|
|
* 객체 사이에 == 연산자를 사용하면?
|
|
* 객체 사이에 == 연산자를 사용하면?
|
|
결과는 다음과 같다.
|
|
결과는 다음과 같다.
|
|
|
|
|
|
```c#
|
|
```c#
|
|
class EqualOpTest
|
|
class EqualOpTest
|
|
{
|
|
{
|
... | @@ -1451,7 +1452,8 @@ class EqualOpTest |
... | @@ -1451,7 +1452,8 @@ class EqualOpTest |
|
if (dog1 == dog3) Console.WriteLine("dog1,dog3 ==."); //출력O
|
|
if (dog1 == dog3) Console.WriteLine("dog1,dog3 ==."); //출력O
|
|
|
|
|
|
// == 연산자는 같은 형의 기본형에 대한 비교를 위한 연산자로서 양쪽의 자료형이 다르면 컴파일 단계에서 연산자 에러가 난다.
|
|
// == 연산자는 같은 형의 기본형에 대한 비교를 위한 연산자로서 양쪽의 자료형이 다르면 컴파일 단계에서 연산자 에러가 난다.
|
|
// Equals 메서드는 2개의 기본형이나 객체에 대한 비교를 수행하는 형으로서 2개의 형이 다르면 비교시 에러가 나지 않고, 형이 동일할 경우 값이 일치 여부까지 비교한다.
|
|
// Equals 메서드는 2개의 기본형이나 객체에 대한 비교를 수행하는 형으로서 2개의 형이 다르면 비교시 에러가 나지 않고,
|
|
|
|
// 형이 동일할 경우 값이 일치 여부까지 비교한다.
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
... | @@ -1480,6 +1482,7 @@ class Dog |
... | @@ -1480,6 +1482,7 @@ class Dog |
|
```
|
|
```
|
|
|
|
|
|
* 같은 값을 가지는 short와 int에 Equals() 메서드를 사용하면 결과값이 어떻게 나오는가?
|
|
* 같은 값을 가지는 short와 int에 Equals() 메서드를 사용하면 결과값이 어떻게 나오는가?
|
|
|
|
|
|
```c#
|
|
```c#
|
|
int a = 256;
|
|
int a = 256;
|
|
short b = 256;
|
|
short b = 256;
|
... | @@ -1490,10 +1493,11 @@ Console.WriteLine(b.Equals(a)); //False 출력. |
... | @@ -1490,10 +1493,11 @@ Console.WriteLine(b.Equals(a)); //False 출력. |
|
//내부적으로 as 연산자로 형변환을 하기 때문에
|
|
//내부적으로 as 연산자로 형변환을 하기 때문에
|
|
//형변환이 되는 short -> int는 형변환 후 값을 비교해서 값이 같기 때문에 true.
|
|
//형변환이 되는 short -> int는 형변환 후 값을 비교해서 값이 같기 때문에 true.
|
|
//형변환이 되지 않는 int -> short는 as 연산 후 null 값을 리턴하기 때문에 false.
|
|
//형변환이 되지 않는 int -> short는 as 연산 후 null 값을 리턴하기 때문에 false.
|
|
```
|
|
```
|
|
|
|
|
|
* switch case 문에서 case에 문자열이 올 수 있는가?
|
|
* switch case 문에서 case에 문자열이 올 수 있는가?
|
|
가능하다. 결과는 다음과 같다.
|
|
가능하다. 결과는 다음과 같다.
|
|
|
|
|
|
```c#
|
|
```c#
|
|
class SwitchString
|
|
class SwitchString
|
|
{
|
|
{
|
... | @@ -1518,6 +1522,10 @@ class SwitchString |
... | @@ -1518,6 +1522,10 @@ class SwitchString |
|
```
|
|
```
|
|
|
|
|
|
* readonly와 const의 차이는?
|
|
* readonly와 const의 차이는?
|
|
|
|
C# 에서 const는 컴파일 상수이며, readonly는 런타임 상수이다. const는 내장자료형(정수형,실수형, enum, string)에 대해서만 쓸 수 있으며, 변수 선언과 동시에 초기화를 해야한다.
|
|
|
|
readonly는 모든 자료형에 사용 할 수 있으며, 변수 선언과 동시에 초기화하거나 생성자에서 초기화 해야한다.
|
|
|
|
|
|
|
|
const는 컴파일 상수이기 때문에 const로 선언된 변수가 사용되면 변수에 대한 참조가 아닌, 실제 상수로 치환되어 사용 된다. 이렇게 const로 선언되면 수행 성능이 좋아지지만, const 변수 변경 시, 다시 컴파일을 해야한다.
|
|
|
|
그렇기 때문에 const는 ‘이후에 바뀔 가능성이 없는 상수’에 주로 쓰이고, readonly는 그 이외의 상수에 주로 사용한다.
|
|
|
|
|
|
*
|
|
|
|
|
|
|