이 글에서는 C#에서 주어진 문자열의 앞쪽 절반과 뒤쪽 절반이 동일한 문자 집합을 포함하고 있는지 확인하는 방법을 알아봅니다. 예를 들어 문자열 timetime은 앞쪽 절반 time과 뒤쪽 절반 time이 같은 문자들로 구성되어 있으므로 결과는 참(true)이 됩니다.확인 절차먼저 검사할 문자열을 설정합니다.string s = timetime;그다음, 문자열의 두 절반에 등장한 각 알파벳 문자의 개수를 세기 위해 크기가 26인 정수 배열(카운터) 두 개를 준비합니다.int []one = new int[MAX_CHAR];int []t
C# string 키워드란? C#에서 string 키워드는 문자열 변수를 선언할 때 사용합니다. 이 키워드는 .NET의 System.String 클래스에 대한 별칭(alias)이므로, String 클래스 이름을 직접 사용하는 것과 완전히 동일하게 동작합니다. 다음은 string 변수를 선언하고 값을 할당하는 가장 기본적인 예제입니다. string name; name = Tom Hanks; 여러 문자열을 한 번에 담는 문자열 배열을 선언하는 예제도 살펴보겠습니다. string[] array = { Hello, From, Tuto
C#에서 열거형(Enum) 멤버끼리 비교하려면 Enum.CompareTo() 메서드를 사용합니다. 이 메서드는 현재 인스턴스와 지정한 객체를 비교하여, 현재 값이 더 크면 양수, 작으면 음수, 같으면 0을 반환합니다.열거형 정의하기먼저 학생들의 순위 값을 담은 열거형을 선언합니다.enum StudentRank { Tom = 3, Henry = 2, Amit = 1 };CompareTo() 메서드로 값 비교하기이제 compareTo() 메서드를 호출해 하나의 열거형 값을 다른 값과 비교합니다. 반환값이 0보다 큰지 검사하면 첫 번째
C#의 is 연산자는 객체의 런타임 타입이 특정 타입과 호환되는지 여부를 검사하는 데 사용됩니다. 즉, 해당 객체가 지정된 타입으로 변환 가능한지 확인하고, 그 결과를 true 또는 false로 반환합니다.is 연산자 기본 문법expr is type여기서 각 구성 요소는 다음과 같습니다.expr: 타입을 검사할 대상 표현식(객체)type: 호환 여부를 확인할 타입의 이름is 연산자는 조건이 성립하면 true, 그렇지 않으면 false를 반환하며, 주로 if 문과 함께 사용해 객체의 실제 타입을 안전하게 판별한 뒤 형 변환(casti
접근 지정자(Access Specifier)는 클래스 멤버인 변수와 함수의 범위(scope)와 가시성(visibility)을 정의하는 데 사용됩니다. 즉, 어떤 멤버를 외부에 공개하고 어떤 멤버를 숨길지 결정함으로써 코드의 보안성과 캡슐화를 높일 수 있습니다.C#에서는 다음과 같은 다섯 가지 접근 지정자를 지원합니다.PublicPrivateProtectedInternalProtected Internal지금부터 각 접근 지정자가 어떻게 동작하는지 하나씩 자세히 살펴보겠습니다.1. Public 접근 지정자Public은 클래스가 자신의
나누는 수가 2의 거듭제곱일 때는 비트 AND 연산자 &를 활용하면 일반적인 나머지 연산자 %보다 훨씬 빠르게 모듈로(나머지) 값을 구할 수 있습니다.핵심 원리나누는 수가 2의 n제곱이라면, 피제수에서 하위 n비트만 남기면 그 값이 곧 나머지가 됩니다. 이를 수식으로 표현하면 다음과 같습니다.a % b == a & (b - 1) // 단, b는 반드시 2의 거듭제곱이어야 함예를 들어 8은 2³이므로, 어떤 수를 8로 나눈 나머지는 해당 수와 7(즉 8−1)을 비트 AND 연산한 결과와 동일합니다. 이 방법은 나눗셈
C#에서는 System.IO.Compression 네임스페이스를 활용하여 파일을 손쉽게 압축하고 압축 해제할 수 있습니다. 이 글에서는 GZipStream 클래스와 FileStream 클래스를 함께 사용하는 방법을 예제 코드와 함께 자세히 살펴보겠습니다.파일 압축하기 (Compress)파일을 ZIP 형식으로 압축하려면 GZipStream 클래스와 FileStream 클래스를 함께 사용합니다. 이때 설정해야 할 매개변수는 다음과 같습니다.압축할 원본 파일출력될 압축 파일의 이름아래 예제에서 outputFile은 결과로 생성되는 출력
C#에서는 const, static, readonly 세 가지 키워드를 통해 변수와 멤버의 동작 방식을 제어할 수 있습니다. 세 키워드는 모두 변경 제한과 관련이 있어 초보 개발자들이 자주 혼동하지만, 실제로는 값이 할당되는 시점과 적용 범위가 서로 다릅니다. 이 글에서는 각 키워드의 개념과 특징을 예제 코드와 함께 살펴보겠습니다. 1. C# const란? const(상수) 키워드로 선언된 필드는 한 번 값이 정해지면 프로그램 실행 중 절대 수정할 수 없는 필드입니다. 반드시 선언과 동시에 값을 할당해야 하며, 그 값은 컴파일 타
C#에서 예외(Exception)는 클래스 형태로 표현됩니다. C#의 예외 클래스들은 대부분 System.Exception 클래스를 기반으로 직접 또는 간접적으로 상속받아 구성되어 있습니다. System.Exception 클래스에서 파생된 대표적인 예외 클래스로는 System.ApplicationException과 System.SystemException이 있습니다.System.DivideByZeroException은 숫자를 0으로 나눌 때 발생하는 오류를 처리하는 클래스입니다. 정수형 나눗셈에서 나누는 수가 0이면 런타임에 이 예
C# 비동기 프로그래밍이란?C#의 비동기(Asynchronous) 프로그래밍은 작업이 차단되거나 접근이 지연되는 상황을 효율적으로 처리할 수 있는 방식입니다. 동기(Synchronous) 방식에서는 특정 작업이 차단되면 애플리케이션 전체가 해당 작업이 끝날 때까지 대기해야 하므로 실행 시간이 길어지고, 최악의 경우 프로그램이 응답하지 않는 상태에 빠질 수 있습니다. 반면 비동기 방식을 사용하면 대기 중인 작업과 무관하게 애플리케이션이 다른 작업을 계속 수행할 수 있습니다.동기 처리 시 발생하는 문제GUI를 갖춘 애플리케이션에서 큐(
C#에서 동적 바인딩(Dynamic Binding)이란 컴파일러가 컴파일 시점에 타입 검사를 수행하지 않고, 대신 프로그램이 실행되는 런타임(Runtime)에 타입 검사를 진행하는 방식을 의미합니다.동적 바인딩이 필요한 이유동적 바인딩은 익명 타입(Anonymous Type)이 하나의 메서드 안에서만 사용 가능하다는 제약을 우회할 때 특히 유용합니다. 익명 타입의 이름은 컴파일러에게만 노출되기 때문에, 일반적인 방식으로는 해당 타입을 메서드의 반환 값으로 선언할 수 없습니다. 하지만 반환 타입을 dynamic으로 지정하면 이 문제를
C#의 SortedList 클래스에서 Keys 속성을 사용하면 컬렉션에 저장된 모든 키를 쉽게 가져올 수 있습니다. Keys 속성은 SortedList에 포함된 키들을 담고 있는 ICollection 객체를 반환하며, 반복문과 함께 활용하면 각 키를 순차적으로 처리할 수 있습니다.SortedList에 요소 추가하기먼저 SortedList 객체를 생성하고 Add 메서드를 통해 여러 개의 키-값 쌍을 추가합니다. SortedList는 키를 기준으로 자동 정렬되므로, 추가한 순서와 관계없이 키가 정렬된 상태로 저장됩니다.SortedLis
C#에서 비동기 작업을 시작하는 방법은 여러 가지가 있습니다. 상황과 코드 스타일에 따라 적합한 방식을 선택하면 되는데요, 이 글에서는 대표적인 세 가지 방법을 예제 코드와 함께 소개합니다. 1. 델리게이트(Delegate)를 사용하여 작업 시작하기 가장 전통적인 방식으로, Task 객체를 생성할 때 델리게이트를 전달한 후 Start() 메서드를 호출하는 방법입니다. Task t = new Task(delegate { PrintMessage(); }); t.Start(); 이 방식은 작업 생성과 실행 시점을 명확하게 분리하고
C# 예외 전파란 무엇인가?예외 전파(Exception Propagation)는 C#에서 예외 처리 메커니즘이 동작하는 방식을 통해 쉽게 이해할 수 있습니다.try 블록 안에서 예외가 발생하면, 해당 try 블록에 연결된 catch 블록들이 차례대로 검사됩니다. 이는 발생한 예외를 처리할 수 있는 catch 블록이 존재하는지 확인하기 위함입니다. 만약 일치하는 catch 블록을 찾지 못하면, 예외는 상위(외부) try 블록으로 전파됩니다. 이 과정은 예외가 어딘가에서 처리될 때까지 계속 반복되며, 끝내 예외가 처리되지 않으면 프로그
C#에서 딕셔너리(Dictionary)는 키(Key)와 값(Value)의 쌍으로 데이터를 저장하는 대표적인 컬렉션입니다. Dictionary<TKey, TValue>는 제네릭 타입으로 선언되며, System.Collections.Generic 네임스페이스에 포함되어 있어 별도의 형 변환 없이 안전하게 사용할 수 있습니다.키는 중복될 수 없으며, 각 키는 하나의 값과 매핑됩니다. 이러한 특성 덕분에 빠른 조회 성능이 필요한 상황에서 딕셔너리가 자주 활용됩니다.C# 딕셔너리의 주요 메서드 및 속성번호메서드 및 설명1Add딕셔
연결 리스트 생성 및 요소 추가먼저 연결 리스트(Linked List)를 생성하고 몇 가지 요소를 추가합니다.Demo list = new Demo(); list.Push(50); list.Push(100); list.Push(150);이제 헤드 노드(head node)에서 n번째 요소를 삭제하려면, 삭제하고자 하는 위치 값을 매개변수로 전달하면 됩니다. 예를 들어 값으로 1을 전달하면 헤드 노드 자체가 삭제됩니다.예제 코드if (val == 1) { head = head.Next; re
C#에서 코드를 디버깅하려면 다양한 메서드와 속성이 필요합니다. 이러한 기능은 Debug 클래스를 통해 제공되며, Debugger 클래스는 디버거와의 통신을 설정하는 데 사용됩니다. 두 클래스는 이름이 비슷하지만 역할과 용도가 명확히 다릅니다. 이 글에서는 각 클래스의 특징과 주요 속성을 자세히 살펴보겠습니다. Debug 클래스란? Debug 클래스는 System.Diagnostics 네임스페이스에 속하는 정적(static) 클래스로, 코드 디버깅에 필요한 다양한 메서드와 속성을 제공합니다. 선언 구문은 다음과 같습니다. publi
의존성 주입(Dependency Injection)이란?C#에서 의존성 주입(Dependency Injection, DI)은 느슨하게 결합된(loosely coupled) 코드를 개발하기 위해 도입된 핵심 디자인 패턴입니다. 느슨하게 결합된 코드는 유지보수가 쉽고 재사용성이 뛰어나며, 대규모 애플리케이션 개발에서 특히 큰 효과를 발휘합니다.의존성 주입을 활용하면 클래스 내부에서 직접 의존 객체를 생성하는 대신 외부에서 필요한 객체를 전달받기 때문에, 단위 테스트 작성이 쉬워지고 모듈 간 독립성도 크게 향상됩니다.C#에서 사용할 수
C# 정규식 수량자(Quantifier)란?C# 정규식에서 수량자(quantifier)는 앞의 요소(문자, 그룹 또는 문자 클래스)가 입력 문자열에서 몇 번 나타나야 일치(match)로 인정되는지를 지정하는 메타 문자입니다. 수량자를 활용하면 반복되는 패턴을 간결하고 효율적으로 표현할 수 있습니다.기본 수량자아래 표는 C# 정규식에서 가장 널리 사용되는 기본 수량자들을 정리한 것입니다.수량자설명패턴일치 결과*이전 요소와 0번 이상 일치합니다.\d*\.\d.0, 19.9, 219.9+이전 요소와 1번 이상 일치합니다.be+been의
C#에서 var와 dynamic의 핵심 차이점 C#에는 var와 dynamic이라는 두 가지 변수 선언 방식이 있습니다. 두 키워드는 비슷해 보이지만 동작 방식이 완전히 다릅니다. 가장 큰 차이점은 var는 엄격한 타입 검사(정적 타입)를 수행하는 반면, dynamic은 엄격한 타입 검사를 수행하지 않는다는 점입니다. var 선언 방법 var a = 10; var로 선언된 변수는 암시적 타이핑(implicitly typed) 변수입니다. 컴파일러가 초기화 값을 기준으로 타입을 자동으로 추론합니다. 위 예제에서 변수 a는 정수(