반응형
C++과 C# 비교
출처 - [MSDN] https://msdn.microsoft.com/ko-kr/library/aa287549(v=vs.71).aspx
1. 클래스는 하나의 기본 클래스에서만 구현 상속을 할 수 있습니다.
[C++] - 한번에 여러개 가능
1
2
3
|
class A{};
class B{};
class C: public A , B { };
|
cs |
[C#] - 한번에 한개만 가능
1
2
3
4
|
class A { }
class B { }
class C : A , B { } // 잘못된 코드
// 에러! error CS1721: '' 클래스는 여러 개의 기본 클래스('A' 및 'B')를 가질 수 없습니다.
|
cs |
2. 배열의 선언 방식이 다릅니다.
[C++]
1
2
3
4
|
int array1[5];
int array2[5] = { 1, 2, 3, 4, 5 };
int array3[] = { 1, 2, 3, 4, 5 };
int* array4 = new int[4];
|
cs |
[C#]
1
2
3
4
|
int[] array1 = new int[5] { 1, 2, 3, 4, 5 };
int[] array2 = new int[5];
int[] array3 = new[] { 1, 2, 3, 4, 5 };
int[] array4 = {1,2,3,4,5};
|
cs |
3. bool 형식과 다른 형식 (특히 int)간에는 변환이 업습니다.
[C++]
1
2
3
4
5
|
bool isStart = false;
int number;
number = isStart; // 사용가능
isStart = number; // 사용가능
|
cs |
[C#]
1
2
3
4
5
|
bool isStart = false;
int number;
number = isStart; //에러!
isStart = number; // 에러!
|
cs |
4. C#에서 클래스 및 구조체는 구문적으로 다릅니다.
struct : 값 형식
class : 참조 형식
[C#]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
struct structA { public int number; }
class classA {public int number = 0;}
class Program
{
static void Main(string[] args)
{
structA structTest2 = new structA();
structTest2.number = 1; // 문제 없습니다.
structA structTest; //문제 없습니다.
structTest.number = 0;
classA classTest2 = new classA(); //문제 없습니다.
classTest2.number = 10;
classA classTest;
classTest.number = 0; //에러!
// error CS0165: 할당되지 않은 '' 지역 변수를 사용했습니다.
}
|
cs |
5. C++ switch 문과 달리 case 레이블에 대해 순차 조건 검사를 지원하지 않습니다.
[C++] - 한 스위치 섹션에서 다음 스위치 섹션으로 실행을 계속하는것을 허용
1
2
3
4
5
6
7
8
9
|
int number = 0;
switch (number)
{
case 0 : cout << "숫자는 0입니다." << endl;
case 1 : cout << "숫자는 1입니다." << endl;
default:
break;
}
|
cs |
[C#] - 한 스위치 섹션에서 다음 스위치 섹션으로 실행을 계속하는것을 허용하지 않음
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
int number = 10;
switch (number)
{
case 1: Console.WriteLine("숫자는 1입니다.");
case 2: Console.WriteLine("숫자는 2입니다."); // 에러!
// error CS0163: 한 case 레이블('case 2:')에서
//다른 case 레이블로 제어를 이동할 수 없습니다.
default:
break;
}
//수정 코드
int number = 10;
switch (number)
{
case 1:
Console.WriteLine("숫자는 1입니다.");
break; //이제 문제 없습니다.
case 2:
Console.WriteLine("숫자는 2입니다.");
break;
default:
break;
}
|
cs |
순차 조건 검사를 지원하지 않는다는것은 요구 사항에 따라 마지막 섹션을 포함한 스위치 섹션의 끝에
도달할 수 없어야 한다는걸 의미합니다.
그렇기 때문에 아래와 같은 조건문을 통해서 break 없이 switch 문을 사용 할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
|
int number = 1;
switch (number)
{
case 1:
while (true)
Console.WriteLine("hello!");
case 2:
break;
default:
break;
}
|
cs |
6. C#에서 new 키워드는 연산자, 한정자 또는 제약 조건으로 사용할 수 있습니다.
: 여기서는 한정자에 대해서만 알아봅니다.
[C#]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
public class A
{
public class numbers
{
public int number = 10;
}
}
public class Program : A
{
new public class numbers // new 한정자
{
public int number = 20;
}
static void Main(string[] args)
{
numbers testClass = new numbers();
A.numbers testClass2 = new A.numbers();
Console.WriteLine(testClass.number);
Console.WriteLine(testClass2.number);
}
}
// new를 사용하지 않아도 실행되나 아래와 같은 컴파일 경고 발생
// warning CS0108: 'Program.numbers'은(는) 상속된 'A.numbers' 멤버를 숨깁니다.
// 숨기려면 new 키워드를 사용하십시오.
|
cs |
1. 클래스는 하나의 기본 클래스에서만 구현 상속을 할 수 있습니다.
[C++]
[C#]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public class A
{
public virtual void print(string Msg)
{
Console.WriteLine(Msg);
}
}
public class B : A
{
public override void print(string Msg)
{
Console.WriteLine(Msg + " override 함수");
}
}
// override를 사용하지 않아도 실행되나 아래와 같은 컴파일 경고 발생
// warning CS0114: 'print(string)'은(는) 상속된 'A.print(string)' 멤버를 숨깁니다.
// 현재 멤버가 해당 구현을 재정의하도록 하려면 override 키워드를 추가하십시오.
// 그렇지 않으면 new 키워드를 추가하십시오.
|
cs |
반응형
'프로그래밍 > C#' 카테고리의 다른 글
[C#] 람다식 (lambda) - 1 (0) | 2016.09.25 |
---|---|
[C#] 값 형식 & 참조형식 (Value Type & Reference Type) (0) | 2016.09.25 |
[C#] 대리자 (Delegate) - 델리게이트 (0) | 2016.09.25 |
[C#] 박싱 & 언박싱 (Boxing & UnBoxing) (0) | 2016.09.25 |
[C#] 기본 - 네임 스페이스 , 메소드 (0) | 2016.04.05 |