1.값 형식 (Value Types) <Stack영역 저장>:
- int: 정수 값을 나타내는 32비트 부호 있는 정수
- double: 부동 소수점 값을 나타내는 64비트 배정밀도 부동 소수점
- bool: 참 또는 거짓을 나타내는 논리 값
- char: 유니코드 문자를 나타내는 16비트 유니코드 문자
- struct: 사용자 정의 값 형식을 나타내는 구조체
2.참조 형식 (Reference Types) <Heap영역 저장>:
- string: 문자열을 나타내는 유니코드 문자열
- object: 모든 클래스 형식의 기본 클래스(모든 Data type의 조상)
- class: 사용자 정의 참조 형식을 나타내는 클래스
-> Stack에 Heap의 주소 저장, Heap에는 실제 데이터 저장
-> 참조형식의 변수에 값을 대입하고 사용한뒤 Stack에 저장된 주소는 사라지고, Heap에 저장된 데이터는 Garbage Collector가 수거해간다.
int myValue = 42; // 값 형식 변수
// 박싱: 값 형식을 참조형식으로 변환 (Heap에 할당)
object boxedValue = myValue;
// 언박싱: 참조형식을 값 형식으로 변환
int unboxedValue = (int)boxedValue;
//Java
int myValue = 42; // 기본형 변수
Integer boxedValue = myValue;
int unboxedValue = boxedValue;
3.열거형 (Enumerations):
- enum: 이름으로 식별되는 상수 집합을 정의하는 열거형
4.배열 (Arrays):
- int[]: 정수 값의 배열
- string[]: 문자열의 배열
- 기타 다른 형식의 배열
5.델리게이트 (Delegates):
- delegate: 메서드를 참조하는 형식으로, 이벤트 처리, 비동기 작업 등에 사용됨
6.Nullable 형식 (Nullable Types):
- int?: 값 형식에 null 값을 허용하는 Nullable 형식
- 값 형식에서만 가능, 참조 형식 X
int? aa = null; //출력 -> 아예 아무것도 안뜸 double? bb = null; //int bb = null; -> error
대리자는 메서드의 주소를 참조하고 있어서 메서드를 대신 호출할 수 있다.
쉽게말하면 함수를 보관하는 통을 만들고(대리자선언) 그 통안에 함수를 넣고
나중에 통을 가져와서 함수를 실행시키는 방식
C/C++의 참조 포인터와 유사하지만, 데이터 타입을 안전하게 처리한다는 장점이 있음.
GPT형님이 말해준 특징
- 메서드 참조: 델리게이트는 메서드를 참조하여 호출할 수 있습니다. 즉, 메서드를 델리게이트에 할당하여 해당 메서드를 참조할 수 있습니다.
- 유형 안전성: 델리게이트는 컴파일 시점에서 형식 검사를 받으므로, 델리게이트가 참조하는 메서드의 시그니처(매개변수의 유형 및 반환 유형)와 일치해야 합니다. 이를 통해 델리게이트를 사용할 때 형식 오류를 사전에 방지할 수 있습니다.
- 다중 호출 지원: 델리게이트는 여러 개의 메서드를 동시에 호출할 수 있습니다. 이를 통해 여러 개의 메서드를 한 번에 호출하거나, 이벤트에 여러 개의 이벤트 핸들러를 등록하는 등의 작업을 수행할 수 있습니다.
using System;
namespace ConsoleApplication1
{
class Program
{
delegate int CalculationDelegate(int a, int b);
delegate void MyDelegate();
public static void Main(string[] args)
{
int Add(int a, int b)
{
return a + b;
}
int Subtract(int a, int b)
{
return a - b;
}
// 델리게이트 인스턴스 생성 및 메서드 할당
CalculationDelegate calcDelegate = Add;
int result = calcDelegate(5, 3); // Add 메서드 호출
// 델리게이트에 다른 메서드 할당
calcDelegate = Subtract;
result = calcDelegate(5, 3); // Subtract 메서드 호출
Console.WriteLine(result);
// 메서드를 참조하는 형식은 여러가지를 지원.
// calcDelegate = new calcDelegate(Add);
// calcDelegate = Add;
// calcDelegate += Add;
/*--------------------------------------------------------*/
MyDelegate myDelegate = new MyDelegate(Method1);
myDelegate += Method2; // 델리게이트에 메서드 추가
myDelegate(); // 델리게이트 호출
//Method1 called 둘다 출력
//Method2 called
}
static void Method1()
{
Console.WriteLine("Method1 called");
}
static void Method2()
{
Console.WriteLine("Method2 called");
}
}
}
원하는 메소드를 Delegates에 넣고 꺼내쓸수있다 Delegates의 매개변수나 반환타입이 불러올 메서드와 일치 해야한다
MyDelegate의 예시는 멀티캐스트(Multicast) 델리게이트를 사용해 두 메서드를 동시에 불러온 방법
Delegates가 주로 이용되는 예는 콜백 함수가 있다. 콜백함수란, 무언가의 처리가 끝난 후에, 호출하고 싶은 처리를 의미하는 것으로, 비동기 처리의 종료 통지등에 사용되는 경우가 많다.
namespace ConsoleApplication1
{
public class Test
{
int a1 = 10;
int b1 = 20;
public int CallA1()
{
return a1;
}
protected int CallB1()
{
return b1;
}
internal int Add()
{
return a1 + b1;
}
protected internal int Sub()
{
return a1 - b1;
}
}
class Program
{
public static void Main(string[] args)
{
Test test = new Test();
test.a1 = 15; //'보호 수준 때문에 'Test.a1'에 액세스할 수 없습니다.
test.CallA1();
test.CallB1();//'보호 수준 때문에 'Test.CallB1()'에 액세스할 수 없습니다.
test.Add();
test.Sub();
}
}
a1이 에러가 나는 이유는 클래스 멤버의 접근제한자를 따로 선언하지 않으면 자동으로 private로 지정된다.
protected는 클래스 외부에서 접근 X 파생클래스에서 접근 가능
internal은 동일 어셈블리 -> 동일프로그램에서 접근 가능
protected internal은 동일 어셈블리에서 protected로 접근 가능
Java를 할때도 this가 너무 헷갈려서 다시 정리
"this"는 현재 객체를 가리키는 참조. 객체는 클래스로부터 생성된 인스턴스를 의미. "this"를 사용하여 현재 객체의 멤버 변수와 메서드에 접근가능
멤버 변수와 매개변수 이름이 충돌하는 경우:
public class MyClass {
private int value;
public void SetValue(int value) {
this.value = value; // "this"를 사용하여 멤버 변수에 접근
//필드 //매개변수
}
}