C# 배우기 요약

CS 배우기 요약.md

Updated at 2021.6.7

C# Summary

코딩과 글쓰기는 유사하다. 기본 개념을 비교해 보면 좀 더 쉽게 배울 수 있다. 한가지 차이는 글은 사람이 읽고 받아들이는데 반해, 코딩은 컴퓨터가 읽고 받아들여 일을 하는 것이다.

Analogy between coding and writing

Coding Writing Remarks
Assembly 책, 글
Program 문단(文段), 단락(段落) 하나의 글에서 내용이나 형식을 기준으로 하여 크게 나누어 끊은 단위이다.
Statement 문장(文章) 생각, 감정, 움직임, 모양 등을 표현하는 최소 단위이다. 문장의 끝에는 마침표, 쉼표, 물음표, 느낌표를 찍는다.
Expression 구(句, 글귀), 절(節, 마디) 는 둘 이상의 낱말이 묶여 하나의 문장을 이루는 성분으로 쓰이는 말 덩이, 은 주어와 술어가 갖추어진 하나의 말 덩이이다.
Token 단어(單語, 낱말), 문자(文字) 하나 이상의 글자로 되어 뜻을 나타내는 말이다.

C#은 객체지향(object-oriented), 더 나아가 컴포넌트 지향(component-oriented) 언어이다. 이 말의 의미는 차차 알아가게 될 것이다. 그리고 추가적인 중요한 특징은 다음과 같다.

  1. Unified type system (통합 형식 시스템)
  2. Garbage collection (GC, 가비지 수집): auto memory management
  3. Exception handling (예외 처리): try, catch
  4. Lambda expressions (람다식): anonymous method
  5. Query syntax (쿼리 문법): LINQ
  6. Asynchronous operations (비동기 처리): async, await
  7. Pattern matching (패턴 매칭): is
  8. Versioning (버전 관리): virtual, override

From source files to executable code

Conceptual compilation process

아래 다이어그램은 소스코드로 부터 컴퓨터가 이해하여 실행 코드로의 변환 또는 컴파일이 어떻게 진행되는지를 나타낸 것이다.

flowchart A(Source files) --> |Transformation| B(a sequence of Unicode characters) B --> |Lexical analysis| C(a stream of tokens) C --> |Syntactic analysis| D(Executable code)
  • Transformation (변환)
    • 소스 파일(Source files)
      • Compilation units
      • UTF-8 encoding (recommended)
  • Lexical analysis (어휘 분석)
    • using Lexical grammar
    • Unicode characters are translated into:
      1. line terminators
      2. white space
      3. comments
      4. tokens
      5. pre-processing directives
  • Syntactic analysis (구문 분석)
    • using Syntactic grammar
      • specifies how tokens are combined to form C# program

Let's learn Syntactic grammar

프로그램의 핵심은 문법, 그중에서도 구문 문법(Syntactic grammar)을 익혀서 글을 읽고 쓰듯이, 코딩을 내가 원한는대로 읽고 쓰는 것이다. 알겠지만 읽는 것은 쉽게 할 수 있게 되지만, 쓰는 것에 익숙해져서 유려한 글을 쓰는 것은 많은 연습이 필요하다. C#의 프로그래밍 구조를 Top-down으로 분석해보자.

Program structure

우선 C#의 프로그래밍 뼈대와 가장 간단한 예제는 아래와 같다.

  • Application startup & termination: Main()
  • Declarations: Namespaces, Types
    • Members (Access scopes)
  • Execution Order
  • Memory management

CODE: Hello World

using System; // Namespace

class Hello // Type Declaration
{
  // Member Declaration
  // Program Entry Point
  static void Main() {
    Console.WriteLine("Hello, World");
  }
}

프로그램 구조를 좀 더 상세하게 다이어그램으로 표현하면 아래와 같다. 핵심 개념이기 때문에 한글로 번역된 용어보다는 영어를 그대로 받아들여 개념화 시키는 것이, 향후 혼자서 더 깊이 있는 공부를 해나갈 때 도움이 된다. 한글화 하면 그 의미가 약간 다르게 다가오거나 그 핵심을 짚지 못하는 경우가 있다.

Diagram: Concept of program structure

classDiagram-v2 Assembly --> NamespaceDeclaration : has NamespaceDeclaration --> TypeDeclaration : has TypeDeclaration --> MemberDeclaration : has class Assembly { + Namespace + Type } class NamespaceDeclaration { + Type + NestedNamespace } class TypeDeclaration { + class + struct + interface + enum + delegate } class MemberDeclaration { + constant + field + method + property + event + indexer + operator + constructor + static_constructor + destructor + NestedType }

Expression and Statements

Type 및 Member의 선언(Declaration)은 Expression(표현식)과 그것들의 조합인 Statement(명령문)로 이뤄져 있다. C#에는 어떤 종류의 Expression이 있고 Statement가 있는지를 알아보자. 종류와 문법을 알고 사용해야 남의 코드를 흉내내는 데서 벗어나, 자신만의 코드를 작성할 수 있다고 생각한다. 상세한 내용을 공부할 때 자기가 어느 부분을 파고 있는지는 알면 도움이 된다.

Expressions

Expressions are constructed from operands(피연산자) and operators(연산자).

  • operands: literals, fields, local variables, expressions
  • operators (precedence, overloading)
    • precedence (우선순위): primary, unary, multiplicative, additive, shift, relational and type testing, equality, logical AND, logical XOR, logical OR, conditional AND, conditional OR, null coalescing, conditional, assignment or anonymous function

Expressions are classified:

  1. Value (값)
  2. Variable (변수)
  3. Namespace: member access
  4. Type: member access, as, is, typeof
  5. Member group: member lookup, invocation, delegate creation
  6. Null literal
  7. Anonymous function: Lambda expression
  8. Property access: get, set, this
  9. Event access: +=, -=
  10. Index access: get, set, this
  11. Nothing

Query expression (LINQ)

Statements

The actions of a program are expressed using statements.

  1. Block
  2. Empty
  3. Labeled
  4. Declaration
  5. Expression
  6. Selection
  7. Iteration
  8. Jump
  9. try
  10. checked and unchecked
  11. lock
  12. using
  13. yield

CODE: Statement example

class SimpleStatement
{
  static void Main()
  {
    // Declaration statement.
    int counter;

    // Assignment statement.
    counter = 1;

    // Error! This is an expression, not an expression statement.
    // counter + 1;

    // Declaration statements with initializers are functionally
    // equivalent to  declaration statement followed by assignment statement:
    int[] radii = { 15, 32, 108, 74, 9 }; // Declare and initialize an array.
    const double pi = 3.14159; // Declare and initialize  constant.

    // foreach statement block that contains multiple statements.
    foreach (int radius in radii)
    {
      // Declaration statement with initializer.
      double circumference = pi * (2 * radius);

      // Expression statement (method invocation). A single-line
      // statement can span multiple text lines because line breaks
      // are treated as white space, which is ignored by the compiler.
      System.Console.WriteLine("Radius of circle #{0} is {1}. Circumference = {2:N2}", counter, radius, circumference);

      // Expression statement (postfix increment).
      counter++;
    } // End of foreach statement block
  } // End of Main method body.
} // End of SimpleStatements class.

Types and variables

Unified type system (value vs. reference): 값형식 vs. 참조 형식

graph LR A(Types) --> B(Value Types) A --> C(Reference Types) B --> D(simple Types) B --> E(Enum Types) B --> F(Struct Types) B --> G(Nullable Types) C --> H(Class Types) C --> I(Interface Types) C --> J(Array Types) C --> K(Delegate Types)
  • Namespaces
  • Types and variables
    • Classes and objects
    • Structs
    • Arrays
    • Interfaces
    • Enums
    • Delegates (+Event)

type parameter (generics)

type unsafe (pointer)

Etc

그 외 중요한 개념들

  • Exceptions
  • Attributes & Reflection
  • Unsafe code
  • Asynchronous operations
  • Unsafe code
  • Documentations

댓글