프로그래밍/C#

[C#] 기본 - C++과 C# 의 다른 점

QA Engineer - P군 2016. 4. 5. 19:11
반응형

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= { 12345 };
int array3[] = { 12345 };
int* array4 = new int[4];
cs

 

[C#]

 

1
2
3
4
int[] array1 = new int[5] { 12345 }; 
int[] array2 = new int[5];
int[] array3 = new[] { 12345 }; 
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 1Console.WriteLine("숫자는 1입니다.");
   case 2Console.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

 

반응형