개요
C#, .NET Framework, .NET Core 간단하게 개념 정리하기 |
내용
object 형식
모든 형을 담을 수 있는 형식(기본 데이터 형식, 복합 데이터 형식, 사용자 데이터 형식..)
Nullable 형식
null 이 가능한 형식. 기본적으로 컴파일러에서 null값을 허용하지 않는데 ?를 붙여 줌으로 변수에 null 값을 허용 할 수 있다.
int? a = null;
float? b = null;
var 형식
javascript, as 와 같이 컴파일러에서 형식을 판단 해서 사용할 수 있게 하는 형식. 지역 변수로만 사용 가능.
Console.WriteLine
여러가지 값 출력 하기.
int a=3, b=15;
string c = "abc";
Console.WriteLine("a:"+a+" b:"+b+" c:"+c); //a:3 b:15 c:abc
Console.WriteLine("{0} {1} {2}", a, b, c); // 3 15 abc
정수를 특정 자릿수의 10진수로 출력하기
int a = 3;
Console.WriteLine("{0:D5}",a); // 00003
정수를 16진수로
int a=255;
Console.WriteLine("{0:X8}", a); // 000000FF
명명된 매개변수
public MainWindow()
{
InitializeComponent();
addPhoneNumber(number: "01234", name: "홍길동");
addPhoneNumber(name: "박찬호", number: "2345");
addPhoneNumber("이승엽", number: "9876");
}
private void addPhoneNumber(string name, string number)
{
Console.WriteLine("Name:{0} Phone:{1}", name, number);
}
출력:
Name:홍길동 Phone:01234
Name:박찬호 Phone:2345
Name:이승엽 Phone:9876
선택적 매개변수
void MyMethod(int a=0, int b=1)
{
...
}
MyMethod(2);
this() 생성자
class MyClass
{
int a,b,c;
public MyClass()
{
this.a = 123;
}
public MyClass(int b) : this() // 이렇게 하면 위쪽 MyClass() 생성자가 먼저 호출 된다.
{
this.b = b;
}
}
접근 한정자
- public -
- protected -
- private -
- internal - 같은 어셈블리에 있는 코드에 대해서만 public으로 접근 할 수 있습니다. 다른 어셈블리에 있는 코드에서는 private와 같은 수준의 접근성을 가집니다.
- protected internal - 같은 어셈블리에 있는 코드에서 대해서만 protected로 접근할 수 있습니다. 다른 어셈블리에 있는 코드에서는 private와 같은 수준의 접근성을 가집니다.
형식 확인, 변환(is, as)
is : 객체가 해당 형식에 해당하는지를 검사하여 그 결과를 bool 값으로 반환합니다. as : 형식을 변환 하지만 실패하는 경우 객체 참조를 null로 만듭니다.
class Test
{
public Test()
{
Dog d = new Dog();
if (d is Animal)
{
Console.WriteLine(d);
}
Animal a = d as Animal;
if(a != null)
{
Console.WriteLine(a);
}
}
}
class Animal
{
}
class Dog : Animal
{
}
메소드 숨기기
파생 클래스에서 기반 클래스에서 구현된 함수를 다시 구현 할때 new 키워드를 사용한다. 사용하지 않으면 warning이 발생한다.
class Animal
{
public void A()
{
}
}
class Dog : Animal
{
public new void A()
{
}
}
분할 클래스
partial 키워드를 이용해서 클래스를 같은 파일이나 다른 파일에서 분할 해서 구현 할 수 있다.
partial class Animal
{
public void A()
{
}
}
partial class Animal
{
public void B()
{
}
}
확장 메소드
기존의 클래스나 형식을 확장 해서 사용하게 해 주는 메소드 방식
namespace WpfApplication1
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
1.print();
}
}
public static class AA
{
public static void print(this int a)
{
Console.WriteLine(a);
}
}
}
프로퍼티 선언
변수에 대한 get함수, set함수를 생성 하는 대신 프로퍼티 형식으로 선언해서 접근 제한이나 예외 처리를 할 수 있다.
public MainWindow()
{
InitializeComponent();
A a = new A();
a.Num = -1;
Console.WriteLine(a.Num); // 0
}
class A
{
private int _num = 0;
public int Num
{
get { return _num; }
set
{
if(value>0)
_num = value;
}
}
}
자동프로퍼티, 프로퍼티 생성자
public MainWindow()
{
InitializeComponent();
A a = new A()
{
Num = -1,
};
Console.WriteLine(a.Num); // -1
}
class A
{
public int Num
{
get;
set;
}
}
인덱서(Indexer)
Index를 이용해서 객체 내의 데이터에 접근하게 해 주는 프로퍼티.
public MainWindow()
{
InitializeComponent();
A a = new A();
a[1] = 2;
}
class A
{
private int[] _array = new int[3];
public int this[int i]
{
get
{
return _array[i];
}
set
{
if (i < 3)
_array[i] = value;
}
}
}
일반화(Generalization)
데이터 형식을 일반화한 메소드.
public MainWindow()
{
InitializeComponent();
Console.WriteLine(equal(1, 3) + " " + equal("A", "A")); //False True
}
bool equal<A>(A src, A dst)
{
return src.Equals(dst);
}
일반화 클래스
public MainWindow()
{
InitializeComponent();
A<int> a = new A<int>() { data = 1 };
A<string> b = new A<string>() { data = "abc" };
Console.WriteLine(a.data +" "+b.data); //1 abc
}
class A<T>
{
public T data;
}
일반화 클래스 매개 변수 제약
모든 값들을 사용하는 것이 아니라 struct, class, 기반 클래스, 인터페이스 이름 등을 지정 할 수 있다.
public MainWindow()
{
InitializeComponent();
Console.WriteLine(equal(3, 3) + " "); //True
}
bool equal<A>(A src, A dst) where A : struct
{
return src.Equals(dst);
}
델리게이트(delegate)
Callback 과 같은 기능을 구현 할 때 사용
delegate int MyDelegate(int a, int b);
public MainWindow()
{
InitializeComponent();
MyDelegate a = new MyDelegate(Plus);
Console.WriteLine(a(1, 2)); //3
}
int Plus(int a, int b)
{
return a + b;
}
delegate void MyDelegate(int a, int b);
public MainWindow()
{
InitializeComponent();
MyDelegate a = new MyDelegate(Plus);
a += new MyDelegate(Minus);
a(1, 2); //3-1
}
void Plus(int a, int b)
{
Console.Write(a + b);
}
void Minus(int a, int b)
{
Console.Write(a - b);
}
이벤트(event)
델리게이트를 사용해 함수를 만들고 event로 등록해서 함수를 호출 할 수 있다.
event MyDelegate OnMyDelegateEvent;
delegate void MyDelegate(int a, int b);
public MainWindow()
{
InitializeComponent();
OnMyDelegateEvent += new MyDelegate(MainWindow_OnMyDelegateEvent);
OnMyDelegateEvent(1, 2);
}
void MainWindow_OnMyDelegateEvent(int a, int b)
{
Console.WriteLine(a+b);
}
람다식
쫌 더 간결한 형식으로 함수를 묘사 하기 위해서 만들어 진 형식. (LISP 같은 언어에서 적용되었으나. C 나 Java에서는 계획되었다가 불분명한 이유로 취소 되었다고 함)
delegate int Calculate(int a, int b);
public MainWindow()
{
InitializeComponent();
Calculate calc = (int a, int b) => a + b;
Console.WriteLine(calc(1, 2)); //3
}
링크(LINQ)
데이터를 쉽게 선택, 정렬 할 수 있게 해 주는 방법.
public MainWindow()
{
InitializeComponent();
int[] numbers = { 6,7,4,3,8,1,2,9 };
var result = from n in numbers
where n % 2 == 0
orderby n
select n;
foreach(int n in result)
Console.Write(n + " "); //2 4 6 8
}
dynamic 형식
컬파일 시에 데이터 형식이 정해 지는 것이 아니라 실행시에 형식이 정해진다.(컴파일 에러를 비켜 가기 위해서 사용, COM과의 연동 때문에 추가)
'C# > 기초' 카테고리의 다른 글
0. C#? .NET Framework? .NET Core? (0) | 2022.06.13 |
---|