2의 거듭제곱(Power of 2)이란 정수 n에 대해 2n 형태로 표현되는 수를 말합니다. 즉, 밑을 2로 하고 지수를 정수 n으로 하는 거듭제곱 연산의 결과값입니다.대표적인 2의 거듭제곱 값은 아래 표와 같습니다.n2n01122438416532방법 1: 비트 연산 활용 (가장 효율적)2의 거듭제곱은 이진수로 표현했을 때 단 하나의 비트만 1이 된다는 특징이 있습니다. 예를 들어 8은 이진수로 1000이며, 여기서 1을 빼면 0111이 됩니다. 두 수를 비트 AND 연산하면 항상 0이 나옵니다.따라서 (x & (x - 1)
C#에서 DateTime 객체를 문자열로 변환할 때 YYYYMMDDHHMMSS와 같은 특정 형식이 필요한 경우가 자주 있습니다. 예를 들어 파일명 생성, 로그 기록, 데이터베이스 저장 등에서 날짜와 시간을 구분자 없이 하나의 문자열로 표현해야 할 때 유용합니다.이러한 변환은 ToString() 메서드에 사용자 지정 날짜 및 시간 서식 지정자를 전달하는 것만으로 간단히 처리할 수 있습니다.기본 변환 방법DateTime 값을 YYYYMMDDHHMMSS 형식으로 변환하려면 아래와 같이 서식 문자열 yyyyMMddHHmmss를 사용합니다.
C#에서 폴더(디렉터리)를 생성하려면 먼저 System.IO 네임스페이스를 프로젝트에 추가해야 합니다. 이 네임스페이스는 폴더를 생성, 복사, 이동, 삭제할 수 있는 정적 메서드들을 제공하는 라이브러리입니다.또한 C#에서 파일이나 폴더 관련 작업을 수행하기 전에는 반드시 해당 디렉터리가 존재하는지 먼저 확인하는 것이 좋습니다. 대상 폴더가 존재하지 않으면 컴파일러가 예외(Exception)를 발생시키기 때문입니다.기본 예제using System; using System.IO; namespace DemoApplication {
C#에서 어떤 문자열이 유효한 숫자인지 판별하려면 int.TryParse 또는 int.Parse 메서드를 사용하면 됩니다. 두 메서드의 핵심 차이는 변환에 실패했을 때의 동작입니다. int.Parse는 문자열을 정수로 변환하지 못하면 즉시 FormatException 예외를 발생시키는 반면, int.TryParse는 예외를 던지지 않고 대신 변환 성공 여부를 bool 값으로 반환합니다. 또한 int.TryParse는 out 매개변수를 통해 변환된 정수 값을 함께 돌려주기 때문에, 사용자 입력 검증처럼 변환 실패 가능성이 있는 상황에
델리게이트(delegate)는 특정 매개변수 목록과 반환 타입을 가진 메서드에 대한 참조를 나타내는 타입입니다. 델리게이트를 인스턴스화하면, 호환되는 시그니처와 반환 타입을 가진 어떤 메서드든 해당 인스턴스와 연결할 수 있으며, 델리게이트 인스턴스를 통해 그 메서드를 호출할 수 있습니다.Func 델리게이트란?Func는 System 네임스페이스에 포함된 제네릭 델리게이트입니다. 0개 이상의 입력 매개변수와 하나의 출력(반환) 매개변수를 가지며, 항상 마지막 매개변수가 출력 매개변수로 간주됩니다. 즉, Func 델리게이트는 최대 16개
스트림(Stream)은 모든 스트림의 추상 기본 클래스로, 바이트 시퀀스에 대한 일반적인 뷰를 제공합니다. 스트림 객체는 읽기(Reading), 쓰기(Writing), 탐색(Seeking)이라는 세 가지 기본 작업을 수행할 수 있습니다. 또한 스트림은 재설정(reset)이 가능하기 때문에 성능 향상에도 도움이 됩니다.C#에서는 MemoryStream 클래스를 사용하면 바이트 배열을 아주 간단하게 메모리 스트림으로 변환할 수 있습니다. MemoryStream 생성자에 바이트 배열을 인자로 전달하기만 하면 됩니다.MemoryStream
단위 테스트(Unit Test)를 작성할 때 메서드가 의도한 대로 예외를 던지는지 검증해야 하는 경우가 자주 있습니다. C#의 MSTest 프레임워크에서는 예외를 확인할 수 있는 방법이 크게 두 가지 있습니다.Assert.ThrowsException 사용[ExpectedException] 특성(Attribute) 사용테스트 대상 코드 예제예외를 던지는 StringAppend 메서드를 테스트한다고 가정해 보겠습니다.using System; namespace DemoApplication { public class Program
C#에서는 내장된 string.Join 메서드를 사용하여 문자열 리스트(List<string>)를 손쉽게 쉼표로 구분된 하나의 문자열로 변환할 수 있습니다.string.Join(, , list);이러한 변환 방식은 사용자로부터 여러 개의 데이터(예: 체크박스에서 선택한 항목)를 수집한 후, 이를 쉼표로 구분된 문자열로 만들어 데이터베이스에 쿼리를 실행하거나 추가 가공 작업을 진행할 때 특히 유용합니다.예제 1: 기본 문자열 리스트 변환using System; using System.Collections.Generic;
C#에서 Collection was modified; enumeration operation may not execute(컬렉션이 수정되어 열거 작업이 실행되지 않을 수 있습니다) 오류는 List와 같은 컬렉션을 foreach 루프로 순회하는 도중에 해당 컬렉션에 요소를 추가하거나 삭제하는 등의 변경이 일어날 때 발생합니다.오류가 발생하는 예제using System; using System.Collections.Generic; namespace DemoApplication { public class Program {
.NET에서 모든 문자열은 문자 집합(character set)과 인코딩(encoding)을 가지고 있습니다. 문자 인코딩이란 컴퓨터가 원시적인 0과 1의 데이터를 실제 문자로 해석하는 방법을 정의하는 규칙입니다. 일반적으로 숫자와 문자를 짝지어 매핑하는 방식으로 이루어지며, 본질적으로는 유니코드(Unicode) 문자들의 집합을 바이트 시퀀스로 변환하는 과정이라고 할 수 있습니다.Encoding.GetString 메서드C#에서는 Encoding.GetString(Byte[]) 메서드를 사용하여 지정된 바이트 배열의 모든 바이트를 문
C#에서 객체의 속성 값을 동적으로 읽어오려면 리플렉션(Reflection)을 활용할 수 있습니다.리플렉션은 어셈블리, 모듈, 타입(Type)을 설명하는 객체를 제공합니다. 이를 통해 런타임에 특정 타입의 인스턴스를 동적으로 생성하거나, 기존 객체에 타입을 바인딩하거나, 기존 객체로부터 타입 정보를 얻어 메서드를 호출하고 필드·속성에 접근할 수 있습니다. 또한 코드에서 특성(Attribute)을 사용했다면 리플렉션을 통해 해당 특성에도 접근할 수 있습니다..NET 리플렉션에서 핵심적인 역할을 하는 것은 System.Reflectio
C#에서 지정된 경로의 모든 하위 폴더와 파일을 한 번에 삭제해야 하는 경우가 종종 있습니다. 이럴 때 System.IO 네임스페이스를 활용하면 손쉽게 처리할 수 있습니다.특히 DirectoryInfo 클래스는 디렉터리 내의 모든 하위 폴더와 파일 정보를 제공하므로, 반복문과 함께 사용하면 전체 삭제 작업을 간단하게 구현할 수 있습니다.예제 시나리오먼저 D 드라이브에 Demo라는 디렉터리가 있고, 그 안에 두 개의 하위 폴더와 각각의 파일들이 존재한다고 가정해 보겠습니다.using System.IO; namespace DemoApp
C#에서는 문자열로 표현된 숫자를 정수형으로 변환할 때 int.Parse() 또는 Convert.ToInt32() 메서드를 사용합니다. 두 메서드 모두 변환할 수 없는 문자열이 입력되면 예외(Exception)를 발생시키지만, null 값 처리 방식에서 중요한 차이가 있습니다. Convert.ToInt32는 null 값을 허용하며, null이 입력되어도 어떤 오류도 발생시키지 않습니다. 반면 int.Parse는 null 값을 허용하지 않으며, null이 입력되면 ArgumentNullException 오류를 발생시킵니다. 예제
C# LINQ로 컬렉션 값 업데이트하기C#에서 컬렉션의 요소 값을 수정해야 할 때, 컬렉션이 List<T> 타입이라면 ForEach 확장 메서드를 활용할 수 있습니다. 이 메서드는 각 요소에 대해 지정한 동작을 반복 실행해 주므로, 별도의 반복문을 작성하지 않고도 한 줄로 값을 업데이트할 수 있습니다.예제 1: ForEach로 전체 요소 업데이트using System;using System.Collections.Generic;namespace DemoApplication { cla
C# 프로그래밍에서는 문자열에 포함된 줄 바꿈(New Line), 공백(Space), 탭(Tab) 등의 특수 문자를 다른 문자로 교체해야 하는 경우가 자주 발생합니다. 예를 들어, 여러 줄로 된 텍스트를 한 줄로 합치거나 데이터를 정규화할 때 유용합니다.이번 글에서는 아래와 같은 문자열에서 줄 바꿈과 탭 문자를 언더스코어(_)로 교체하는 방법을 두 가지 방식으로 살펴보겠습니다.방법 1: Replace() 메서드 사용가장 간단한 방법은 string.Replace() 메서드를 활용하는 것입니다. 이 메서드는 지정한 문자열 패턴을 찾아
C#에서 한 목록(List)에는 포함되어 있지만 다른 목록에는 없는 항목을 찾아야 하는 경우가 자주 있습니다. 이럴 때 LINQ의 Except 연산자를 사용하면 간단하게 해결할 수 있습니다.Except 연산자는 LINQ 집합(Set) 연산자 범주에 속하며, 두 개의 컬렉션을 받아 첫 번째 컬렉션 중 두 번째 컬렉션에 존재하지 않는 요소들만 반환합니다.다만 주의할 점이 있습니다. Except 확장 메서드는 기본 비교자를 사용하기 때문에 클래스와 같은 복합 형식(Complex Type)의 컬렉션에서는 의도한 대로 동작하지 않을 수 있습
C#에서 디렉터리의 전체 내용을 복사할 때 가장 중요한 것은 하위 디렉터리와 그 안에 들어 있는 파일들까지 빠짐없이 복사하는 것입니다. 최상위 폴더만 복사하면 원본의 구조가 유지되지 않기 때문에, DirectoryInfo 클래스와 재귀 호출을 활용하는 방법이 일반적으로 사용됩니다. 예제 시나리오 먼저 아래와 같이 여러 개의 하위 디렉터리와 파일이 들어 있는 데모 소스 디렉터리(d:\DemoSourceDirectory)가 있다고 가정해 보겠습니다. 그리고 복사 대상이 될 데모 타깃 디렉터리(d:\DemoTargetDi
제네릭(Generics)은 클래스의 필드, 메서드, 매개변수 등의 타입을 자리 표시자(placeholder)로 정의할 수 있게 해주는 기능입니다. 컴파일 시점에 이 자리 표시자들이 실제 구체적인 타입으로 대체되며, 제네릭은 꺾쇠 괄호 <>를 사용해 선언합니다.컬렉션의 가장 큰 한계 중 하나는 효과적인 타입 검사가 불가능하다는 점입니다. C#의 모든 클래스는 object 기본 클래스를 상속하기 때문에, 컬렉션에는 어떤 타입의 객체든 자유롭게 담을 수 있습니다.또한 일반 메서드와 달리 제네릭 메서드에서는 단순히 null을 반
C#의 yield 키워드는 컬렉션에 대해 사용자 정의 상태 기반 반복(stateful iteration)을 수행할 수 있게 해주는 강력한 도구입니다. yield를 사용하면 호출자(caller)와 소스 코드 사이에서 제어 흐름이 앞뒤로 오가며, 각 요소를 하나씩 순차적으로 반환할 수 있습니다.예제 코드using System; using System.Collections.Generic; namespace DemoApplication { class Program { static List<int> numb
C# LINQ에서 Last()와 LastOrDefault()는 모두 조건에 일치하는 마지막 요소를 반환한다는 공통점이 있습니다. 하지만 두 메서드의 핵심적인 차이는 결과가 존재하지 않을 때의 동작 방식에 있습니다.Last(): 주어진 조건에 일치하는 요소가 없으면 InvalidOperationException 예외를 발생시킵니다.LastOrDefault(): 조건에 일치하는 요소가 없을 경우 예외를 던지지 않고 기본값(null)을 반환합니다.언제 어떤 메서드를 사용해야 할까?Last()는 시퀀스에 최소한 하나 이상의 요소가 반드시