No Story, No Ecstasy

이것이 C#이다 : 처음부터 끝까지 입문자를 배려한 C# 입문서 본문

Frontend Series

이것이 C#이다 : 처음부터 끝까지 입문자를 배려한 C# 입문서

heave_17 2021. 1. 4. 23:52

* "이것이 C#이다 : 처음부터 끝까지 입문자를 배려한 C# 입문서"를 읽고 (제가) 기억할만한 내용을 간추린 글입니다.

이것이 C#이다 : 처음부터 끝까지 입문자를 배려한 C# 입문서
국내도서
저자 : 박상현
출판 : 한빛미디어 2018.07.01
상세보기

 

CLR (Common Language Runtime)

  - Java의 VM과 비슷한 개념

  - CLR이 C# 코드를 JIT 컴파일하여 실행 (정확히는 C# > IL > HW) *IL: CLR을 위한 중간 언어

https://d3i71xaburhd42.cloudfront.net/53309d4348d0cd3a4a41d88dd1b1acd878ed0270/1-Figure1-1.png

참조 형식 선언: Object

  - Object는 모든 datatype의 parent class 

  - 예: object a = 100;

  - Heap에 저장되고, Garbage Collector가 해제

  - Boxing: 값 형식 데이터를 heap에 할당 vs Unboxing: Boxing된 데이터를 형식 변수에 저장

  - 값 형식 변수만 Nullable (null로 선언 가능, HasValue를 통해 null인지 확인)

  - var: 알아서 datatype 판단 (초기화 필수, 지역 변수로만 활용 가능)

 

형식 변환

  - 문자열 > 숫자: int.Parse(), float.Parse()

  - 숫자 > 문자열: .ToString()

 

Class

  - 태생이 참조형식 (얕은 복사) *ICloneable.Clone()이라는 깊은 복사 API가 제공되긴 함

  - is : 객체 형식 검사 (예. if Mammal is Dog)

  - as : 형 변환 실패시 null return(예. Cat cat = Mammal as Cat)

  - override:

    . new를 통해 Base class의 메소드를 숨긴다. (Base에서 virtual로 정의 불필요)

    . sealed를 통해 overriding을 막을 수 있다. (virtual을 overriding했을 때만 활용 가능)

  - Partial Class: Class를 여러 번 나눠서 정의할 수 있다.

  - Nested Class: private member에도 자유롭게 접근할 수 있다.

 

Struct vs Class

  - struct는 값 형식 (new 불필요, 깊은 복사) *struct는 굳이 private을 쓰지 않는다.

  - class는 참조 형식 (new 필요, 얕은 복사)

  - https://202psj.tistory.com/1277

 

[C#] struct 구조체 관련

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 출처: http://clairehjl.blogspot.c..

202psj.tistory.com

Tuple

  - 일반적으로 var로 선언한다. (임시로 사용하는 경우가 많음)

  - 필드명을 줄 수 있다.

var tuple = (Name: "asdf", Age: 17);
var (name, age) = tuple;

 

Property: C#만의 은닉성을 위한 장치

  - 은닉성, 편의성 모두 충족 가능

  - private 변수에 대한 get/set 접근자를 제공 *ex. public string Name {get; set;}

  - 무명 형식의 instance도 생성 가능 *ex. var myInstance = new {Name = "asdf", Age = "17"};

 

Enumerator

  - yield return: return 후 일시정지, 재호출 시 다음 line부터 진행 (yield break로 종료)

 

Delegator: method에 대한 참조

  - Delegate Template: delegate int Compare<T>(T a, T b);

  - Chain으로 여러 개 동시에 부르는 것도 가능

  - 익명 메소드를 넘길 수도 있음 (단발성인 경우)

delegate int MyDelegate(int a, int b);
MyDelegate Callback = new MyDelegate(Plus); *매개변수로 method를 넘긴다.

Event: 대리자를 event 한정자로 수식해서 만든다.

delegate void EventHandler(string message); #delegator 생성

public event EventHandler SomethingHappened: #delegator를 event handler로 등록

static public void MyHandler(string message) #event handler의 method 정의
{
	...
}

notifier.SomethingHappened += new EventHandler(MyHandler); #event 등록
notifier.DoSomteing(i); #event 발생시 핸들러가 호출됨 (event는 public으로 선언되어도 외부에서 호출 불가능)

람다식

delegate int Calculate(int a, int b);
Calculate calc = (int a, int b) => a+b;

Func, Action: .NET에서 미리 정의해놓은 대리자

  - Func<in1, in2, ..., out>() : 항상 마지막이 반환 형식

  - Action<...>() : 반환 형식이 없다.

 

리플렉션

  - 동적으로 동작

  - System.Activator 클래스의 도움이 필요

  - object a = Activator.CreateInstance(typeof(int));

 

기타

  - dynamic: 자료형에 대한 검사를 컴파일 시점에 하지 않음

  - await과 async는 항상 함께 와야 한다.

  - unsafe로 할당된 메모리는 GC가 정리하지 못한다. (직접 관리)