오늘은 C# 내용을 정리하는 시간을 가질까 합니다.
면접 대비 겸 자료를 찾다 보니 C# 개념들에 대해서도 자세하게 물어보더라고요.
몰랐던 내용뿐만 아니라 아는 내용도 확실히 짚고 넘어가고자 이렇게 정리해 봤습니다.
잘못된 부분이 있다면 댓글로 알려주시면 감사하겠습니다.
+ 정리를 위한 글이므로 내용은 언제나 수정/ 추가 될 수 있습니다.
C#이란?
마이크로소프트에서 만든 객체 지향 프로그래밍 언어로서
.Net 프레임워크(이하 .NetFramework로 통일)에서 컴파일된다.
-> .NetFramework : 마이크로소프트에서 개발한 프로그래밍 플랫폼
동작 순서
컴파일러로 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
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은 메타데이터를 사용하여 메모리를 할당 및 회수할 때
형식 안정성을 추가로 보장한다.
형식 시스템은 상속 원칙을 지원
-> 모든 클래스가 파생되는 .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 클래스에 대한 정의가 포함된 경우
해당 파일 내에서 여러 네임스페이스를 사용할 수 없다.
값 형식 ? 참조 형식 ?
값 형식(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}");
}
}
이스케이프 시퀸스
문자열 내 특수 문자를 포함기 위해 사용되는 특별한 문자 조합
백 슬래시 ( " \ " , 키보드에서 엔터키 위에 존재)를 통해 표시
단일 문자로 간주
주석
: 프로그램에서 실행되지 않는, 설명이나 메모
종류로는 단일행 주석과 다중행 주석이 있다.
// 단일행 주석
/*
다중행 주석
*/
아마 여기까지가 일반적으로 아는 주석이었을 겁니다.
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
'C# > 기초' 카테고리의 다른 글
C# - 개념 정리 6 / 예외 처리 ( try -catch , finally, Throw ,사용자 정의 예외 ), LINQ / 면접 대비 (1) | 2024.09.27 |
---|---|
C# 개념 정리 5 / 인터페이스, 열거형, 델리게이트, 이벤트, 람다, 제너릭, Func, Action, Predicate / 면접 대비 (1) | 2024.09.27 |
C# 개념 정리 4/ 상속, 다형성, out, ref / 면접 질문 대비 (0) | 2024.09.25 |
C# - 개념 정리 3 / 메서드, 구조체, 객체, 클래스, 프로퍼티 / 면접 질문 대비 (0) | 2024.09.24 |
C# - 개념 정리 2 / 변수, 코드 컨벤션 , 배열, 컬렉션, 박싱 & 언박싱 / 면접 질문 대비 (0) | 2024.09.23 |