시작하세요 C# 9.0 프로그래밍

2022. 7. 6. 15:14C#/C#에 대한 다양한 공부

1장 들어가면서

  1. 닷넷 프레임워크 : 마이크로소프트에서 발표한 응용 프로그램 개발 환경으로써 프로세스 가상 머신에 속한다.

가상 머신 CLR 프로세스가 실행되면 메모리에 함께 실행되고 이는 EXE/DLL(1)

내부적으로 존재한다.

IL(중간언어) 코드의 결과물을 공유하기 때문에 상호 호출이 가능하다.

  • CIL(Common Intermediate Language) : 공통 중간 언어로 속칭 'IL코드' 한다. '런타임' 이해할 있는 중간 언어
  • CLI(Common Language Infrastructure) : 공용 언어 기반구조로 MS 공개한 공개 규약이다.

CTS(공용 타입 시스템), CIL, 메타데이터등을 포함하고 있다.

  • CLR(Common Language Runime) : 공용 언어 런타임으로 CLI사양을 따르는 가장 대표적인 VM이다.

CIL 읽어 기계어로 변환하고 GC 제공한다.

 

2 개발 환경 준비

  1. 개발 환경 준비 (Visual Studio 설치)

 

3 C# 기초

  1. 기본 자료형
  2. 형변환
  3. 타입과 참조 타입
  1. 제어문

 

4 객체지향 문법

  1. 클래스 : 일종의 ()

하지만 GC 불확실한 시점에 메모리를 정리한다.

  • 소멸자가 굳이 필요하지 않는 상황에서 사용한다면 오히려 프로그램의 성능 저하를 유발한다.
  • 정적 생성자 : 정적 맴버를 초기화할 있다. 기본생성자에 static 붙인 경우로 클래스에 한개만 존재할 있다.
    클래스의 어떤 맴버든 최초로 접근하는 시점에 번만 실행된다.
  1. 캡슐화
  1. 상속 : 부모의 기능을 자식 클래스가 물려 받는 , 이때 protected 사용하여 외부에서는 접근 불가능하게 막고

자식은 접근을 허용할 있다. 또한 이상의 다중 상속을 허용하지 않는다.

  • as 연산자 : 참조형 변수에서만 사용가능하며 형변환이 가능하면 지정된 타입으로 변환해주고

가능하지 않으면 null 반환한다.

  • is 연산자 : 형변환의 가능성 여부를 불린형 결과값(true/false)으로 반환한다.
  • this : 클래스 내부의 코드에서 객체 자신을 가리킬 있다.

이를 통해 모호성을 제거 있다.

  • Base(5) : '부모 클래스' 명시적으로 기리키는데 사용한다.
  1. 다형성

암시적 형변환을 경우 내가 원하는 방향으로 재정의가 안될 있다.

그럴때 사용하는것이 virtual/override이다.

또한 C#에서는 의도적으로 같음 이름을 명시할 있도록 new 예약어를 제공한다.

  • 오버로드 : '매개변수의 ', '개별 매개변수 타입' 다르게 하여 재정의 하는 것을 말한다.

 

  1. 클래스 확장

시작요소가 0 아닌 다른 수를 넣을 수도 있으며 증가하는 값도 개발자가 임의로 넣을 있다.

HasFlag 통해 특정 요소가 포함되어 있는지 아닌지를 확인할 있다.

[Flags] 통해 enum 타입의 인스턴스가 여러 개의 값을 포함하는 용도로 사용된다는 것을 알릴 있다.

  • readonly : 읽기 전용 필드를 뜻하며 변수를 정의할때와 생성자 내부를 제외하고는 값을 바꿀 없다.
  • const : 상수
  • event(8) : 모든 이벤트는 이벤트를 발생시킨 객체(object) 해당 이벤트의 정보를 가지는 이벤트 객체로 구성되는 두개의 인자를 가진다.
  • 인덱서 : 클래스에 배열과 같은 식으로 접근할 필요가 있을때 사용하는 것이 좋다

 

 

5 C# 1.0

  1. 문법요소

이런 오류를 확인하거나 의도적으로 오류를 내지 말라고 있다.

  • params : 가변 매개변수
  1. 예외처리

반면 catch 블록내의 코드는 오직 예외가 발생한 경우에만 실행한다.

  • finally : 예외가 발생하는 것과 상관없이 언제나 실행된다.
  1. 스택/

 

6 BCL

  1. 시간
  2. 문자열 처리
  3. 직렬화/역직렬화
  1. 컬렉션
  1. 스레딩 : 명령어를 실행하기 위한 스케줄링 단위이며, 프로세스 내부에서 생성할 있다. 스레드의 실행순서는 장담할   없다.

 

7 C# 2.0

  1. 제네릭 : 박싱/언박싱으로 발생하는 비효율적인 메모리 사용 문제를 없애고 데이터 타입에 따른 코드 중복 문제를 해결한다.
  2. ??연산자 : null값을 가진 참조형 변수를 손쉽게 처리할 있는 연산자
  3. default 예약어 : 특정 타입의 티폴트값을 반환하며 제네릭에서 자주 사용한다.
  4. yield return/break : 간단하게 표기가 가능하다.
  5. 부분(partial) 클래스 : 클래스의 소스코드를 2 이상으로 나눌 있다.
  6. nullable 형식 : 참조 타입의 경우 null 가능하지만 타입에는 불가능하여 타입에도 null 가능토록 한다.

축약어로 타입에 "?"문자를 합께 붙이는 표현도 가능하다.

  1. 익명 메서드 : 이름이 없는 메서드다. 한번 사용하고 다시 사용하지 않을거 같을때 사용된다.
  2. 정적 클래스(4) : class앞에 static 키워드를 선언해서 만든다. 전역적으로 접근해야하는 유틸리티 클래스를 만들때 사용된다.

 

8 C# 3.0

  1. var예약어 : 타입 추론 기능이 추가되면서 메서드의 지역 변수 선언을 타입에 과계없이 있게 되었다.
  2. 자동 구현 속성 : 프로퍼티를 조금더 간결하게 선언할 있다. C#6.0 버전에서는 선언과 동시에 초기화도 가능하다.
  3. 객체 초기화 : 프로퍼티를 활용해 생성자 없이 객체를 초기화, 생성하는 방법이다.
  1. 컬렉션초기화 : new구문과 함께 값을 설정하는것이 가능하다.
  2. 익명 타입 : 객체 초기화 구문에서 타입명을 제거한다. 객체의 타입명이 없기때문에 지역 변수를 선언할때 타입명이 아닌 var 예약어를 사용한다.
  3. 람다식
  4. Linq : SQL 쿼리문과 비슷하다.

 

9 C# 4.0

  1. 선택적 매개변수 : 메소드의 매개변수를 정의할때 기본값을 함께 명시한다.

ex) public void Output(string name, int age = 0, string address = "Korea")

  1. dynamic 예약어 : var 비슷해보이나 var와의 차이점은 var 경우 컴파일 시점에 타입을 결정하지만 dynamic 경우 프로그램이 실행되는 시점에 타입을 결정한다.

 

10 C# 5.0

  1. 비동기 호출

Task 타입은 반환값이 없는 경우 사용되고 Task<TResult> 타입은 TResult 형식 매개변수로 지정된 반환값이 있는 경우다.

 

11 C# 6.0

  1. 자동 구현 속성
  1.  람다 식을 이용한 메소드, 속성 및 인덱스 정의
  2. using static 구문을 이용한 타입명 생략 : 예로 using static System.Console; 추가할경우 WriteLine()써도 된다.
  1. null 조건 연산자
  1. 문자열 보간 : string.format 좀더 편하게 있도록 지원해주는 기능이다.
  2. nameof 연산자 : 식별자
  3. Dictionary 타입의 인덱스 초기화
  4. catch/finally 블록내에서 await 사용 가능

 

12 C# 7.0

  1. 튜플(1) : 유한 개의 원소로 이뤄진 정렬된 리스트를 의미하는 자료구조이다. 2 이상의 값을 리턴하는 메소드를 보다 깔끔하게 구현할 있다.
  2. 람다식 이용한 메서드 정의 확대

 

13 C# 7.1

  1. Main 메서드에 async 에약어 허용
  2. default 리터럴 추가 : 타입추론 가능
  3. 타입 추론을 통한 튜플의 변수명 자동 지정
  4. 패턴 매칭 - 제네릭 추가
  5. 참조 전용 어셈블리

 

14 C# 7.2

  1. 메서드의 매개변수에 in 변경자 추가
  2. 읽기 전용(readonly) 구조체
  3. 메서드의 반환 로컬 변수에 ref readonly 추가
  4. 스택에만 생성할 있는 타입 지원 - ref struct
  5. 신규 추가 타입 : Span<T>
  6. private protected 접근자 추가 : internal protected 비교하여 생각하면 편한데
    이는 internal(동일 어셈블리) '또는' protected(파생 클래스)이지만 private protected

 internal(동일 어셈블리) '그리고' protected(파생 클래스)일때 접근이 가능하다.

  1. 명명된 인수 : C#4.0에서는 이름을 한명 명시하면 이후의 인자들은 모두 이름을 명시해야 컴파일됐으나

C#7.2부터는 중간에 이름을 명시하지 않더라도 컴파일한다.

 

15 C# 7.3

  1. 신규 제네릭 제약 조건 - Delegate, Enum, unmanaged
  2. 튜플 ==, != 연산자 지원

 

 

추가 내용

델리게이트 :

델리게이트를 사용하는가?

정수형을 담고 싶으면 int 선언하듯이 메서드를 담고 싶을때 델리게이트를 사용한다. 그렇기 때문에 반환하고 싶으면 메소드의 타입과 파라미터를 똑같이 적는것이다.

델리게이트를 언제 쓰는가?

어떤게 바뀔때마다(여러 언어를 번역해야하는데 새로운 언어가 추가되어 번역을 추가적으로 해야할때 ) 로직을 계속 바꿔주어야 하는데 공통되고 반복되는 부분이 생기고 계속 변하는 부분을 빼서 델리게이트로 만들어주면 좋다. 델리게이트로 변하는 부분을 매개변수로 받아주고 나머지 코드는 재사용한다.

Action :

델리게이트형이며 void 리턴일때 사용한다.

Func :

델리게이트형이며 리턴이 있을때 사용한다. 특징으론 마지막 매개변수가 반환값이다.

Func<int> testFunc << 처럼 하나의 매개변수면 int 반환하겠다 의미고 여러개면 마지막 매개변수타입으로 반환하겠다는 의미이다.

 

이벤트 :

특정한 (이벤트) 일어났음을 외부의 이벤트 가입자들에게 알려주는 기능을한다.

이벤트가 발생했을때 무엇을 실행할지를 지정해주는 것이 이벤트 핸들러다. 이는 += 추가한다.

 

Stuct/Class 할당방식 :

  • 기본적으로 값타입은 스택, 참조타입은 힙에 저장된다.
  • stuct 내부에 값타입과 참조타입의 필드가 있을경우
  • class 내부에 값타입과 참조타입의 필드가 있을경우

 

 

참고 문헌

1-4

  1.  DLL파일이란 무엇입니까?
  2. https://papabee.tistory.com/14
  3. https://blog.hexabrain.net/141
  4. https://see-ro-e.tistory.com/115
  1. https://karl27.tistory.com/71
  2. https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=isaac7263&logNo=222162479809
  3. https://jeong-pro.tistory.com/53
  4. https://link2me.tistory.com/864

 

5-10

  1. https://hongjinhyeon.tistory.com/87
  2. https://docs.microsoft.com/ko-kr/dotnet/csharp/programming-guide/generics/constraints-on-type-parameters
  3. https://m.blog.naver.com/misun13486/222052617692
  4. https://ssabi.tistory.com/27

 

11-15

  1. https://hello-bryan.tistory.com/304