다음을 통해 공유


C++ 개발자를 위한 C#

업데이트: 2007년 11월

다음 표에는 /clr을 사용하지 않는 네이티브 C++와 C# 사이의 중요한 차이점에 대한 비교 설명이 나와 있습니다. C++ 프로그래머의 경우 이 표를 통해 두 언어 사이의 중요한 차이점을 알 수 있습니다.

참고:

C++ 프로젝트와 C# 프로젝트는 서로 다른 프로젝트 모델에서 파생됩니다. C++ 프로젝트와 C# 프로젝트 간의 차이점에 대한 자세한 내용은 프로젝트의 항목 관리솔루션 탐색기 사용을 참조하십시오.

기능

참조할 항목

상속: C++의 경우 클래스와 구조체는 사실상 동일한 반면, C#의 경우 이 둘은 전혀 다릅니다. C# 클래스에서는 인터페이스를 여러 개 구현할 수 있지만 단일 기본 클래스에서만 상속할 수 있습니다. 또한 C# 구조체는 상속을 지원하지 않으며 명시적 기본 생성자를 지원하지 않습니다. 생성자 하나가 기본적으로 제공됩니다.

class

interface

struct(C# 참조)

배열: C++의 경우 배열은 단순한 포인터입니다. C#의 경우 배열은 메서드와 속성을 포함하는 개체입니다. 예를 들어, Length 속성을 통해 배열의 크기를 쿼리할 수 있습니다. C# 배열에는 배열에 액세스하는 데 사용되는 각 인덱스를 확인하는 인덱서도 사용할 수 있습니다. C# 배열을 선언하는 구문은 C++ 배열을 선언하는 구문과 다릅니다. C#에서 "[]" 토큰은 변수가 아닌 배열 형식 뒤에 사용됩니다.

배열(C# 프로그래밍 가이드)

인덱서(C# 프로그래밍 가이드)

부울: C++의 경우 bool 형식은 근본적으로 정수입니다. C#에서는 bool 형식과 다른 형식 간의 변환이 없습니다.

bool

long 형식: C++에서는 long 형식이 32비트인 반면 C#에서는 64비트입니다.

long

매개 변수 전달: C++의 경우 포인터나 참조를 사용하여 명시적으로 전달되지 않는 모든 변수는 값으로 전달됩니다. C#의 경우 ref 또는 out 매개 변수 한정자를 사용하여 참조로 명시적으로 전달되지 않는 클래스와 구조체는 각각 참조와 값으로 전달됩니다.

struct

class

ref(C# 참조)

out(C# 참조)

switch 문: C++ switch 문과 달리 C#에서는 case 레이블에 대해 순차 조건 검사를 지원하지 않습니다.

switch

대리자: C# 대리자는 C++의 함수 포인터와 비슷하지만 형식 안전성과 보안성을 제공한다는 점이 다릅니다.

delegate

기본 클래스 메서드: C#은 파생 클래스에서 재정의된 기본 클래스 멤버를 호출하기 위한 base 키워드를 지원합니다. 또한 C#에서는 override 키워드를 사용하여 가상 또는 추상 메서드를 명시적으로 재정의할 수 있습니다.

base

override 예제 참조

메서드 숨기기: C++는 상속을 통한 메서드의 암시적 "숨김"을 지원합니다. C#의 경우 상속된 멤버는 new 한정자를 사용하여 명시적으로 숨겨야 합니다.

new

조건부 컴파일에 전처리기 지시문을 사용합니다. C#에서는 헤더 파일을 사용하지 않습니다.

C# 전처리기 지시문

예외 처리: C#에서는 예외가 throw되었는지 여부와 상관없이 실행해야 할 코드를 제공하기 위한 finally 키워드를 제공합니다.

try-finally

try-catch-finally

C# 연산자: C#은 is 및 typeof 같은 연산자를 추가로 지원합니다. 또한 일부 논리 연산자의 다양한 기능이 도입되었습니다.

& 연산자

| 연산자

^ 연산자

is

typeof

typedef 키워드입니다. C++에서 typedef는 짧게 만들어지거나 이미 선언된 형식에서 좀 더 편리한 이름으로 사용됩니다. C#의 경우 using 지시문이 이 기능을 제공합니다.

using 지시문(C# 참조)

extern 키워드: C++의 경우 extern은 형식을 가져오는 데 사용됩니다. C#의 경우 extern은 동일한 어셈블리의 다른 버전을 사용하기 위해 별칭을 만드는 데 사용됩니다.

extern

static 키워드: C++의 경우 static은 모듈별 형식을 선언하거나 클래스 수준 엔터티를 선언하는 데 모두 사용할 수 있습니다. C#의 경우 static은 클래스 수준 엔터티를 선언하는 데만 사용할 수 있습니다.

static

C#의 Main 메서드는 C++의 main 함수와 다르게 선언됩니다. C#의 경우 이 메서드는 대문자로 시작하고 항상 static입니다. 또한 C#에서는 명령줄 인수에 대한 처리 지원 기능이 훨씬 더 강력해졌습니다.

Main()과 명령줄 인수(C# 프로그래밍 가이드)

C#에서 포인터를 사용할 수 있지만 이는 unsafe 모드에서만 가능합니다.

unsafe

C#에서는 연산자 오버로드가 다르게 수행됩니다.

C# 연산자

문자열: C++의 경우 문자열은 문자의 배열에 불과합니다. C#의 경우 문자열은 강력한 검색 방법을 지원하는 개체입니다.

string

String

foreach 키워드를 사용하여 배열 및 컬렉션을 반복 처리할 수 있습니다.

foreach, in

전역: C#의 경우 전역 메서드와 변수는 지원되지 않습니다. 메서드와 변수는 class 또는 struct 안에 포함되어야 합니다.

C# 프로그램의 일반적인 구조

#define 전처리 지시문입니다. C++의 경우 #define 지시문은 대개 상수 값을 선언하는 데 사용됩니다. C#의 경우 #define 지시문은 이 용도로 사용할 수 없습니다. C#의 상수는 정수 값만 해당되는 열거 형식 또는 클래스나 구조체의 정적 멤버로 정의하는 것이 좋습니다. 이러한 상수가 여러 개 있는 경우 별도의 "Constants" 클래스를 만들어 저장하는 것이 좋습니다.

static(C# 참조)

const(C# 참조)

enum(C# 참조)

형식 가져오기: C++의 경우 여러 모듈에 공통적인 형식은 헤더 파일에 배치됩니다. C#의 경우 이 정보는 메타데이터를 통해 얻을 수 있습니다.

using

메타데이터 개요

C#의 지역 변수는 초기화하지 않으면 사용할 수 없습니다.

메서드(C# 프로그래밍 가이드)

메모리 관리: C++는 가비지 수집 언어가 아니므로, 명시적으로 해제하지 않은 메모리는 프로세스를 종료할 때까지 할당된 상태를 유지합니다. C#은 가비지 수집 언어입니다.

가비지 수집

소멸자: C#에서는 관리되지 않는 리소스를 명확하게 해제하기 위해 다른 구문을 사용합니다.

소멸자

using 문(C# 참조)

생성자: C++와 마찬가지로 C#에서는 클래스 생성자를 제공하지 않으면 기본 생성자가 자동으로 생성됩니다. 기본 생성자는 모든 필드를 기본값으로 초기화합니다.

인스턴스 생성자

기본값 표

C#은 비트 필드를 지원하지 않습니다.

C++ 비트 필드

C# 입출력 서비스 및 형식 지정은 .NET Framework의 런타임 라이브러리에 따라 수행됩니다.

C# 언어 자습서

숫자 결과 형식 지정 표

C#에서는 메서드 매개 변수가 기본값을 가질 수 없습니다. 동일한 효과를 얻고 싶다면 메서드 오버로드를 사용합니다.

컴파일러 오류 CS0241

C#의 경우 C++ 템플릿과 비슷한 방식으로 형식 매개 변수화를 위한 제네릭 형식 및 메서드를 제공하지만 여기에는 중요한 차이점이 있습니다. 예를 들어 C# 제네릭 형식 정보는 런타임에 유지됩니다.

C#의 제네릭

as 키워드는 표준 캐스트와 비슷하지만, 변환에 실패한 경우 예외를 throw하는 대신 null 값을 반환한다는 점에서 차이가 있습니다. 이는 C++에서 static_cast를 사용하는 것과 비슷합니다. 이 경우 dynamic_cast와 달리 런타임 검사를 수행하지 않으므로 작업에 실패해도 예외가 throw되지 않습니다.

as(C# 참조)

C# 및 기타 프로그래밍 언어의 키워드에 대한 자세한 비교는 언어 관련 정보를 참조하십시오. C# 응용 프로그램의 일반적인 구조에 대한 자세한 내용은 C# 프로그램의 일반적인 구조(C# 프로그래밍 가이드)를 참조하십시오.

참고 항목

개념

C# 프로그래밍 가이드

프로젝트의 항목 관리

솔루션 탐색기 사용