둘러보기
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 인터페이스가 있다.