STUDY/C#에 해당하는 글 6

특정 키워드 모음

STUDY/C#|2024. 7. 7. 23:22
  • Abstarct

추상 클래스나 추상 메서드를 정의할 때 사용되며 구현이 없는 메서드로, 이를 상속하는 클래스에서 부족한 구현을 반드시 수행해야한다. 추상 멤버 또한 반드시 구현되어야 하며 직접 인스턴스화될 수 없다.

  • Virtual

virtual 키워드는 메서드, 속성, 인덱서를 재정의할 수 있다.

virtual로 선언된 멤버는 파생 클래스에서 override 키워드를 사용하여 필요에 따라 재정의 할 수 있다.

  • Record

record 키워드는 C# 9.0에서 도입된 새로운 타입으로, 불변 객체(내부를 변경할 수 없는)를 말한다.

기본적으로 불변 객체를 생성하며, with 키워드를 사용하여 일부 속성만 변경된 새 인스턴스를 쉽게 만들 수 있다.

주로 데이터 복사와 비교가 많이 이루어진다.

Person person3 = person1 with { LastName = "Smith" };
Console.WriteLine(person3);

// Output: Person { FirstName = John, LastName = Smith }
  • Event

event 키워드는 이벤트를 선언할 때 사용되며 특정 작업이 발생할 때 알림을 받기 위한 메커니즘으로, 주로 델리게이트와 함께 사용된다.

delegate void EventHandler(string message);

class
{
	public event EventHandler SomethingHappened;
------------------------------------------------

'STUDY > C#' 카테고리의 다른 글

대리자(Delegate)  (0) 2024.07.07
메소드(Method)  (0) 2024.07.07
Null 조건부, 병합 연산자  (0) 2023.02.20
C# Nullable Type  (0) 2023.02.20
c# winform 드래그앤드롭  (0) 2022.07.25

댓글()

대리자(Delegate)

STUDY/C#|2024. 7. 7. 21:40
콜백을 맡아 실행하는 일을 담당
c++의 함수 포인터와 유사

 

한정자 delegate 반환_형식 대리자_이름( 매개변수_목록 );

 

예시

delegate int MyDelegate( int a, int b);

 

대리자는 왜 사용하는 것일까?

대리자를 사용하는 것은 매개변수로 함수를 넘기거나 '대리자 체인'을 통하여 일련의 과정을 연달아 호출할 수 있다.

 

대리자 체인은 여러 개의 콜백을 차례로 호출이 필요할 때 사용할 수 있다.

delegate void dMethodChain(string str);

void chain1(string str) { Console.WriteLine("1"); }
void chain2(string str) { Console.WriteLine("2"); }
void chain3(string str) { Console.WriteLine("3"); }

---------------------------------------------------

dMethodChain chain = new dMethodChain(chain1);
chain += new dMethodChain(chain2);
chain += new dMethodChain(chain3);

결과는 1, 2, 3 전부 출력이 된다.

 

대리자에 += 연산자를 통하여 추가가 되지만 -= 연산자를 통하여 체인을 끊을 수 있다.

이와 관련해서는 Delegate.Combine, Delegate.Remove 또한 존재한다.

 

대리자에는 익명 메서드와 연결하면 더욱 편리하게 사용이 가능하다.

Calc = delegate( int a, int b ) { return a + b };

Console.WriteLine( $" 1 + 2 = {Calc(1, 2)}");

 

'STUDY > C#' 카테고리의 다른 글

특정 키워드 모음  (0) 2024.07.07
메소드(Method)  (0) 2024.07.07
Null 조건부, 병합 연산자  (0) 2023.02.20
C# Nullable Type  (0) 2023.02.20
c# winform 드래그앤드롭  (0) 2022.07.25

댓글()

메소드(Method)

STUDY/C#|2024. 7. 7. 19:20
메소드(Method)란 객체지향 프로그래밍 언어에서 사용하는 용어
언어에 따라 함수(Function), 프로시저(Procedure), 서브루틴(Subroutine), 서브 프로그램(Subprogram)으로 불림

 

메소드는 클래스 안에 선언되며 여러 응용이 가능하다.

(한정자) (반환_형식) (메소드_이름) (매개변수_목록)
{
  //코드
}

 

한정자에는 public, internal, protected, private, internal 등이 존재하며 각 한정자마다 접근이 제한된다.

접근 한정자 설명
public 클래스 내/외부 접근 가능
protected 클래스 외부 접근 X, 파생 클래스(상속) 접근 가능
private 클래스 내부 O, 외부 X
internal 같은 어셈블리 코드에서만 public 접근 가능, 쉽게 말해 같은 프로젝트에서 접근 O
protected internal 같은 어셈블리에 코드 수준에서 protected 수준으로 접근 가능, 다른 프로젝트 private
private protected 같은 어셈블리에 있는 ㅅ클래스에서 상속받은 클래스 내부에서만 접근 O

 

반환형식에는 함수가 끝나고 반환하고자 하는 타입을 작성하며 반드시 return을 사용하여 해당 한정자의 타입으로 결과를 출력해야한다.

 

하나의 메소드 안에서 같은 메소드를 호출하는 것을 '재귀 호출'이라 부르며 코드를 줄일 수 있으나 무한 반복이 될 수 있어 주의해서 사용해야 한다.

private int Fibonacci(int n)
{
    if (n < 2)
    	reutrn n;
    else
    	return Fibonacci(n - 1) + Fibonacci(n - 2);
}

 

매개변수는 기본적으로 '값에 의한 전달(pass by value)가 이루어진다.

그러므로 매개변수로 값을 전달한 것은 메소드 안에서 어떠한 형태로든 값이 변경되어도 메소드 외부에는 영향을 주지 않는다. 하지만 매개변수를 참조(C++ &, C# ref, out) 형태로 전달 시에는 메소드 내부에서 변경된 값이 '참조의 의한 전달(pass by reference)가 이루어지며 메소드에 넘겨진 원본 변수에 영향을 끼치게 된다.

 

메소드의 이름은 같으나 매개변수를 다르게 선언하는 것을 메소드 오버로딩 이라 한다. 메소드 오버로딩은 컴파일 타임에 이루어지므로 성능 저하의 걱정은 하지 않아도 된다.

 

매개변수에 여러 변수를 넣고자 할때는 param 키워드를 사용하면 된다.

public int Sum(params int[] args)
{
    int sum = 0;
    for (int i = 0; i < args.Length; ++i)
    {
    	sum +- args[i];
    }
    
    return sum;
}

'메소드 오버로딩'을 같은 변수로 해야하는 상황이 있다면 param 키워드를 사용하여 짜는 것이 효율적일 수 있다.

 

만약 매개변수에 인자가 있을 때도 있고 없을 때도 있다면 선택적 인수를 사용하는 방법이 있다.

void Sum (int a, int b, int c = 0)
{
    sum += a + b + c;
}

다음과 같이 매개변수에 값을 미리 지정하여 사용이 가능하다.

 

'STUDY > C#' 카테고리의 다른 글

특정 키워드 모음  (0) 2024.07.07
대리자(Delegate)  (0) 2024.07.07
Null 조건부, 병합 연산자  (0) 2023.02.20
C# Nullable Type  (0) 2023.02.20
c# winform 드래그앤드롭  (0) 2022.07.25

댓글()

Null 조건부, 병합 연산자

STUDY/C#|2023. 2. 20. 19:54

조건 연산자

조건 연산자는 조건식이 참이면 참일때의 값 거짓이면 거짓의 값을 반환하는 연산자입니다.
조건식 ? 참일때의 값 : 거짓일때의 값

 

int test = 30;
string result;
if (test == 30)
{
	result = "삼십 O";
}
else
{
	result = "삼십 X";
}

조건 연산자를 사용 시 코드를 간결하게 표현 가능합니다.

int test = 30;
int result = test == 30 ? "삼십 O" : "삼십 X";

null 조건부 연산자

'?.' null 조건부 연산자는 해당 객체가 null 이면 null 반환 null이 아니라면 .뒤에 지정된 멤버를 반환합니다.

null 병합 연산자

Null 병합 연산자는 ??로 표기되며 프로그램에서 종종 필요한 변수/객체의 null 검사를 간결하게 만들어주는 역할을 합니다.
  int? a = null;
var test = a ?? 100; // test == null
test = a ??= 100;   //test == 100 (C# 8.0 이상 사용 가능)

 

'STUDY > C#' 카테고리의 다른 글

특정 키워드 모음  (0) 2024.07.07
대리자(Delegate)  (0) 2024.07.07
메소드(Method)  (0) 2024.07.07
C# Nullable Type  (0) 2023.02.20
c# winform 드래그앤드롭  (0) 2022.07.25

댓글()

C# Nullable Type

STUDY/C#|2023. 2. 20. 19:34
Nullable Type이란 Null을 가질 수 없는 데이터 타입을 Null을 가질 수 있는 타입으로 만든 새로운 구조체입니다.
int? a = null;
float? b = null;
double? c = null;

int와 같은 변수는 비워둘 수 없는 데이터 형식이지만

?을 붙임으로써 nullable 형식 변수가 되어 null을 가질 수 있게 됩니다.

 

Nullable 변수의 값이 있는지 확인하기 위해서는 아래와 같이 HasValue를 사용하여 확인이 가능합니다.

int? a = null;

if(a.HasValue == false)
{
	Console.WriteLine("a는 null입니다");
}
else
{
	Console.WriteLine("a는 null이 아닙니다");
}

 

'STUDY > C#' 카테고리의 다른 글

특정 키워드 모음  (0) 2024.07.07
대리자(Delegate)  (0) 2024.07.07
메소드(Method)  (0) 2024.07.07
Null 조건부, 병합 연산자  (0) 2023.02.20
c# winform 드래그앤드롭  (0) 2022.07.25

댓글()

c# winform 드래그앤드롭

STUDY/C#|2022. 7. 25. 00:28
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_DragDrop(object sender, DragEventArgs e)
    {
        if (e.Data.GetDataPresent(DataFormats.FileDrop))
        {
            try
            {
                var directoryName = (string[])e.Data.GetData(DataFormats.FileDrop);
                var temp = e.Data.GetDataPresent(DataFormats.FileDrop);

                Text = directoryName[0].Substring(directoryName[0].LastIndexOf('\\') + 1);
                this.textBox1.Clear();
                this.textBox1.Text = directoryName[0].ToString();
            }
            catch (System.Exception a)
            {
                MessageBox.Show(a.Message);
            }
        }
    }

    private void Form1_QueryContinueDrag(object sender, QueryContinueDragEventArgs e)
    {
        if (e.EscapePressed)
        {
            e.Action = DragAction.Cancel;
        }
    }

    private void Form1_DragEnter(object sender, DragEventArgs e)
    {
        DragDropEffects effects = DragDropEffects.None;
        if (e.Data.GetDataPresent(DataFormats.FileDrop))
        {
            var path = ((string[])e.Data.GetData(DataFormats.FileDrop))[0];
            if (Directory.Exists(path))
                effects = DragDropEffects.Copy;
        }

        e.Effect = effects;
    }
}

'STUDY > C#' 카테고리의 다른 글

특정 키워드 모음  (0) 2024.07.07
대리자(Delegate)  (0) 2024.07.07
메소드(Method)  (0) 2024.07.07
Null 조건부, 병합 연산자  (0) 2023.02.20
C# Nullable Type  (0) 2023.02.20

댓글()