2023/08/16 TIL

김도현·2023년 8월 16일
0

TIL

목록 보기
21/76

들어가기 앞서

[스파르타코딩클럽] C# 문법 종합반 - 3주차

오늘 배운 것

프로퍼티

  • get, set

프로퍼티란?

  • 프로퍼티는 클래스 맴버로서, 객체의 필드 값을 읽거나 설정하는데 사용되는 접근자(Accessor)메서드의 조합
  • 객체의 필드에 직접 접근하지 않고, 간접적으로 값을 설정하거나 읽을 수 있도록 합니다.
  • 필드에 대한 접근 제어와 데이터 유효성 검사 등을 수행할 수 있습니다.
  • 프로퍼티는 필드와 마찬가지로 객체의 상태를 나타내는 데이터 역할을 하지만, 외부에서 접근할 때 추가적인 로직을 수행할 수 있습니다.

get, set

get만 하면 읽기전용 변수가 됨
반대로 set만 선언하면 저장전용 변수가 됨

사용 이유

무결성을 유지하여 정보를 은닉하기 위해서

[접근 제한자] [데이터 타입] 프로퍼티명
{
    get
    {
        // 필드를 반환하거나 다른 로직 수행
    }
    set
    {
        // 필드에 값을 설정하거나 다른 로직 수행
    }
}

사용 예시

class Human
{
	private string name;
    
    public string Name
    {
    	get { return name; }
        set { name = value; }
    }
}

자동 프로퍼티(Auto Property)

  • 자동 프로퍼티는 프로퍼티를 간단하게 정의하고 사용할 수 있는 편리한 기능입니다.
  • 필드의 선언과 접근자 메서드의 구현을 컴파일러가 자동으로 처리하여 개발자가 간단한 구문으로 프로퍼티를 정의할 수 있습니다.
class Person
{
    public string Name { get; set; }

}

다형성

  • 오버라이딩
  • 오버로딩
  • virtual

오버라이딩(Overriding)

  • 부모 클래스에서 이미 정의된 메서드를 자식 클래스에서 재정의하는 것을 의미합니다.
  • 이는 상속 관계에 있는 클래스 간에 발생하며, 메서드의 이름, 매개변수 및 반환타입이 동일해야 합니다.
  • 오버라이딩을 통해 자식 클래스는 부모 클래스의 메서드를 재정의하여 자신에게 맞는 동작을 구현할 수 있습니다.

오버로딩(Overloading)

  • 동일한 메서드 이름을 가지고 있지만, 매개변수의 개수, 타입 또는 순서가 다른 여러 개의 메서드를 정의하는 것을 의미합니다.
  • 오버로딩을 통해 동일한 이름을 가진 메서드를 다양한 매개변수 조합으로 호출할 수 있습니다.

우리가 자주 쓰는 Console.WriteLine();도 여러개의 오버로딩이 되어 있습니다.

virtual

접근자와 반환타입 사이에 선언
예시

public class Unit
{
    public virtual void Move()
    {
        Console.WriteLine("두발로 걷기");
    }

    public void Attack()
    {
        Console.WriteLine("Unit 공격");
    }
}

public class Marine : Unit
{

}

public class Zergling : Unit
{
    public override void Move()
    {
        Console.WriteLine("네발로 걷기");
    }
}

추상클래스

  • 추상 클래스는 직접적으로 인스턴스를 생성할 수 없는 클래스
  • 주로 상속을 위한 베이스 클래스로 사용됩니다.
  • 추상 클래스는 abstract 키워드를 사용하여 선언되며, 추상 메서드를 포함할 수 있습니다.
  • 추상 메서드는 구현부가 없는 메서드로, 자식 클래스에서 반드시 구현되어야 합니다.
    예시
abstract class Shape
{
    public abstract void Draw();
}

class Circle : Shape
{
    public override void Draw()
    {
        Console.WriteLine("Drawing a circle");
    }
}

class Square : Shape
{
    public override void Draw()
    {
        Console.WriteLine("Drawing a square");
    }
}

class Triangle : Shape
{
    public override void Draw()
    {
        Console.WriteLine("Drawing a triangle");
    }
}

제너릭

  • 제너릭은 클래스나 메서드를 일반화시켜 다양한 자료형에 대응할 수 있는 기능입니다.
  • 제너릭을 사용하면 코드의 재사용성을 높일 수 있습니다.
  • C#에서는 <T> 형태의 키워드를 이용하여 제너릭을 선언합니다.
  • 제너릭 클래스나 메서드에서 사용할 자료형은 선언 시점이 아닌 사용 시점에 결정됩니다.
  • 제너릭 클래스나 메서드를 사용할 때는 <T> 대신 구체적인 자료형을 넣어줍니다.
    예시
- 제너릭은 클래스나 메서드를 일반화시켜 다양한 자료형에 대응할 수 있는 기능입니다.
- 제너릭을 사용하면 코드의 재사용성을 높일 수 있습니다.
- C#에서는 **`<T>`** 형태의 키워드를 이용하여 제너릭을 선언합니다.
- 제너릭 클래스나 메서드에서 사용할 자료형은 선언 시점이 아닌 사용 시점에 결정됩니다.
- 제너릭 클래스나 메서드를 사용할 때는 **`<T>`** 대신 구체적인 자료형을 넣어줍니다.

out & ref

  • out, ref 키워드는 메서드에서 매개변수를 전달할 때 사용합니다.
  • out 키워드는 메서드에서 반환 값을 매개변수로 전달하는 경우에 사용합니다.
  • ref 키워드는 메서드에서 매개변수를 수정하여 원래 값에 영향을 주는 경우에 사용합니다.
  • out, ref 키워드를 사용하면 메서드에서 값을 반환하는 것이 아니라, 매개변수를 이용하여 값을 전달할 수 있습니다.
// out 키워드 사용 예시
void Divide(int a, int b, out int quotient, out int remainder)
{
    quotient = a / b;
    remainder = a % b;
}

int quotient, remainder;
Divide(7, 3, out quotient, out remainder);
Console.WriteLine($"{quotient}, {remainder}"); // 출력 결과: 2, 1

// ref 키워드 사용 예시
void Swap(ref int a, ref int b)
{
    int temp = a;
    a = b;
    b = temp;
}

int x = 1, y = 2;
Swap(ref x, ref y);
Console.WriteLine($"{x}, {y}"); // 출력 결과: 2, 1

주의사항

  1. 값의 변경 가능성:
    ref 매개변수를 사용하면 메서드 내에서 해당 변수의 값을 직접 변경할 수 있습니다. 이는 예기치 않은 동작을 초래할 수 있으므로 주의가 필요합니다.
  2. 성능 이슈:
    ref 매개변수는 값에 대한 복사 없이 메서드 내에서 직접 접근할 수 있기 때문에 성능상 이점이 있습니다. 그러나 너무 많은 매개변수를 ref로 전달하면 코드의 가독성이 떨어지고 유지보수가 어려워질 수 있습니다. 적절한 상황에서 ref를 사용하는 것이 좋습니다.
  3. 변수 변경 여부 주의:
    out 매개변수는 메서드 내에서 반드시 값을 할당해야 합니다. 따라서 out 매개변수를 전달할 때 해당 변수의 이전 값이 유지되지 않으므로 주의해야 합니다.

기억 할 것 & 진행 사항

ConsoleKeyInfo

사용법

ConsoleKeyInfo 객체이름;

용도

이렇게 선언한 객체에 입력한 키를 넣을 수 있다
예시

ConsoleKeyInfo 객체이름;
cki = Console.ReadKey(true);
 switch (cki.Key)
 {
     case ConsoleKey.LeftArrow:
         {
             headDirection = 3;
             break;
         }
     case ConsoleKey.RightArrow:
         {
             headDirection = 4;
             break;
         }
     case ConsoleKey.UpArrow:
         {
             headDirection = 1;
             break;
         }
     case ConsoleKey.DownArrow:
         {
             headDirection = 2;
             break;
         }
 }

Console.KeyAvailable

콘솔 입력을 감지
예시

while (Console.KeyAvailable == false)
{
	내용
}

콘솔에 입력이 없으면 해당 내용을 실행

ConcurrentQueue

Queue보다 안전한 Queue

값 추출

객체명.TryDequeue(out 변수); // 반환 bool

값 확인

객체명.TryPeek(out result);

값 입력

객체명.Enqueue();

게임에 구현한다면?

ConcurrentQueue를 이용해 스네이크 게임 구현하기

내일 할 일

금일 완성 못한 3주차 숙제 - 스네이크 게임 및 블랙잭 만들기

0개의 댓글