👁️‍🗨️

C# 개념 훑어보기

둘러보기

stateDiagram-v2
direction LR
state Value {
	direction LR
	state SignedValue {
		sbyte
		short
		int
		long
	}
	state UnsignedValue{
		byte
		ushort
		uint
		ulong
	}
	state Decimal {
		float
		double
		decimal
	}
	enum
	struct
	null
	Tuple
}

state Reference {
	clas
	interface
	array
	delegate
}

object --> Value
object --> Reference

Mermaid
복사

기본 데이터형

모든 데이터형은 공통의 조상 (object) 에서 파생된다 → 통합된 데이터 구조 형태를 가진다

모든 객체 = Object

모든 데이터는 Object 의 파생형이다 → 모든 데이터는 모두 object 형태로 변경 할 수 있다.
1.
value type ⇒ 값이 복사된다
2.
reference type ⇒ 값이 있는 곳의 주소값이 복사된다
data → object : boxing
object → data : unboxing
int i = 1234; object o = i; int j = (int)o;
C#
복사
1.
object 타입으로 복사 → 단, int 형이라는 데이터는 가지고 간다
2.
object → int 로 타입캐스팅

변수선언 및 형식제한 없음

변수 선언 순서 상관 없음
→ c에서는 존재
컴파일시 모든 원본 파일과 함께 처리
→ 라이브러리등 모든 소스가 함께 있는것으로 간주함
start: 24.01.30

C# 형식 및 맴버

기본적으로 C# 은 OOP 개념으로 가져간다!
값에 대한 메모리 해제방법으로 가비지 컬렉터 실행은 가능하나, 개별해제는 언어차원에서 구현되지 않음

class vs struct

1.
두 구조는 기본적으로 값을 다루는 방식에 차이가 있다.
class = reference type
struct = value type
2.
클래스는 기능에, 구조체는 데이터 전달 목적에 초점을 맞춘다
3.
클래스는 다형성 가능, 구조체는 불가능 → 어떤 목적에 의해 존재하기 되었는지 이해하기

interface

1.
class 및 struct 의 공용된 메소드를 추가하기 위한 장치
2.
일반적으로 이해하는 인터페이스와 동일!
메소드만 선언가능
값 선언 불가능 → 단, 값을 불러오는 getter, setter, 등을 통해 극복 가능

enum

1.
열거형 → 연속된 int 의 값 (0, 1, 2, 3 …) → 일정한 수의 배열 → 콜론이 아닌 , (콤마) 사용이 당연하다!
2.
키워드 Flag 와 함께하면 값을 가질수 있다
[Flags] public enum Seasons { None = 0, Summer = 1, Autumn = 2, Winter = 3, Spring = 4, All = Summer | Autume | Winter | Spring // todo All 부분 확인해보기 }
C#
복사

nullable

Value 타입인 경우 기본적으로 nullable 하지 않다 → 기본값 존재 (키워드: default)
value 타입의 null 값은 명시적, 리터럴로 표현가능
int? nullableInt = default; // null 이 기본값
C#
복사

tuple

간단한 데이터 구조 형태
() Parentheses 로 묶은 데이터 형을 의미한다
(double Sum, int Count) t2 = (4.5, 3);
C#
복사

C# 프로그램 구성 요소

영문버전으로 읽는것이 더 좋다. 이해도 빠를뿐더러 앞으로 문제가 생겼을 때 어떻게 검색해야 하는지 알려주는 가이드 역활을 하게 된다.

Members - 클래스의 구성요소

구성요소를 영어로 외워두는것이 더 좋다 → 검색 및 기타 여러 정보를 읽어서 이해하는데 많은 도움이 된다
element
name
etc
constant
상수 - Constant values associated with the class
field
맴버변수, 필드 - Variables that are associated with the class
method
메소드, 맴버함수 - Actions that can be performed by the class
property
값을 불러오는 메소드 - Actions associated with reading and writing named properties of the class
indexer
현재 속해있는 객체의 인덱스를 가져오는 메소드 - Actions associated with indexing instances of the class like an array
event
이벤트, 알림 - Notifications that can be generated by the class
operator
연산자 → 클래스간 연산에 대한 정의 - Conversions and expression operators supported by the class
constructor
생성자, 객체생성시 최초1회 실행 - Actions required to initialize instances of the class or the class itself
finalizer
소멸자 → 객체가 소멸할떄 1번 실행 - Actions done before instances of the class are permanently discarded
c, c++ 에서 개념은 destructor
types
형식(=타입), 클래스 내부에서 정의하는 형식 - Nested types declared by the class

Accessibility - 접근제한자

다른언어에 비해 internal (같은 어셈블리[프로그램] 내에서) 이라는 키워드가 추가되었다
아직 경험해 보지 않은 관계로 써가면서 확인해보기
element
name
etc
public
공개
private
비공개 → 확장(extends) 에서도 비공개
protected
비공개 → 확장(extends) 에서는 공개
internal
public 과 같지만, 같은 어셈블리 내에서만 확장 공유
protected internal
같은 어셈블리(프로그램) 내에서의 확장(extends)에서 공유 - Access is limited to this class, classes derived from this class, or classes within the same assembly.
todo 1. protected internal vs private protected 확인해보기
private protected
같은 어셈블리(프로그램) 에서의 private Access is limited to this class or classes derived from this type within the same assembly.

Field - 필드, 맴버변수

class (definition 정의) 또는 class 의 instance 에 연결된 변수
static field → 모든 클래스가 한개의 변수를 바라보게 만든다. readonly 와 함께 써서 변경할수 없게 쓰는것이 중요! (메모리 누수위험!)
! readonly 키워드 변수 → constructor 나 선언부에서만 초기화 가능!

Method, function member - 메소드, 함수맴버

class 또는 struct에 연결되어 있는 맴버함수,
→ class, struct 의 인스턴스 메소드는, 각각의 인스턴스에서 실행 (인스턴스 개수만큼 존재)
→ static method 는 class, struct 의 정의 부분에서 실행 (1개 존재)

Parameter - 파라미터, 매개변수

메서드에 입력하는 값
데이터 전달 방식에 따른 분류
1.
call by value : except all call by reference
null 이 되지 않는(= 초기화되어있는) 기본형 데이터 값은 복사되어 전달된다.
지역변수화 되어 입력되는 실제적인 변수에 영향을 끼치지 않는다!! (중요)
데이터형이 값이라고 하더라도, ref 키워드와 함께 포인터로 전달되고, 원본을 바꿀수 있는 권한을 줄 수 있다.
2.
call by reference: class, array, interface, delegate
null 이 가능한 (즉, 포인터 → 값) 주소의 복사.
ref 는 파라미터로 입력된 포인터도 복사본 = 지역변수!! → 원본의 포인터를 바꿔야 (메모리 재할당) 하는경우 out 키워드를 써야 한다.
→ 입력된 포인터의 변경까지 원할경우 out 키워드. out 된 포인터를 원본 포인터로 덮어 씌워주는 것까지 해주는 키워드
// ref sample static void Swap(ref int x, ref int y) { int temp = x; x = y; y = temp; } public static void SwapExample() { int i = 1, j = 2; Swap(ref i, ref j); Console.WriteLine($"{i} {j}"); // "2 1" }
C#
복사
// out sample static void Divide(int x, int y, out int quotient, out int remainder) { quotient = x / y; remainder = x % y; } public static void OutUsage() { Divide(10, 3, out int quo, out int rem); Console.WriteLine($"{quo} {rem}"); // "3 1" }
C#
복사
매개변수 배열 Parameter array
1.
다른언어에서 . . . 으로 보통 표현하는 것(갯수를 정하지 않고 배열로 받는)
2.
키워드는 params 로 사용한다
public static void Wriete(string fmt, params object[] args) { ... }
C#
복사

Method body, Local variables - 메소드 본문, 지역변수

다른 언어와 개념 동일

Static, Instance method - 정적, 인스턴스 메소드

다른 언어와 개념 동일

Virtual, override, abstract method - 가상, 재정의, 추상 메소드

→ virtual 가상 메소드. extends 한 객체에서 반드시 구현해야 한다. 동적 메소드, 실행될때 (JIT) 구현 결정, 미리 로딩되지 않는다. → 필요시 로딩
→ override 재정의, super 에서 정의한 함수의 재정의
→ abstract 추상 메소드, 추상 메소드 선언부에서만 사용가능

Overload - 오버로드

다른언어의 오버로드와 동일개념
메소드이름, 리턴타입이 같으나 파라미터의 종류를 다르게 설정 가능

Other function members

클래스의 메소드 이외의 함수
1.
constructor - 생성자
생성자, 오버로드 가능
무조건 생성되어야한다. 암시적 생성 포함
2.
property - 속성
get, set 변수
3.
indexer - 인덱서
같은 데이터형 (class, struct) 에서의 순서를 결정하는 함수
4.
event - 이벤트
다른 언어에서 보지 못한(?) 공식 패턴
구독형이며 델리게이트로 표현,
JS 에서의 windows.addListener(””, () ⇒ {}) 와 거의 동일
구독 추가 삭제시 +=, -= 연산자 사용
5.
operator - 연산자
cpp 에서 사용하던 개념과 같음, 정의한 데이터형 (class, struct) 의 연산을 정의 할수 있다.
단항연산, 이항연산, 변환연산을 정의 가능
6.
finalizer - 종료자

Expressions 식

값과 값의 관계를 연산자로 정의하는 것
1.
연산자 operator - 4칙연산, = (할당), new (메모리 재할당), 논리연산, 비트쉬프트, 비교연산 등
2.
피연산자 operand - 모든 데이터 변수, 상수
연산의 순서
1.
이항연산: 왼쪽우선
2.
?: 조건부 연산자: 오른쪽우선
3.
결합 우선 () Parentheses

Statement 명세서

{} curly brace (scope) 에 정의된 식들의 집합, 문단할때 문과 같다.
if, for, switch, whilte, do, foreach, break, goto, return, yield, throw, try, checked, unchecked, lock, using 키워드 등

C# 주요 언어 영역

Array, Collection, LINQ

c# 의 array 데이터구조는 System.Collections.Generic.IEnumerable<T> 인터페이스를 구현한다.
어떠한 구현이든, 같은 원칙으로 작성됨
배열
int[] a = new(); // 1 차원 int[,] b = new(); // 2 차원 int[,,] c = new(); // 3 차원 int[] ls = [1, 2, 3]; // literal expression
C#
복사

String interpolation

문자열 보간
int age = 20; Console.WrieteLine($"{age}");
C#
복사

Pattern matching

특정값을 찾아 매치하는것 → switch 문

Delegate, Lambda expression

Delegate → 다른 언어의 콜백함수 같은 개념, 단, 함수형 선언후 사용가능
delegate double Function(double x); class Multiplier { double _factor; public Multiplier(double factor) => _factor = factor; public double Multiply(double x) => x * _factor; } class DelegateExample { static double[] Apply(double[] a, Function f) { var result = new double[a.Length]; for (int i = 0; i < a.Length; i++) result[i] = f(a[i]); return result; } public static void Main() { double[] a = { 0.0, 0.5, 1.0 }; double[] squares = Apply(a, (x) => x * x); double[] sines = Apply(a, Math.Sin); Multiplier m = new(2.0); double[] doubles = Apply(a, m.Multiply); } }
C#
복사

Async, await expression

유니티에서 지원하는것인가? 찾아보고 공부하기

Attributes

툭성 - 함수나 값에 대한 특성을 모아둔 것
.NET 기본제공 하는 Attribute 인터페이스가 있다.