본문 바로가기

Study/C#36

[C#] required, Nullable 파헤치기(feat. 거슬리는 초록 밑줄) ✍️vs2022로 c# 코드 작성 중 아래와 같이 단순한 배열 선언에 초록색 밑줄이 나오길래 거슬려서 확인해 보았다. ※ 커서를 가져다 대본 결과 위와 같은 문구가 나왔고, 이 거슬리는 밑줄을 없애기 위해선 두 가지 방법이 있었다. 1. required 키워드 사용 2. Nullable로 선언 밑줄의 원인은 설명에 써 있는 것과 같이 해당 배열의 값이 null이 올 수 있는지 아닌지가 확실하지 않아서 나오는 경고 였고. C# 11 이상의 버전에서만 보이는 경고 문구였다. 따라서 배열에 값이 null이 올 수 없게 하려면 required 키워드와 함께 선언하는 첫 번째 방법을 사용하면 되고, null이 올 수 있도록 하려면 두 번째 방법인 Nullable로 선언하면 된다. 위는 required와 Nulla.. 2023. 12. 8.
[C#] 문자열 String, StringBuilder 차이점(feat 얕은 복사, 깊은 복사) ✍️먼저 아래의 간단한 C# 코드의 출력을 예상해보자. string s1 = "AA"; string s2 = s1; string s3 = string.Copy(s1); Console.WriteLine(s1); Console.WriteLine(s2); Console.WriteLine(s3); Console.WriteLine("-----------------------------------------------"); s1 = "ZZ"; Console.WriteLine(s1); Console.WriteLine(s2); Console.WriteLine(s3); Console.WriteLine("-----------------------------------------------"); string은 참조타입이므로.. 2023. 11. 17.
[C#] 리플렉션(Reflection) 1. 리플렉션(reflection)이란? - 애플리케이션 실행 중 어셈블리의 내용(메서드, 프로퍼티, 생성자 등, 인스턴스의 데이터 타입 정보)을 확인하거나 검사하려는 경우 사용되는 기능 - 프로그램 실행 도중에 객체의 정보를 조사하거나, 다른 모듈에 선언된 인스턴스를 생성하거나, 기존 개체에서 형식을 가져오고 해당하는 메소드를 호출, 또는 해당 필드와 속성에 접근할 수 있는 기능을 제공한다. - 컴파일 시에 알 수 없었던 타입이나 멤버들을 찾아내고 사용할 수 있게 해주는 메커니즘 2. 리플렉션의 목적 - 애플리케이션 개발시, 디버깅 또는 런타임에 알 수 없는 객체의 동작을 분석하기 위함. - 외부 라이브러리에 존재하는 클래스 및 메서드를 분석하기 위함. - 개발 도구 자체를 개발하거나 분석도구를 만들때.. 2023. 11. 1.
[C#][Study] 확장 메서드(Extension Method) 1. 확장 메서드 - 기존 클래스의 기능을 확장하는 기법(상속과는 다름) - 클래스 외부에서 클래스의 메서드처럼 사용할 수 있는 새로운 메서드를 만들 수 있는 기능 2. 확장 메서드 생성방법 1) static class 2) static method 3) 첫번째 매개변수 this 키워드 using System; namespace StudyCSharp { class Program { static void Main(string[] args) { int a = 10; int b = 20; // int의 메서드처럼 IntToString 함수를 사용가능 string A = a.IntToString("aaaa"); string B = b.IntToString("bbbb"); Console.WriteLine(A); .. 2023. 10. 4.
[C#][Study][기초다지기] Action, Func, Predicate 1. 사용 목적 - 딜리게이트 선언의 불편함을 보완 ex) delegate 사용 delegate void DelegateFunction(); // 이렇게 매번 선언을 해줘야 하는 불편함이 있음 static void Main(string[] args) { DelegateFunction df = () => Console.WriteLine("실행"); // 아래 두가지 방법 중 하나로 실행 가능 df(); // 실행 방법 1 df.Invoke(); // 실행 방법 2 } ex) Action 사용 static void Main(string[] args) { Action ac = () => Console.WriteLine("실행"); ac(); ac.Invoke(); } - 이처럼 간결하게 나타낼 수 있다. 2... 2023. 9. 25.
[C#][Study][기초다지기] 제네릭 Generic 제네릭 - 코드 type 안전성, 성능 및 코드 유용성을 향상시킴 - 대부분 Generic은 컬렉션 클래스를 생성하는데 사용됨(List, Vector 등) - System.Collections.Generic 네임스페이스를 추가해 제네릭을 사용할 수 있음 - 자신만의 코드를 만들 수 있음 1) 선언 public class GenericList { void Add(T input) { } } 2) 사용 class TestGenericList { private class ExampleClass { } static void Main() { // int형 리스트 GenericList list1 = new GenericList(); // string형 리스트 GenericList list2 = new GenericL.. 2023. 9. 23.
[C#][Study][기초다지기] 다형성 다형성 1) 정적 다형성(컴파일 다형성) - 컴파일 시간동안 함수를 객체와 바인딩 - 프로그램을 작성하는 동안 객체로 함수에 태그를 지정(초기 바인딩) - 함수 오버로딩이 해당 2) 동적 다형성(런타임 다형성) - 후기 바인딩(Late Binding), 메서드 재정의(Method Override) 라고도 함 - virtual 또는 override 키워드를 사용해 기본 클래스 함수를 재정의 함 3) 오버로딩 - 매개변수에 따라 함수가 다르게 동작 4) 오버라이딩 - 이름과 매개변수, 리턴형이 모두 같지만 다른 동작을 하는 것을 의미 2023. 9. 23.
[C#][Study][기초다지기] 내장 delegate 내장 delegate - Microsoft에서 제공하는 2종류의 내장 delegate가 있다. - 내장 delegate를 이용해 이벤트 처리 코드를 쉽게 작성할 수 있다. - 이벤트를 발생시킬때 규칙에 따라 필수 매개변수들을 delegate로 전달해야함 public delegate void EventHandler(object sender, EventArgs e); public delegate void EventHandler(object sender, TEventArgs e); 1) 예시 1 - 리턴값이 없는 이벤트 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threadin.. 2023. 9. 23.
[C#][Study][기초다지기] 딜리게이트 event 함수 Event 함수 - event 함수 호출시 연결된 delegate를 이용해 Event Handler(이벤트 처리 함수)를 호출하는 기능 - event 키워드를 사용하여 생성 - Event Handler는 리턴형이 없어 항상 void로 반환함 - 모든 이벤트는 delegate를 기반으로 함 - 이벤트는 객체가 있어야 함 - 이벤트 처리 함수는 이름 앞에 보통 "On"으로 시작하게 함 [이벤트 동작 순서] 1) delegate 정의 2) delegate와 동일한 이름으로 이벤트를 정의 3) 이벤트 발생시 처리될 이벤트 처리 함수(Event Handler)를 정의 4) delegate를 위한 함수가 있어야 함 using System; using System.Collections.Generic; using Sy.. 2023. 9. 23.
[C#][Study][기초다지기] 딜리게이트 Multicast Delegate Multicast Delegate - delegate에 여러 함수를 연결해서 사용가능 - 여러 함수가 연결된 delegate 호출시 FIFO(First In First Out) 순으로 호출 - '+' 또는 '+=' 가 delegate에 함수를 추가할 때 사용 - '-' 또는 '-=' 은 delegate에서 함수를 제거할 때 사용 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Multicast_Delegates { class TestDeleGate { // 선언 public delegate void ShowMessage(strin.. 2023. 9. 23.
[C#][Study][기초다지기] 딜리게이트 Delegate Delegate - 메서드의 주소를 저장하고, 호출할 수 있음 - 내용을 가지지 않음 - 메서드를 캡슐화하기 때문에 안전하고, 객체지향적임 - 함수 포인터 - delegate와 delegate에 추가할 함수는 같은 리턴값을 가져야 함 [3가지 유형] 1) 매개변수가 없고, 리턴타입이 없는 유형 public delegate void TestDelegate(); 2) 매개변수를 가지고, 리턴타입이 없는 유형 public delegate void TestDelegate(object obj1, object obj2); 3) 매개변수와 리턴타입이 모두 있는 유형 public delegate int TestDelegate(object obj1, object obj2); [3가지 단계] 1) Declaration(선.. 2023. 9. 23.
[C#][Study][기초다지기] 봉인 클래스 sealed 봉인 클래스 - sealed - 봉인 클래스는 부모 클래스가 될 수 없음 -> 파생(상속) 방지(자식을 만들 수 없음을 의미) [ex] using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Sealed_Class { class Program { static void Main(string[] args) { SealedClass s = new SealedClass(); s.message(); Console.ReadKey(); } } public sealed class SealedClass { public void message() { Co.. 2023. 9. 23.