디자인 패턴

  • 싱글턴 패턴 (Singleton Pattern)
    • 싱글턴 패턴은 특정 클래스의 인스턴스가 하나만 존재하도록 보장합니다. 게임 내의 설정이나 데이터베이스 연결과 같이 하나만 있어야 하는 객체에 사용했습니다.
  • 전략 패턴 (Strategy Pattern)
    • 전략 패턴은 특정 작업을 처리하는 알고리즘 또는 전략을 런타임에 변경할 수 있게 합니다. 예를 들어, 카드 변경에 따른 공격 패턴 변화 등에 사용했습니다.
  • 옵저버 패턴 (Observer Pattern)
    • 옵저버 패턴은 하나의 객체가 변할 때, 그 객체를 "관찰"하고 있는 다른 객체들에게 알려주는 패턴입니다. 이런 식으로 객체 간에 한 쪽이 다른 쪽을 자동으로 업데이트 할 수 있게 합니다.
      UI를 처음 구성할 때 등에 사용했습니다.

객체지향

  • 캡슐화 (Encapsulation)
    • 캡슐화는 객체의 상태와 행동을 하나로 묶고, 실제 구현 내용을 외부에 숨기는 것입니다. 캡슐화를 통해 객체가 어떻게 작동하는지 알 필요 없이 어떻게 사용하는지만 알면 됩니다.
  • 상속 (Inheritance)
    • 상속은 기존의 클래스를 기반으로 새로운 클래스를 만들어서 코드를 재사용하거나 확장하는 것입니다. 몬스터 클래스를 여러가지로 분화해서 사용했습니다.
  • 다형성 (Polymorphism)
    • 다형성은 하나의 인터페이스나 클래스를 여러 가지 방식으로 동작하게 할 수 있습니다. 다형성을 통해 코드가 더 유연해지고 쉽게 확장할 수 있습니다. Virtual이 그 대표적 예로 몬스터의 공격을 다양하게 만드는 등에 사용했습니다.
  • 추상화 (Abstraction)
    • 추상화는 복잡한 시스템을 간단한 인터페이스로 단순화시키는 것입니다. 추상 클래스나 인터페이스를 사용해서 구현합니다. Abstract가 대표적 예로, 초기화가 있어야 하는 클래스에 Init등을 강제하거나 할 때 사용했습니다.

C#

  • C#에서 가비지 컬렉션은 어떻게 작동하나요?
    • .NET의 CLR(Common Language Runtime)이 자동으로 메모리 관리를 해주며, 사용되지 않는 객체를 찾아 메모리를 회수합니다.
  • LINQ란 무엇이고 어떻게 사용하나요?
    • LINQ(Language-Integrated Query)는 쿼리를 프로그래밍 언어에 통합시킨 것입니다. 이를 통해 SQL과 유사한 방법으로 데이터를 처리할 수 있어요.
  • C#에서 예외 처리는 어떻게 하나요?
    • try, catch, finally 블록을 사용하여 예외를 처리합니다.
  • 비동기 프로그래밍에 대해 설명해주세요.
    • async와 await 키워드를 사용해서 I/O 작업이나 복잡한 연산을 백그라운드에서 실행할 수 있게 해줍니다.

C# Event

  • 이벤트(Event)가 무엇인지 설명해 주세요.
    • 이벤트는 클래스나 객체가 특정 조건이나 상황이 발생했을 때 다른 클래스나 객체에게 알려주는 메커니즘입니다. 예를 들어, 버튼 클릭이나 키 입력 같은 UI 상호작용을 다룰 때 유용합니다.
  • C#에서 이벤트를 어떻게 선언하나요?
    • event 키워드를 사용해서 선언합니다. 대게 델리게이트 타입을 이용합니다. 예를 들어, public event EventHandler MyEvent;와 같이 선언할 수 있습니다.
  • 이벤트와 델리게이트의 차이점은 무엇인가요?
    • 델리게이트는 단순히 메서드를 가리키는 타입입니다. 반면 이벤트는 델리게이트를 기반으로 하되, 외부에서 무분별한 호출을 막을 수 있도록 캡슐화된 형태라고 할 수 있습니다.
  • 이벤트를 구독하고 해지하는 방법은?
    • += 연산자를 사용해 구독하고, -= 연산자를 사용해 해지할 수 있습니다. 예를 들어, MyEvent += new EventHandler(MyMethod);로 구독하고, MyEvent -= new EventHandler(MyMethod);로 해지합니다.
  • 이벤트에 여러 개의 리스너를 붙일 수 있나요?
    • 네, 가능합니다. 이벤트는 멀티캐스팅 델리게이트를 사용하기 때문에 여러 메서드가 동시에 이벤트를 구독할 수 있습니다.
  • 이벤트와 예외 처리는 어떻게 다른가요?
    • 이벤트는 일반적으로 예측 가능한 상황에서 사용되며, 예외 처리는 예측하지 못한 오류 상황을 다룰 때 사용됩니다. 이벤트는 명시적으로 구독과 해지를 관리해야 하지만, 예외 처리는 try-catch 블록을 사용해 자동으로 관리됩니다.
  • C#에서 EventArgs 클래스는 무엇이고 왜 사용하나요?
    • 답변: EventArgs는 이벤트 데이터를 전달하는 표준 클래스입니다. 이를 상속받아 커스텀 이벤트 데이터 클래스를 만들 수 있습니다. 이렇게 하면 이벤트가 발생했을 때 추가 정보를 전달할 수 있습니다.

C# SQL

  • ADO.NET이 무엇인가요?
    • ADO.NET은 .NET Framework에서 데이터베이스에 접근할 수 있도록 도와주는 라이브러리입니다. SQL Server, MySQL 등 다양한 데이터베이스에 접속할 수 있습니다.
  • Connection Pooling에 대해서 설명해주세요.
    • Connection Pooling은 데이터베이스 연결을 재사용하여 성능을 향상시키는 기술입니다. 연결을 미리 여러 개 생성해 두고, 필요할 때마다 풀에서 꺼내 씁니다.
  • C#에서 SQL Server에 연결하는 방법은?
    • SqlConnection 클래스를 사용해서 SQL Server에 연결할 수 있습니다. ConnectionString 속성에 데이터베이스 정보를 설정하고, Open 메서드로 연결을 엽니다.
  • SQL Injection이란 무엇이며 어떻게 예방하나요?
    • SQL Injection은 사용자 입력을 적절히 처리하지 않아 악의적인 SQL 쿼리가 실행되는 보안 취약점입니다. 이를 예방하기 위해 파라미터화된 쿼리나 Stored Procedure를 사용합니다.
  • LINQ to SQL에 대해 설명해주세요.
    • LINQ to SQL은 C#에서 SQL 데이터베이스에 LINQ 쿼리를 사용할 수 있게 해주는 ORM(Object-Relational Mapping) 도구입니다. 간편하게 데이터베이스에 접근할 수 있습니다.
  • 트랜잭션이 무엇이고 C#에서 어떻게 사용하나요?
    • 트랜잭션은 데이터베이스의 상태를 일관되게 유지하기 위한 작업 단위입니다. C#에서는 SqlTransaction 클래스를 사용해 트랜잭션을 구현할 수 있습니다.
  • DataReader와 DataSet의 차이점은 무엇인가요?
    • DataReader는 순방향 읽기 전용 커서를 제공해 빠른 데이터 접근이 가능하지만, 한 번에 하나의 테이블만 처리할 수 있습니다. DataSet은 메모리에 데이터를 캐시하여 여러 테이블을 동시에 다룰 수 있습니다.

C#으로 MySQL을 사용하는 법

  • C#에서 MySQL 데이터베이스에 연결하기 위해서는 대개 MySql.Data 라이브러리를 사용합니다. 이 라이브러리는 NuGet 패키지 매니저를 통해 쉽게 설치할 수 있습니다.
    1. 1. 라이브러리 설치: MySql.Data 패키지를 설치합니다.
    2. 2. 연결 문자열 설정: MySQL 서버에 연결 정보를 담은 연결 문자열을 설정합니다.
      string connectionString = "Server=localhost;Database=myDB;User ID=myUsername;Password=myPassword;Pooling=false;";
    3. 3. MySqlConnection 객체 생성: 연결 문자열을 이용해서 MySqlConnection 객체를 생성합니다.
      MySqlConnection connection = new MySqlConnection(connectionString);
    4. 4. 연결 열기: Open() 메서드를 사용해서 데이터베이스에 연결을 엽니다.
      connection.Open();
    5. 5. 쿼리 실행: 이후에는 MySqlCommand, MySqlDataReader 등을 사용해서 SQL 쿼리를 실행하고 결과를 처리합니다.
    6. 6. 연결 닫기: 작업이 끝나면 Close() 메서드를 사용해서 연결을 닫습니다.
      connection.Close();

C# 메모리 최적화

  • 가비지 컬렉션(Garbage Collection)이 무엇인가요?
    • 가비지 컬렉션은 .NET 런타임에서 자동으로 수행되는 메모리 관리 방법입니다. 사용되지 않는 객체를 자동으로 회수하여 메모리를 확보합니다.
  • 스택과 힙의 차이점은 무엇인가요?
    • 스택은 지역 변수와 메서드 호출 정보를 저장하고, LIFO(Last-In, First-Out) 방식으로 동작합니다. 힙은 동적으로 할당된 객체를 저장하고, 가비지 컬렉션에 의해 관리됩니다.
  • Dispose와 Finalize 메서드의 차이점은 무엇인가요?
    • Dispose는 개발자가 명시적으로 호출할 수 있는 메서드로, 자원을 즉시 해제합니다. Finalize는 가비지 컬렉터가 호출하며, 객체가 메모리에서 제거될 때 자원을 해제합니다.
  • C#에서 using 키워드의 역할은 무엇인가요?
    • using 키워드는 IDisposable 인터페이스를 구현한 객체의 Dispose 메서드를 자동으로 호출합니다. 이렇게 하면 자원을 효율적으로 해제할 수 있습니다.
  • 메모리 릭(Memory Leak)을 방지하기 위한 방법은?
    • 이벤트 핸들러를 적절히 해제하고, 사용하지 않는 객체에 대한 참조를 끊는 것이 중요합니다. 또, IDisposable을 구현하여 명시적으로 자원을 해제할 수 있습니다.
  • 값 타입과 참조 타입의 메모리 관리 차이점은?
    • 값 타입은 스택에 저장되고, 참조 타입은 힙에 저장됩니다. 값 타입은 스택 프레임이 사라질 때 자동으로 메모리가 해제되며, 참조 타입은 가비지 컬렉션에 의해 관리됩니다.
  • Weak Reference가 무엇이고 언제 사용하나요?
    • Weak Reference는 가비지 컬렉션의 대상이 될 수 있는 참조입니다. 객체가 더 이상 필요하지 않을 때 메모리를 쉽게 회수할 수 있도록 하기 위해 사용합니다.
  • Value Type과 Reference Type의 메모리 사용 방식을 설명해주세요.
    • Value Type은 스택에 저장되고, Reference Type은 힙에 저장됩니다. Value Type은 메모리 관리가 더 효율적이지만, 크기가 커지면 성능에 문제가 생길 수 있습니다.
  • C#에서의 메모리 누수를 방지하는 방법은?
    • IDisposable 인터페이스를 구현하여 관리되지 않는 리소스를 해제하거나, WeakReference를 사용해 참조를 유지하는 것이 좋습니다.
  • Stackalloc이 무엇이고 언제 사용하는지 설명해주세요.
    • Stackalloc은 스택에 메모리를 할당하는데 사용합니다. 주로 작은 배열이나 버퍼를 빠르게 할당할 때 사용합니다.
  • C#에서의 메모리 최적화 기법 중 하나를 들고 설명해주세요.
    • Object Pooling이 있습니다. 이 기법은 빈번히 생성과 해제가 이루어지는 객체를 미리 생성해 두고 재사용함으로써, 메모리 할당과 해제에 따른 오버헤드를 줄입니다.
  • 배열과 List의 메모리 사용에 대해서 설명해주세요.
    • 배열은 크기가 고정되어 있어 메모리 사용이 예측 가능하지만, List는 동적으로 크기가 변경되므로 내부적으로 배열을 다시 할당하는 과정이 있어 메모리 사용이 불안정할 수 있습니다.
  • C#에서 메모리 최적화 하는 법에 대해서 설명해주세요.
    • C#에서 메모리를 최적화하는 방법은 여러 가지가 있습니다.
    • 먼저, Garbage Collection에 의존하지 않고 IDisposable 인터페이스를 사용해서 관리되지 않는 리소스를 명시적으로 해제할 수 있습니다. 이렇게 하면 메모리 누수를 방지하고 성능을 개선할 수 있습니다.
    • 또한, 객체 풀링(Object Pooling)을 사용해서 빈번하게 생성과 해제가 발생하는 객체를 재사용할 수 있습니다. 이 방법은 메모리 할당과 해제에 따른 오버헤드를 줄이고 성능을 향상시킵니다.
    • Value Type과 Reference Type을 적절히 사용하는 것도 중요합니다. Value Type은 스택에 저장되므로 빠르게 접근 가능하지만, 크기가 커지면 문제가 될 수 있습니다. Reference Type은 힙에 저장되기 때문에 관리가 복잡할 수 있습니다.
    • Stackalloc이라는 키워드를 사용해서 스택에 메모리를 할당할 수도 있습니다. 이 방법은 작은 배열이나 데이터 구조를 빠르게 할당하고 해제하는 데 유용합니다.
    • 마지막으로, 불필요한 객체 생성을 피하는 것도 중요합니다. 예를 들어, 문자열 연산을 할 때 StringBuilder를 사용하거나, 컬렉션을 사용할 때 크기를 미리 할당하는 것이 효율적입니다.

자료구조

  • 배열과 연결 리스트의 차이점은 무엇인가요?
    • 배열은 메모리 상에서 연속적인 위치에 데이터를 저장하며, 빠른 접근이 가능합니다. 하지만 크기가 고정되어 있습니다. 연결 리스트는 각 노드가 포인터로 다음 노드를 가리키며, 동적 크기를 가집니다.
  • 스택과 큐의 차이점은 무엇인가요?
    • 스택은 LIFO(Last-In, First-Out) 방식으로 데이터를 저장하고, 큐는 FIFO(First-In, First-Out) 방식으로 데이터를 저장합니다.
  • 해시 테이블이란 무엇이고, 언제 사용하나요?
    • 해시 테이블은 키-값 쌍으로 데이터를 저장하며, 해시 함수를 통해 빠르게 데이터에 접근할 수 있습니다. 검색, 삽입, 삭제가 빠른 시간 안에 이루어져야 할 때 사용합니다.
  • 이진 트리와 이진 탐색 트리의 차이점은 무엇인가요?
    • 이진 트리는 각 노드가 최대 두 개의 자식 노드를 가지는 트리입니다. 이진 탐색 트리는 이진 트리의 일종이지만, 왼쪽 자식 노드는 부모 노드보다 작고, 오른쪽 자식 노드는 부모 노드보다 크다는 추가적인 조건이 있습니다.
  • 빅 오 표기법에 대해 설명해보세요.
    • 빅 오 표기법은 알고리즘의 성능을 평가하는 표기법입니다. 입력 크기에 따라 알고리즘의 시간 복잡도나 공간 복잡도를 나타냅니다.
  • 그래프와 트리의 차이점은 무엇인가요?
    • 그래프는 노드와 노드를 연결하는 간선으로 구성되며, 사이클이 있을 수 있습니다. 트리는 그래프의 한 종류로, 사이클이 없고, 루트 노드에서 시작해서 모든 노드가 정확히 하나의 부모 노드를 가집니다.
  • 동적 배열과 연결 리스트 중 어떤 것을 사용할지 어떻게 결정하나요?
    • 빠른 무작위 접근이 필요하면 동적 배열을, 삽입과 삭제가 빈번하고 순차적인 접근만 필요하다면 연결 리스트를 사용합니다.

 

블로그 이미지

RIsN

,