개발 일지/C#

C++과 C#의 차이점과 기본 문법

DDD Developer 2024. 10. 27. 23:12
728x90
반응형

 

 

C++과 C#은 둘 다 C 언어에서 파생된 프로그래밍 언어로, 공통점이 많지만 차이점도 분명히 존재한다. C++은 주로 시스템 프로그래밍, 게임 개발, 임베디드 시스템 등 고성능이 필요한 분야에서 많이 쓰이는 반면, C#은 주로 Windows 애플리케이션 개발과 웹 애플리케이션, 게임 개발(특히 Unity 엔진)에서 많이 사용된다.

 

먼저, 메모리 관리 측면에서 C++은 개발자가 메모리 할당과 해제를 직접 관리해야 한다. 이는 new와 delete 키워드를 사용해 동적으로 메모리를 할당하고 해제할 수 있으며, 잘못된 메모리 관리는 메모리 누수나 오류를 일으킬 수 있다. 반면, C#은 **가비지 컬렉터(Garbage Collector)**를 통해 메모리 관리를 자동으로 처리해 준다. 개발자가 메모리 관리를 일일이 신경 쓰지 않아도 되므로, 메모리 누수 발생 확률이 적다.

 

언어의 컴파일 방식도 다르다. C++은 컴파일된 코드가 기계어로 변환되어 실행되기 때문에 네이티브 코드로 실행된다. 이는 성능이 빠르지만, 플랫폼 간의 호환성이 떨어진다. 반면, C#은 **CLR(Common Language Runtime)**이라는 가상 머신 위에서 동작하는 **중간 언어(Intermediate Language, IL)**로 변환된 후, JIT(Just-In-Time) 컴파일러를 통해 실행된다. 따라서 C#은 .NET 프레임워크가 설치된 환경에서 다양한 플랫폼에서 실행될 수 있다. 최근에는 .NET Core를 통해 크로스 플랫폼 지원이 더욱 강화되었다.

 

포인터 사용의 차이도 두드러진다. C++은 포인터를 자유롭게 사용할 수 있지만, 이는 자칫 잘못 사용할 경우 프로그램의 안전성을 위협할 수 있다. 포인터 연산을 통해 메모리의 특정 위치를 직접 참조하거나 조작할 수 있기 때문이다. 반면, C#에서는 포인터 사용이 제한적이다. 기본적으로 포인터를 사용할 수 없고, unsafe 키워드를 사용해야만 제한된 범위 내에서만 허용된다.

 

객체 지향 프로그래밍(OOP) 지원 방식에서도 차이가 있다. C++은 다중 상속을 지원하여 하나의 클래스가 여러 개의 클래스로부터 상속을 받을 수 있다. 그러나 다중 상속은 복잡성과 오류를 유발할 수 있어 조심스럽게 사용해야 한다. 반면, C#은 기본적으로 다중 상속을 지원하지 않고 인터페이스를 통해 다중 구현을 대신한다. 인터페이스는 클래스가 특정 메서드 집합을 구현하도록 강제할 수 있어, 다중 상속으로 인해 발생할 수 있는 모호성을 피하는 장점이 있다.

 

언어의 문법과 라이브러리 구성도 차이가 있다. C++은 표준 라이브러리(STL, Standard Template Library)가 있어 컨테이너, 알고리즘 등을 제공하며, 효율적이고 빠른 성능을 낼 수 있도록 설계되었다. 반면, C#은 .NET 라이브러리를 기반으로 하며, 풍부한 내장 라이브러리와 프레임워크가 있어 데이터베이스 연결, 네트워킹, XML 처리 등 다양한 작업을 쉽게 처리할 수 있다. 또한, C#은 LINQ(Language-Integrated Query) 기능을 제공하여 데이터베이스 쿼리와 같은 기능을 언어 차원에서 지원한다.

 

마지막으로, 멀티스레딩 지원 방식도 차이가 있다. C++에서는 스레드 생성과 관리가 OS에 의존적이며, 표준 스레드 라이브러리도 있지만 세부 조정은 개발자가 직접 해야 하는 부분이 많다. 반면, C#은 .NET의 **Task Parallel Library(TPL)**과 같은 강력한 멀티스레딩 라이브러리를 제공하며, 비동기 프로그래밍을 위해 async와 await 키워드를 지원하여 비동기 코드 작성을 훨씬 쉽게 한다.

 

정리하자면, C++은 고성능과 메모리 관리를 중시하는 개발 환경에 적합하며, C#은 .NET 환경에서 안전하고 생산적인 애플리케이션 개발에 적합하다.

 

 

변수 선언과 데이터 타입

int age = 25; // 정수형 변수 선언
double height = 1.75; // 실수형 변수 선언
string name = "성민"; // 문자열 변수 선언
bool isStudent = true; // 불리언 변수 선언
 

C#에서는 변수의 타입을 명시적으로 지정해야 하며, 타입에 맞는 값을 할당해야 한다. var 키워드를 사용해 자동 타입 추론도 가능하다.

 

조건문

if (age >= 20)
{
Console.WriteLine("성인이다.");
}
else
{
Console.WriteLine("미성년자이다.");
}
 

if, else if, else를 사용해 조건문을 구성할 수 있다. age >= 20과 같은 조건을 통해 true 또는 false를 반환하며, 그에 따라 다른 코드가 실행된다.

 

반복문

 

for 문:

for (int i = 0; i < 5; i++)
{
Console.WriteLine("반복 중: " + i);
}
 

for 문은 초기화, 조건식, 증감식을 설정해 반복적으로 코드를 실행한다.

 

while 문:

int count = 0;
while (count < 5)
{
Console.WriteLine("반복 중: " + count);
count++;
}
 

while 문은 조건이 true인 동안 계속해서 반복한다.

 

메서드 정의

public void SayHello()
{
Console.WriteLine("안녕하세요!");
}

public int Add(int a, int b)
{
return a + b;
}
 

void는 반환값이 없을 때 사용하고, int, string 등 원하는 타입을 지정하면 그 타입의 값을 반환할 수 있다. 매개변수를 통해 값을 전달받고, return 키워드로 값을 반환한다.

 

클래스와 객체 생성

public class Person
{
public string Name { get; set; }
public int Age { get; set; }

public void Introduce()
{
Console.WriteLine($"안녕하세요, 저는 {Name}이고, 나이는 {Age}살이다.");
}
}

// 객체 생성 및 사용
Person person = new Person();
person.Name = "성민";
person.Age = 25;
person.Introduce();
 

class 키워드를 사용해 클래스를 정의하고, 객체를 생성해 멤버 변수와 메서드를 사용할 수 있다. public으로 설정하면 클래스 외부에서도 접근 가능하다.

 

프로퍼티(Property)

public class Car
{
public string Model { get; set; } // 자동 구현 프로퍼티
private int _year;

public int Year
{
get { return _year; }
set
{
if (value > 2000)
_year = value;
}
}
}
 

프로퍼티는 클래스의 필드를 제어할 수 있는 방법으로, get과 set을 통해 값을 가져오거나 설정할 수 있다. Model처럼 자동 구현 프로퍼티로 간단히 사용할 수도 있고, Year처럼 커스텀 로직을 추가해 설정할 수도 있다.

 

배열과 리스트

 

배열:

int[] numbers = { 1, 2, 3, 4, 5 };
Console.WriteLine(numbers[0]); // 출력: 1
 

리스트(List):

List<string> fruits = new List<string>();
fruits.Add("사과");
fruits.Add("바나나");
Console.WriteLine(fruits[1]); // 출력: 바나나
 

배열은 고정된 크기를 가지며, 리스트는 크기를 동적으로 변경할 수 있어 유용하다. 리스트는 Add()를 통해 항목을 추가할 수 있다.

 

비동기 프로그래밍 (Async/Await)

public async Task GetDataAsync()
{
await Task.Delay(1000); // 1초 대기
Console.WriteLine("데이터 로딩 완료!");
}
// 호출
await GetDataAsync();
 

비동기 프로그래밍에서는 async 키워드를 메서드에 추가하고, await 키워드로 비동기 작업이 완료될 때까지 기다릴 수 있다. Task를 사용해 비동기 작업을 반환할 수 있으며, 이를 통해 UI 응답성을 유지할 수 있다.

 

이외에도 C#은 예외 처리, 이벤트 및 델리게이트, LINQ 등 다양한 고급 문법을 제공한다. C#의 문법은 다양한 애플리케이션 개발에서 직관적이면서도 강력하게 사용할 수 있도록 설계되어 있다.

 

728x90
반응형