C# .NET에 대한 이해

김찬수·2023년 2월 14일
0

.NET

  • C#은 하나의 코드로 여러 플랫폼에 대한 프로그램을 제작할 수 있음
  • pc, 모바일, 플스 등등의 플랫폼에 동시에 출시할 때 예전에는 pc버전, 모바일버전, 플스버전 등등 따로따로 만들어줘야 했음 (여러 플랫폼에 지원하려면 그 만큼 여러 코드가 필요)
  • JAVA라는 언어를 만들어냄 : 단 하나의 코드로 여러 플랫폼을 대응할 수 있게 만듦
  • C언어나 C++언어는 모두 하나의 코드로 하나의 플랫폼만 대응할 수 있음
  • C#은 JAVA를 본따서 만든 언어로 C++와 JAVA의 특징을 적절히 섞어서 만듦

.NET 아키텍처

  • 하나의 프로그램(C#)을 만들고 그 프로그램을 중간단계에서 돌아가는 프로그램(.NET)이 각각의 플랫폼에 연결시켜줌
  • 플랫폼 위에서 바로 구동되는 언어 = 네이티브 언어
  • C#은 중간에 계층이 하나 더 있으므로 .NET을 거쳐야해서 본질적으로 느리고, 메모리도 많이 먹음
  • 반대로 C++같은 경우는 중간단계를 거치지 않고 플랫폼과 바로 연결되기에 매우 빠름
  • 중간단계 : .NET 아키텍처 (미들웨어)
  • .NET은 공용 언어 인프라 사양에 맞춰 MS가 구현한 프로그램인 공용 언어 런타임과 클래스 라이브러리 세트. C#은 .NET위에서 동작하는 프로그래밍 언어중에 하나
  • .NET은 크게 2가지로 이루어져 있음 (공용 언어 런타임 = 컴파일러 + 라이브러리)
  • .NET은 다양한 응용프로그램을 만드는 개발자 플랫폼
  • 그 외에 F#, Visual Basic이 있음

빌드

  • C# 프로젝트를 빌드할 때, C# 코드는 CLI(공용 언어 인프라) 사양을 준수하는 중간 언어로 컴파일
  • 이런 IL코드(중간언어)와 프로그램에 사용되는 리소스가 함께 패키징 되어 어셈블리가 됨
  • 어셈블리는 서로 함께 사용되어 논리적 기능 단위를 형성하도록 빌드되는 타입 및 리소스의 컬렉션을 의미
  • 어셈블리는 실행파일(.exe) 또는 동적 연결 라이브러리(.dll)의 형태
  • 어셈블리는 .NET 애플리케이션에 대한 배포, 버전 제어, 재사용, 활성화 범위 및 보안 권한의 기본 단위를 형성
  • C# 프로그램을 실행하면 어셈블리가 CLR에 로드 되는데, CLR은 IL 코드를 플랫폼에 따라 JIT 컴파일 혹은 AOT 컴파일을 수행하여 네이티브 명령어로 변환

중간 언어 : 닷넷 프레임워크에서 인간이 이해할 수 있는 가장 낮은 수준의 프로그래밍 언어 (고급 언어보단 저급 언어에 가까움)
어셈블리 : 빌드된 결과물. 어셈블리 != 어셈블리언어
JIT : 인터프리터 방식. 프로그램 실행중에 코드를 보고 그때그때 이진수로 바꾸는 방법
AOT : 코드를 전부 다 읽어서 이진수로 바꾸는 방법 (프로그램 실행 전 미리 컴파일)

공용 타입 시스템

  • 여러 .NET 언어를 지원하기 위해 공용 타입 시스템을 지원
  • 공용 타입 시스템은 다같이 사용
  • .NET의 모든 형식은 값 타입 혹은 참조 타입으로 구분되며 모든 타입은 기본 타입인 System.Object에서 파생
  • System.Object에서 모든 타입이 출발
  • .NET 위에 3가지의 언어가 있음

값 타입

  • C#에서 값 타입은 구조체 / 열거형 / 그 외의 기본 제공 타입으로 구성
  • 구조체를 제외한 모든 타입은 System.ValueType에서 파생
  • 스택 메모리에 직접 값이 포함 (복사가 일어남)
  • 상속이 불가능
  • 구조체 멤버 중에 참조 타입이 있다면 메모리 주소가 복사됨

그 외의 기본 제공 타입 : int, float, short, double, bool, char 등등
여기서의 복사는 얕은 복사라고 하는데, 반대는 깊은 복사

참조 타입

  • C#에서 참조 타입은 클래스 / 대리자 / 배열 / 인터페이스
  • 힙 메모리에 인스턴스가 할당됨
  • 참조 타입의 변수는 인스턴스의 주소에 대한 참조를 가짐
  • 배열은 참조 타입
  • 널(Null)을 할당할 수 있음
  • 참조 타입에는 널을 할당할 수 있기 때문에 string의 기본값이 null;

인스턴스 : 일반적으로 실행 중인 임의의 프로세스, 클래스의 현재 생성된 오브젝트

박싱와 언박싱

  • 박싱과 언박싱은 병목지점이 되는 부분이기 때문에 성능이 줄어듦(즉, 언박싱과 박싱이 일어나지 않게 코드를 작성하도록 해야 함)
  • 메모리를 복사해서 가져오는것 자체가 매우 큰 작업. 스택과 힙은 실제로 멀리 떨어져 있음
  • 참조 타입 = 힙
  • 값 타입 = 스택

박싱

  • 값 타입을 object 타입 또는 값 타입에서 구현된 임의의 인터페이스 타입으로 변환하는 프로세스
  • object 타입의 새로운 인스턴스(데이터)를 생성해 값을 힙으로 복사
  • 값 타입을 참조 타입으로 바꿔주는 것 (스택에 있는 데이터를 힙 메모리로 옮김)
  • 암시적으로 이루어짐 (안 보임)

언박싱

  • 참조 타입을 값 타입으로 변환하는 것이 모두 언박싱은 아님
  • 박싱된 메모리의 데이터를 다시 스택으로 가져오는 것만 언박싱
  • 힙에서 스택으로 값이 복사됨
  • 명시적으로 이루어짐 (보임)
profile
프로그래머 지망생

0개의 댓글

관련 채용 정보