cyphen156

C# 기초2 C/C++와 다른점 본문

프로그래밍/C#

C# 기초2 C/C++와 다른점

cyphen156 2023. 11. 28. 14:48

C#또한 어쨋든 C/C++를 객체지향으로 체계한 것이기 때문에 자료형이나 문법적인 체계와 같이 큰 틀에서는 다른게 없다. 

C#이 C/C++와 가장 큰 차이점은 자바의 JVM에 해당하는 .NET이라는 가상환경 속에서 프로그램이 실행된다는 점, 이 가상환경에서는 메모리를 프로그래머 대신 관리해주는 GC(Garbage Collector)의 존재이다.

 

문법적인 차이(C++ -> C#)

클래스 인스턴스에서 포인터사용 제거(Object->data) -> new/delete를 통한 인스턴스 관리, 포인터 대신 참조 사용

요소만큼 반복하기

for(item : arr) -> for(int item in arr)

Array 클래스

int arr[5] = {1, 2, 3, 4, 5};

// 배열의 길이 .Length
arr.Length; // 5

// 배열의 요소에 해당하는 인덱스
Array.IndexOf(arr, 3); // == arr[3] = 2

컬렉션(Collection)

C에서는 직접 구현해야 했엇던 여러가지 자료 구조들을 미리 구현해놓은 네임스페이스

C++에서는 STL을 통해 제공되었지만 C#에서는 System.Collections라는 네임스페이스를 사용한다.

제공되는 자료구조ArrayList, Queue, Stack, Hashtable 등이 있다.

컬렉션에는 여러가지 자료 구조(정수, 실수, 문자, 문자열, 인스턴스)를 하나의 객체 인스턴스에 담을 수 있으며, JavaScript의 Object와 유사하게 사용할 수 있다.

ArrayList 컬렉션 사용예시

아래 예시 중 foreach반복을 사용하여 요소를 탐색했는데 item의 자료가 Var인 이유는 매 순회마다 다른 자료형이 올 수 있다는것을 미리 인지시키고, 요소 탐색마다 자료형을 변경할 수 있도록 해준 것이다. 그렇기 때문에 컬렉션 요소를 탐색할 때에는 let, int, char와 같은 특정 고정 자료형을 사용하면 안된다. (동적타이핑에 대한 이야기)

using System;
using System.Collections;

namespace MyApp
{
    internal class Program
    {

        static void Main(string[] args)
        {
            ArrayList arrayList = new ArrayList();
            ArrayList arrayList2 = new ArrayList();
            arrayList.Add(1);
            arrayList.Add('C');
            arrayList2.Add("Hello");
            arrayList.Add(arrayList2);

            Console.WriteLine("Hello World!");

            foreach (var item in arrayList)
            {
                int index = arrayList.IndexOf(item);
                Console.WriteLine($"Item: {item}, Type: {item.GetType()}, Index: {index}");
            }
        }
    }
}

만약 고정 자료형을 사용하고 싶다면 컬렉션 타입을 Generic으로 지정하면 된다.

using System;
using System.Collections.Generic; // 제네릭 컬렉션을 위한 네임스페이스

namespace MyApp
{
    internal class Program
    {
        static void Main(string[] args)
        {
            List<object> list = new List<object>();
            List<object> list2 = new List<object>();
            list.Add(1);
            list.Add('C');
            list2.Add("Hello");
            list.Add(list2); // list2를 list에 추가

            Console.WriteLine("Hello World!");

            foreach (var item in list)
            {
                int index = list.IndexOf(item);
                Console.WriteLine($"Item: {item}, Type: {item.GetType()}, Index: {index}");
            }
        }
    }
}

뭐가 달라진건가 싶을 수 있는데 자세히 보면 사용 자료형이 ArrayList에서 List로, 변수 타입이 object로 고정되어있다, 그렇기 대문에 List2의 타입은 ArrayList가 아닌 Object로 출력된다.

두번째 방식은 TypeScript의 등장 배경에 대한 이유를 설명해준다. 동적 타이핑은 간결하지만 컴파일시 자료형이 명확하지 않아 매 번 자료를 조회할 때마다 타입을 추론해야 하고, 이것은 프로그램 실행의 오버헤드를 높여 런타임을 길게만든다.

또한 동적 타이핑을 사용하면  자료형이 변하는 위험성이 존재하기 때문에 제네릭을 사용한다면 이를 방지할 수 있다.

예외처리

  • 리소스 관리: C++에서는 소멸자와 RAII[각주:1] 패턴을 사용하여 자원을 관리하는 반면, C#에서는 finally 블록과 using(어느정도 RAII패턴을 대체한다.) 문을 사용하여 리소스를 관리한다.
  • 예외 타입: C++에서는 모든 유형의 객체를 예외로 던질 수 있지만, C#에서는 Exception 클래스를 상속받는 타입만 예외로 사용할 수 있다.
using System;
using System.IO;

class Program {
    static void Main() {
        try {
            using (var stream = new FileStream("file.txt", FileMode.Open)) {
                // 파일 읽기/쓰기 작업
            } // FileStream의 Dispose 메서드가 자동으로 호출됨
        } catch (Exception ex) {
            Console.WriteLine("An error occurred: " + ex.Message);
        } finally {
            // 필요한 추가 정리 작업
        }
    }
}

여러모로 C#은 스크립팅과 문법적 간소화를 통해 프로그래머의 생산성 향상을 위해 다른 언어들(Java, JavaScript, Python 등)과 유사한 점이 매우 많다. 다만 다른 점은 WebAssembly를 통해 컴파일 되는것이 보장된 언어라는 점이었으나 최근의 파이썬또한 인터프리팅 방식에서 컴파일 방식을 지원하고 있기 때문에 더더욱 유사해지고 언어간의 경계가 서서히 사라지고 있다고 본다.  

추가로 알고 싶은 내용들은 MSDN(Microsoft Developer Network)에서 찾으시길 바랍니다.

Microsoft Learn: 커리어의 문을 여는 기술 구축

 

Microsoft Learn: 커리어의 문을 여는 기술 구축

설명서 및 교육을 통해 기술을 습득하고, 인증을 획득하고, 커뮤니티와 연결하세요.

learn.microsoft.com

 

 

 

 

 

  1. Resource Acquisition Is Initialization : 메모리 누수를 방지하기 위해 인스턴스 초기화 실패, 코드 실행 실패 등 예외 상황이 발생했을 때 해당 코드블럭에서 할당했던 메모리를 다시 할당 해제하는 소멸자를 호출하는 패턴 [본문으로]

'프로그래밍 > C#' 카테고리의 다른 글

C# 버전별 핵심 기능 (1.0 ~ 7.0)  (0) 2023.12.01
C# 실습 1 .NET 8 Winforms 앱 만들기  (0) 2023.11.30
C#에서 클래스와 namespace(C++와 다른점 2)  (0) 2023.11.29
C# 기초1  (0) 2023.11.28