C#/기초

C# - 개념 정리 1 / C# 정의 및 특징 , GC , Dispose, 네임 스페이스, 값 참조 형식, Nullable , 주석 / 면접 질문 대비

근본넘치는개발자 2024. 9. 20. 20:10

오늘은 C# 내용을 정리하는 시간을 가질까 합니다.

면접 대비 겸 자료를 찾다 보니 C# 개념들에 대해서도 자세하게 물어보더라고요.

몰랐던 내용뿐만 아니라 아는 내용도 확실히 짚고 넘어가고자 이렇게 정리해 봤습니다.

잘못된 부분이 있다면 댓글로 알려주시면 감사하겠습니다.

 

+ 정리를 위한 글이므로 내용은 언제나 수정/ 추가 될 수 있습니다.

 

C#이란?

마이크로소프트에서 만든 객체 지향 프로그래밍 언어로서

.Net 프레임워크(이하 .NetFramework로 통일)에서 컴파일된다.

 

-> .NetFramework : 마이크로소프트에서 개발한 프로그래밍 플랫폼

 

동작 순서

출처 : https://bitsorchestra.com/idea/net-core-vs-net-framework-an-in-depth-comparison

 

 

컴파일러로 Managed Code 컴파일 - > CIL -> CLR -> Machine Code 순으로 진행

 

Managed Code

-> .NET Platform 컴파일러가 생성하고,

CLR(Common Language Runtime) 에 의해 관리되는 코드

 

https://learn.microsoft.com/en-us/dotnet/standard/managed-code

 

CIL(Common Intermediate Language): 

-> .Net Framework에서 사용되는 중간 언어 생성

( exe, dll 파일 생성/ '닷넷어셈블리' 라고도 부른다)

 

※ 이때의 .NET으로 컴파일 된 EXE는

.Net Framework을 설치하지 않으면 돌아가지 않는다.

 

->  바이트 코드 형태로 구성

 

CLR(Common Language Runtime) :

-> .Net의 독립된 실행 환경

-> CLR환경 위에서 CIL을 번역, JIT(Just In Time) 컴파일을 통해

기계어(Machine code)로 변환하는 과정을 거친다.

 

이후 변환된 기계어는 OS환경 위로 올라가 실행된다.

 

 

+ 헷갈릴 만한 내용

CLI (Common Language Infrastructure):

-> .Net Framework의 기본 구조 

 

CLS(Common Language Specification)

-> .Net 컴파일러가 지원해야 하는 표준 규약. 

-> CLS를 따르는 언어라면 어떤 언어라도 .Net Framework에서 실행 가능 

-> 위 그림이 본 내용을 표현하고 있음 ( .net기반의 C#, F#, Visual basic code 예시)

 

UnManaged Code

-CLR 도움을 받지 않고 직접 운영체제에서 실행되는 코드

 

Native Code

-> 특정 하드웨어 및 운영 체제에서 직접 실행되도록 컴파일 된 코드

 

 

특징 

가비지 컬렉션(Garbage Collector / 줄여서 GC) 기능 제공

-> 동적 할당된 메모리를 자동 회수해 주는 기능 

-> 프로그래머가 직접 관리하지 않아도 된다는 장점

 

 

GC는 객체들에 세대를 매겨 관리

 

0 : 최근 생성, 가비지 컬렉팅을 아직 안 겪음

1 : 가비지 컬렉팅을 1번 겪었지만 해제되지 않은 객체

2 : 가비지 컬렉팅을 2번 겪었지만 해제되지 않은 객체

 

세대가 높아질 수록 중요한 객체로 판단하며,

0번을 집중적으로 처리한다.

 

크기에 따라서도 중요도(세대)가 달라진다.

 

SOH(Small Of Heap) : 85kb 이하 / 0세대 시작

LOH(Large Of Heap) : 85kb 이상 / 2세대 시작

 

 + Dispose 메서드

객체가 사용한 리소스를 명시적으로 해제하기 위해 사용

IDisposable 인터페이스의 일부

 

아래 더보기는 Dipose 메서드 내용입니다.

 

제가 정리한 모든 개념 정리 글을 읽고 다시 본다면 충분히 이해하실 수 있을 겁니다. 

더보기

using System;
public class ResourceManager : IDisposable
{

    private bool disposed = false;
    private IntPtr nativeResource;

    // 생성자 (constructor)

    public ResourceManager()
    {
          Console.WriteLine("생성자: 객체가 생성되었습니다.");
          nativeResource = AllocateResource();
     }

    // 소멸자( destructor / Finalize)
    ~ResourceManager()
    {
        Console.WriteLine("소멸자: 가비지 컬렉터에 의해 호출되었습니다.");
        Dispose(false);
    }

    // Dispose 메서드
    public void Dispose()
   
   
     Console.WriteLine("Dispose: 명시적으로 호출되었습니다.");
         Dispose(true);
         GC.SuppressFinalize(this);
    }

    // 실제 리소스 해제 로직
    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)

            {
               
                 // 관리되는 리소스 정리

                 Console.WriteLine("관리되는 리소스 정리");
            }

             // 비관리 리소스 정리
             FreeResource(nativeResource);
             Console.WriteLine("비관리 리소스 정리");
              disposed = true;
        }

    }

    private IntPtr AllocateResource()
    {
        // 비관리 리소스 할당 시뮬레이션
        return new IntPtr(1);
    }

    private void FreeResource(IntPtr resource{
    // 비관리 리소스 해제 시뮬레이션
    }
}

class Program
{

    static void Main()
    {
        using (var resource = new ResourceManager())
        {
                Console.WriteLine("리소스 사용 중...");

        } // Dispose가 여기서 자동으로 호출됩니다.

        Console.WriteLine("프로그램 종료");
    }
}

 

GC를 최적화 하는 방법

1. String을 사용할때 + 연산을 자제한다. / StringBuilder 클래스를 활용한다.

 

2024.08.21 - [C#] - 2024 내일 배움캠프(Unity_6기) _ 사전캠프 7일차(08.21) : String 과 StringBuilder에 대해 알아보자

 

2. 리스트의 사이즈를 초기화하여 사용한다.

 

3. Using 키워드를 이용하자.

 

등 이 있다.

 

 

참고

https://chipmunk-plump-plump.tistory.com/339

 

C# GC의 이해 및 메모리 최적화

# GC (가비지 컬렉터 - Garbage Collector) 가비지 컬렉터는 Java나 C#에서 메모리를 자동으로 해제해주는 기능이다.(이하 GC) C#은 C/C++의 메모리 할당보다 빠르다. C/C++처럼 자유 메모리 블록을 검사할 필

chipmunk-plump-plump.tistory.com

https://kilius.tistory.com/entry/unity-CG-%EC%9E%91%EB%8F%99-%EC%9B%90%EB%A6%AC%EC%99%80-%EC%B5%9C%EC%A0%81%ED%99%94-%EA%B8%B0%EB%B2%95

 

unity CG 작동 원리와 최적화 기법

Unity의 GC(Garbage Collection)는 .NET 프레임워크에서 사용되는 가비지 컬렉터를 기반으로 동작합니다. C# 언어와 마찬가지로, Unity도 .NET 가비지 컬렉터를 사용하여 자동적으로 메모리를 관리합니다. Un

kilius.tistory.com

 

GC의 단점 

-> 객체가 필요없어지는 시점에도 메모리 해제 결정 비용(처리시간 과 메모리 소비)이 든다. 

 

 

형식 시스템 

->모든 변수 및 상수엔 값으로 계산되는 모든 식을 실행하는 형식이 있다.

ex) bool, int, float 등 

https://learn.microsoft.com/ko-kr/dotnet/csharp/fundamentals/types/

 

 

컴파일러는 형식 정보를 실행 파일에 메타데이터로 포함,

CLR은 메타데이터를 사용하여 메모리를 할당 및 회수할 때

형식 안정성을 추가로 보장한다.

 

 

출처 : https://learn.microsoft.com/ko-kr/dotnet/csharp/fundamentals/types/ CTS(공용 형식 시스템) 내용

 

형식 시스템은 상속 원칙을 지원

-> 모든 클래스가 파생되는 .net의 기본 클래스는 System.Object인 것을 확인 할 수 있다.

 

 

가장 일반적으로 사용되는 형식은 모두 System 네임스페이스에 구성되어 있으며,

형식이 포함된 네임스페이스는 형식이 값 형식인지 또는 참조 형식인지와 관련이 없다.

 

 

네임스페이스?

클래스 및 기타 네임스페이스의 컨테이너

클래스 이름에 선택한 접두사 ( . 연산자 사용) 를 사용하여 참조.

 

파일 앞머리에 using을 덧붙여

네임스페이스 접두사를 반복적으로 입력하는 것을 방지할 수 있다.

 

+ Using문은 리소스를 처리한 후 실행 완료되면 자동으로 폐기된다. 

 

 

https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/types/namespaces

https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/namespace

 

ex) 

using System;


Console.WriteLine("Hello World!"); //System.Console.WriteLine()에서 System 생략

 

 

더보기

+

Unity에는 네임스페이스 및 MonoBehaviour 또는 ScriptableObject 클래스와 관련된 특정 제한 사항이 있다.

파일에 MonoBehaviour 또는 ScriptableObject 클래스에 대한 정의가 포함된 경우

해당 파일 내에서 여러 네임스페이스를 사용할 수 없다.

https://docs.unity3d.com/kr/2022.3/Manual/Namespaces.html

 

값 형식 ? 참조 형식 ?

값 형식(call by value) :

자체 메모리 공간(스택 Stack 메모리)에 데이터값 보유 

 

참조 형식(call by ref) :

값이 저장되는 개체의 주소 저장

다른 메모리 위치에 대한 포인터 (힙 Heap 메모리 저장)

 

더보기

값 형식 종류 :

c# 기본 타입, 구조체, enum

 

참조 형식 종류 

string, class, 배열, interface, delegate

 

※ 유니티에서 Vector 타입은 구조체

 

 // 값 형식 예시
int a = 1;
Console.WriteLine(a)// a값 1 출력


//참조 형식 예시
int arr[] = {10, 20, 30, 40, 50}
int arr2[] = arr;  // arr2가 arr과 같은 배열 참조
Console.WriteLine(arr2[1]) // arr의 1번 인덱스에 위치한 20 출력
arr2[1] = 60;
Console.WriteLine(arr[1]) // 60 출력

 

+알면 좋을 Nullable 형

참조형 변수가 어떠한 객체를 참조하지 않을 때 사용

(데이터베이스 작업, 사용자 입력 처리 등에서 값의 부재를 나타낼때 유용)

 

값형은 null을 허용하지 않는다.

? 연산자를 사용하여 선언

 

HasValue 속성: 값이 있는지 확인.

Value 속성: 실제 값에 접근. 값이 null일 경우 예외가 발생

 

 

 

null 조건부 연산자 (?.)  : 간단하게 null 체크 가능

null 병합 연산자 ( ?? ) : null일 경우 기본값 지정 가능

 

Nullable 타입도 박싱과 언박싱이 가능

using System;

class NullableExample
{
    static void Main()
    {
        // 기본 값 타입은 null을 가질 수 없음
        // int nonNullable = null; // 컴파일 에러

        // Nullable 타입 선언
        int? nullableInt = null;
        double? nullableDouble = 3.14;
        bool? nullableBool = null;

        // Nullable 타입 사용
        Console.WriteLine($"nullableInt has a value? {nullableInt.HasValue}");
        Console.WriteLine($"nullableDouble value: {nullableDouble.Value}");

        // null 조건부 연산자 (?.) 사용
        int? length = nullableInt?.ToString().Length;
        Console.WriteLine($"Length of nullableInt: {length}");

        // null 병합 연산자 (??) 사용
        int result = nullableInt ?? -1;
        Console.WriteLine($"Result: {result}");

        // Nullable 타입과 일반 타입 비교
        int? a = 5;
        int b = 5;
        Console.WriteLine($"a == b: {a == b}");

        // Nullable 타입 박싱 및 언박싱
        object boxed = nullableInt;
        int? unboxed = (int?)boxed;

        // Nullable 값 타입 패턴 매칭 (C# 7.0 이상)
        if (nullableDouble is double value)
        {
            Console.WriteLine($"nullableDouble has a value: {value}");
        }

        // Nullable 참조 타입 (C# 8.0 이상)
        string? nullableString = null;
        Console.WriteLine($"Length of nullableString: {nullableString?.Length}");
    }
}

 

 

이스케이프 시퀸스

문자열 내 특수 문자를 포함기 위해 사용되는 특별한 문자 조합

백 슬래시 ( " \ " , 키보드에서 엔터키 위에 존재)를 통해 표시

단일 문자로 간주

 

출처 : https://learn.microsoft.com/ko-kr/cpp/c-language/escape-sequences?view=msvc-170

 

 

주석

: 프로그램에서 실행되지 않는, 설명이나 메모

 

종류로는 단일행  주석다중행 주석이 있다. 

// 단일행 주석

/*
다중행 주석
*/

 

 

아마 여기까지가 일반적으로 아는 주석이었을 겁니다. 

C#에서는 추가로 XML 주석이라는 걸 사용하기도 합니다.

 

 

 

https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/xmldoc/recommended-tags

 

 

 

C# - 개념 정리2로 이어집니다.

 

2024.09.23 - [분류 전체보기] - C# - 개념 정리 2 / 변수, 배열, 컬렉션, 박싱 & 언박싱 / 면접 질문 대비

 

 

참고하면 좋을 자료 

https://www.guru99.com/ko/c-sharp-interview-questions.html

 

상위 50개 C# 인터뷰 질문 및 답변(2024)

신입생 및 경력자를 위한 C# 인터뷰 질문: 다음은 신입생 및 2/3/5/10년 경력 전문가를 위한 기본부터 고급 C# 인터뷰 질문과 답변 목록입니다.

www.guru99.com

https://shypang.tistory.com/16

 

C# 해외 면접시 TOP50

가장 인기있는 C # 인터뷰 질문 및 답변기본 개념에 대한 질문Q # 1) 객체와 클래스 란 무엇입니까?Ans : 클래스는 실시간 엔터티를 나타내는 데 사용되는 속성 및 메서드의 캡슐화입니다. 모든 인

shypang.tistory.com

https://youtu.be/rZcrIFB0yiE?si=tYpHAycyuGWoMPVX