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) 언어이다. 이 말의 의미는 차차 알아가게 될 것이다. 그리고 추가적인 중요한 특징은 다음과 같다.
- Unified type system (통합 형식 시스템)
- Garbage collection (GC, 가비지 수집): auto memory management
- Exception handling (예외 처리):
try
,catch
- Lambda expressions (람다식): anonymous method
- Query syntax (쿼리 문법): LINQ
- Asynchronous operations (비동기 처리):
async
,await
- Pattern matching (패턴 매칭):
is
- Versioning (버전 관리):
virtual
,override
From source files to executable code
Conceptual compilation process
아래 다이어그램은 소스코드로 부터 컴퓨터가 이해하여 실행 코드로의 변환 또는 컴파일이 어떻게 진행되는지를 나타낸 것이다.
- Transformation (변환)
- 소스 파일(Source files)
- Compilation units
- UTF-8 encoding (recommended)
- 소스 파일(Source files)
- Lexical analysis (어휘 분석)
- using Lexical grammar
- Unicode characters are translated into:
- line terminators
- white space
- comments
- tokens
- pre-processing directives
- Syntactic analysis (구문 분석)
- using Syntactic grammar
- specifies how tokens are combined to form C# program
- using Syntactic grammar
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
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:
- Value (값)
- Variable (변수)
- Namespace: member access
- Type: member access,
as
,is
,typeof
- Member group: member lookup, invocation, delegate creation
- Null literal
- Anonymous function: Lambda expression
- Property access:
get
,set
,this
- Event access:
+=
,-=
- Index access:
get
,set
,this
- Nothing
Query expression (LINQ)
Statements
The actions of a program are expressed using statements.
- Block
- Empty
- Labeled
- Declaration
- Expression
- Selection
- Iteration
- Jump
try
checked
andunchecked
lock
using
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. 참조 형식
- 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
댓글
댓글 쓰기