... | ... | @@ -1385,27 +1385,137 @@ namespace ConsoleApplication1 |
|
|
## 질문사항
|
|
|
|
|
|
* 스택 영역의 사이즈는 어떻게 결정되는가?
|
|
|
스택 영역은 스레드 당 1개씩
|
|
|
스택 영역은 스레드 당 1개씩 생성되며, 기본 크기는 1MB이다. 하지만 1MB를 다 commit 한 상태는 아니고 reserve 상태에서 4KB씩 commit 한다.
|
|
|
|
|
|
* 생성자 내에서 exception이 발생되면 객체에는 어떤 값이 리턴되는가?
|
|
|
|
|
|
* C#에서 전역변수는 언제 쓰는가?
|
|
|
>생성자에서 예외가 발생했을 때, 생성자가 호출돼서 객체 자체의 메모리는 이미 할당된 상태입니다. 따라서 컴파일러는 예외가 발생 된 후 객체가 차지하는 메모리를 자동으로 해제합니다. (MSDN)
|
|
|
|
|
|
* 추상클래스와 인터페이스는 프로퍼티를 가질 수 있는가?
|
|
|
실제 코드로 실험해보려 했지만 객체가 해제되는 적당한 예제를 만들기가 쉽지 않았다.
|
|
|
|
|
|
* C#에서 전역 변수는 언제 쓰는가?
|
|
|
> C#은 일부 다른 언어와 달리 전역 변수 또는 메서드가 없습니다.(MSDN)
|
|
|
|
|
|
* 추상클래스와 인터페이스는 프로퍼티를 가질 수 있는가?
|
|
|
추상클래스는 가질 수 있고, 인터페이스는 가질 수 없다.
|
|
|
|
|
|
* 추상클래스와 인터페이스의 차이는?
|
|
|
|
|
|
|
|
|
|
|
|
* sealed 예약어를 쓰는 이유는?
|
|
|
가상 함수를 호출하게 되면 CLR은 런타임에 호출 변수가 실제로 참조하는 타입을 확인해서 그에 맞는 메서드를 호출한다. 하지만 sealed 예약어를 쓰면 CLR은 더이상 메서드를 찾을 클래스가 없다는 것을 알려주기 때문에 작업 속도가 향상된다.
|
|
|
|
|
|
* object 객체를 new 써서 생성할 수 있는가?
|
|
|
가능하다.
|
|
|
|
|
|
* 배열을 GetType해서 IsClass를 출력하면 결과값이 어떻게 나오는가?
|
|
|
결과는 다음과 같다.
|
|
|
```c#
|
|
|
Type type = arr.GetType();
|
|
|
Console.WriteLine(type.IsClass); //배열은 IsClass 했을 때 true;
|
|
|
|
|
|
type = enumTest.GetType();
|
|
|
Console.WriteLine(type.IsClass); //열거형은 IsClass 했을 때 false;
|
|
|
|
|
|
* 배열을 GetType해서 IsClass를 출력하면 결과값이 어떻게 나오는가?
|
|
|
Vector v = new Vector() { x = 1, y = 2 }; //이렇게 간단 초기화 가능
|
|
|
type = v.GetType();
|
|
|
Console.WriteLine(type.IsClass); //구조체는 IsClass 했을 때 false;
|
|
|
```
|
|
|
|
|
|
* 객체 사이에 == 연산자를 사용하면?
|
|
|
결과는 다음과 같다.
|
|
|
```c#
|
|
|
class EqualOpTest
|
|
|
{
|
|
|
public static void Main()
|
|
|
{
|
|
|
string s1 = "검둥개";
|
|
|
string s2 = "검둥개";
|
|
|
string s3 = s1;
|
|
|
|
|
|
if (s1.Equals(s2)) Console.WriteLine("Equals1같음."); //출력
|
|
|
if (s1.Equals(s3)) Console.WriteLine("Equals2같음."); //출력
|
|
|
|
|
|
if (s1 == s2) Console.WriteLine("==같음1"); //출력 //string의 ==는 equals를 호출하기 때문에 equals와 기능적인 차이는 없다.
|
|
|
if (s1 == s3) Console.WriteLine("==같음2"); //출력
|
|
|
|
|
|
Dog dog1 = new Dog(10);
|
|
|
Dog dog2 = new Dog(10);
|
|
|
Dog dog3 = dog1;
|
|
|
|
|
|
if (dog1.Equals(dog2)) Console.WriteLine("dog1,dog2 equal."); //출력X //스택값이 다르기 때문에
|
|
|
if (dog1.Equals(dog3)) Console.WriteLine("dog1,dog3 equal."); //출력 //스택값이 같으므로
|
|
|
|
|
|
if (dog1 == dog2) Console.WriteLine("dog1,dog2 ==."); //출력X
|
|
|
if (dog1 == dog3) Console.WriteLine("dog1,dog3 ==."); //출력O
|
|
|
|
|
|
// == 연산자는 같은 형의 기본형에 대한 비교를 위한 연산자로서 양쪽의 자료형이 다르면 컴파일 단계에서 연산자 에러가 난다.
|
|
|
// Equals 메서드는 2개의 기본형이나 객체에 대한 비교를 수행하는 형으로서 2개의 형이 다르면 비교시 에러가 나지 않고, 형이 동일할 경우 값이 일치 여부까지 비교한다.
|
|
|
}
|
|
|
}
|
|
|
|
|
|
class Dog
|
|
|
{
|
|
|
int age;
|
|
|
|
|
|
public Dog(int age)
|
|
|
{
|
|
|
this.age = age;
|
|
|
}
|
|
|
|
|
|
public override bool Equals(object obj)
|
|
|
{
|
|
|
Dog d = obj as Dog;
|
|
|
if ((object)d == null)
|
|
|
{
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
return base.Equals(obj) && age == d.age;
|
|
|
}
|
|
|
|
|
|
public int Age { get => age; set => age = value; }
|
|
|
}
|
|
|
```
|
|
|
|
|
|
* 같은 값을 가지는 short와 int에 Equals() 메서드를 사용하면 결과값이 어떻게 나오는가?
|
|
|
```c#
|
|
|
int a = 256;
|
|
|
short b = 256;
|
|
|
|
|
|
Console.WriteLine(a.Equals(b)); //True 출력.
|
|
|
Console.WriteLine(b.Equals(a)); //False 출력.
|
|
|
|
|
|
//내부적으로 as 연산자로 형변환을 하기 때문에
|
|
|
//형변환이 되는 short -> int는 형변환 후 값을 비교해서 값이 같기 때문에 true.
|
|
|
//형변환이 되지 않는 int -> short는 as 연산 후 null 값을 리턴하기 때문에 false.
|
|
|
```
|
|
|
|
|
|
* switch case 문에서 case에 문자열이 올 수 있는가?
|
|
|
가능하다. 결과는 다음과 같다.
|
|
|
```c#
|
|
|
class SwitchString
|
|
|
{
|
|
|
public static void Main()
|
|
|
{
|
|
|
string input = Console.ReadLine();
|
|
|
|
|
|
switch (input) //문자열도 가능
|
|
|
{
|
|
|
case "abc":
|
|
|
Console.WriteLine("abc가 입력되었습니다.");
|
|
|
break;
|
|
|
case "123":
|
|
|
Console.WriteLine("123이 입력되었습니다.");
|
|
|
break;
|
|
|
default:
|
|
|
Console.WriteLine("그 외 나머지가 입력되었습니다.");
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
```
|
|
|
|
|
|
* readonly와 const의 차이는?
|
|
|
|
... | ... | |