C# 컴파일러에는 별도의 전처리기(preprocessor)가 존재하지 않지만, 지시문은 마치 전처리기가 있는 것처럼 처리됩니다. C#에서 전처리기 지시문은 주로 조건부 컴파일을 지원하는 데 활용됩니다.전처리기 지시문은 실제 컴파일이 시작되기 전에 특정 정보를 사전 처리하도록 컴파일러에 지시하는 역할을 합니다.C#의 주요 전처리기 지시문다음은 C#에서 사용할 수 있는 전처리기 지시문 목록입니다.1. #define심볼(symbol)이라 불리는 문자 시퀀스를 정의합니다.2. #undef정의된 심볼을 해제(undefine)할 수 있게 합니
C# 예외(Exception)란 무엇인가?예외(Exception)는 프로그램 실행 중에 발생하는 문제를 의미합니다. C#에서 예외란 프로그램이 실행되는 도중에 발생하는 비정상적인 상황에 대한 대응을 말하며, 대표적인 예로 0으로 나누기를 시도하는 경우가 있습니다.C#은 기본적으로 다양한 내장 예외 클래스를 제공하지만, 때로는 애플리케이션의 특정 요구 사항에 맞는 예외 처리가 필요합니다. 이럴 때 직접 예외를 정의할 수 있으며, 이를 사용자 정의 예외(User-defined Exception)라고 합니다.사용자 정의 예외 클래스 만들
C#에서 ref 키워드를 사용하면 참조(reference) 매개변수를 선언할 수 있습니다. 참조 매개변수는 변수가 저장된 메모리 위치에 대한 참조를 의미합니다. 값(value) 매개변수와 달리, 매개변수를 참조로 전달하면 새로운 저장 공간이 생성되지 않고 원본 변수 자체를 그대로 가리키게 됩니다.ref 매개변수 선언 방법일반적인 ref 매개변수는 다음과 같이 선언합니다.public void swap(ref int x, ref int y) {}배열 타입의 ref 매개변수는 아래처럼 선언할 수 있습니다.static void Displa
C#에서 메서드가 자기 자신을 다시 호출하는 방식을 재귀 메서드 호출(Recursive Method Call)이라고 하며, 이러한 프로그래밍 기법을 재귀(Recursion)라고 부릅니다.재귀는 복잡한 문제를 동일한 구조의 더 작은 문제로 나누어 해결할 때 매우 유용합니다. 대표적인 활용 예로 팩토리얼 계산, 피보나치 수열, 트리 순회 등이 있으며, 이번 글에서는 거듭제곱 계산을 재귀로 구현하는 방법을 살펴보겠습니다.재귀의 핵심 원리재귀 함수는 반드시 두 가지 요소를 포함해야 합니다.종료 조건(Base Case): 재귀 호출이 멈추는
C#에서 봉인(sealed) 클래스는 sealed 키워드를 사용하여 선언된 클래스로, 다른 클래스가 상속할 수 없도록 제한하는 기능을 합니다. 즉, 한 번 봉인된 클래스는 기반(base) 클래스로 사용될 수 없습니다.흥미로운 점은 sealed 키워드가 클래스뿐만 아니라 메서드에도 적용될 수 있다는 것입니다. 메서드에 sealed 한정자를 사용하면 해당 메서드는 더 이상 파생 클래스에서 재정의(override)될 수 없게 됩니다.sealed 메서드의 조건메서드에 sealed 한정자를 적용할 때는 다음 두 가지 조건을 반드시 충족해야
C# 정적 클래스의 기본 개념C#에서 정적(static) 클래스는 인스턴스화(instantiation)할 수 없는 특수한 형태의 클래스입니다. 즉, new 키워드를 사용해 객체를 생성할 수 없으며, 오직 정적 멤버(static members)만 포함할 수 있습니다.또한 정적 클래스는 자동으로 봉인(sealed) 상태가 되어 다른 클래스가 상속할 수 없으며, 인스턴스 생성자(instance constructor)를 가질 수 없다는 중요한 특징이 있습니다.정적 클래스의 주요 특징정리하면 C# 정적 클래스는 다음과 같은 특성을 가집니다:
정적 생성자(Static Constructor)는 static 한정자를 사용하여 선언된 생성자입니다. 클래스가 처음으로 사용되기 전에 단 한 번만 자동으로 실행되며, 클래스의 라이프사이클에서 가장 먼저 수행되는 코드 블록입니다. 정적 생성자의 주요 특징 클래스당 최대 하나의 정적 생성자만 선언할 수 있습니다. 접근 제한자(public, private 등)를 사용할 수 없으며, 매개변수도 가질 수 없습니다. 첫 번째 인스턴스가 생성되거나 정적 멤버에 처음 접근하기 직전에 .NET 런타임이 자동으로 호출합니다. 주로 정적 필드를 초기
정적 다형성(Static Polymorphism)은 컴파일 시점에 함수와 객체가 연결되는 방식을 말하며, 이를 정적 바인딩(Static Binding)이라고도 부릅니다. 실행 중에 호출 대상을 결정하는 동적 다형성과 달리, 프로그램이 실행되기 전에 어떤 메서드가 호출될지 이미 결정된다는 것이 특징입니다. C#에서는 크게 두 가지 기법으로 정적 다형성을 구현할 수 있습니다. 함수 오버로딩(Function Overloading) 연산자 오버로딩(Operator Overloading) 1. 함수 오버로딩(Function Overloa
C# 구조체란 무엇인가?C#에서 구조체(structure)는 값 형식(value type) 데이터 타입입니다. 구조체를 활용하면 하나의 변수 안에 서로 다른 데이터 타입을 가진 관련 데이터들을 묶어서 저장할 수 있습니다. 구조체를 선언할 때는 struct 키워드를 사용합니다.C# 구조체의 주요 특징다양한 멤버 포함 가능: 구조체에는 메서드, 필드, 인덱서, 속성(property), 연산자 메서드, 이벤트 등을 포함할 수 있습니다.생성자와 소멸자: 구조체에는 생성자를 정의할 수 있지만, 소멸자(destructor)는 정의할 수 없습니
C# 인터페이스(Interface)란?인터페이스는 속성(Property), 메서드(Method), 이벤트(Event)와 같은 멤버들을 정의하는 일종의 계약(Contract)입니다. 인터페이스 자체에는 멤버의 선언만 포함될 뿐, 실제 구현 내용은 없습니다. 멤버를 실제로 구현할 책임은 인터페이스를 상속받는 파생 클래스에 있습니다.이러한 특성 덕분에 인터페이스는 여러 클래스가 반드시 따라야 할 표준 구조를 제공하는 데 매우 유용합니다. 즉, 서로 다른 클래스라도 동일한 인터페이스를 구현하면 같은 형태의 메서드와 속성을 갖추게 되어 코드
직렬화(Serialization)는 프로그램 내에서 사용 중인 객체의 상태를 파일이나 스트림으로 변환하여 저장하거나 전송할 수 있게 만드는 과정입니다. C#에서는 BinaryFormatter 클래스의 Serialize() 메서드를 활용해 객체를 손쉽게 직렬화할 수 있습니다.아래 예제에서는 BinaryFormatter.Serialize(stream, reference) 메서드를 사용하여 샘플 객체를 직렬화하는 과정을 단계별로 살펴보겠습니다.1. 생성자 정의하기먼저 직렬화할 Employee 클래스에 필요한 값을 초기화하는 생성자를 정의
C#에서 예외(Exception)는 클래스로 표현됩니다. C#의 예외 클래스들은 대부분 System.Exception 클래스를 직접 또는 간접적으로 상속받아 구성됩니다..NET이 제공하는 기본 예외 클래스 외에도, 개발자는 자신만의 사용자 정의 예외(User-defined Exception)를 만들 수 있습니다. 사용자 정의 예외 클래스는 Exception 클래스를 상속하여 정의하며, 이를 통해 애플리케이션의 도메인에 맞는 의미 있는 오류 정보를 전달할 수 있습니다.사용자 정의 예외 작성 방법사용자 정의 예외를 만드는 기본 절차는
가변 배열이란?가변 배열(Jagged Array)은 말 그대로 배열의 배열입니다. 일반적인 2차원 배열과 달리 각 내부 배열의 길이가 서로 달라도 되기 때문에 유연하게 데이터를 구성할 수 있습니다. 가변 배열의 요소에 접근하려면 해당 내부 배열의 인덱스와, 그 안에서 원하는 요소의 인덱스를 차례로 지정하면 됩니다.다음은 정수형 배열 5개로 구성된 가변 배열의 예입니다.int[][] a = new int[][]{new int[]{0,0},new int[]{1,2}, new int[]{2,4},new int[]{ 3, 6 }, new
C#에서 다차원 배열의 특정 요소에 접근하려면 원하는 요소의 인덱스를 대괄호 안에 쉼표로 구분하여 지정하면 됩니다. a[2,1] 위 코드는 배열의 3번째 행(인덱스 2)과 2번째 열(인덱스 1)에 있는 요소에 접근합니다. 아래와 같이 선언된 4×2 크기의 배열을 예로 들어 보겠습니다. 0 0 1 2 2 4 3 6 여기서 a[2,1]은 세 번째 행 {2, 4} 중 두 번째 열의 값, 즉 4를 반환합니다. C#의 배열 인덱스는 0부터 시작하므로, 첫 번째 행·열의 인덱스는 각각 0이라는 점을 기억해 두는 것이 중요합니다. 지금까지 설명
C#에서 소문자를 대문자로 변환하려면 ToUpper() 메서드를 사용하면 됩니다. 이 메서드는 문자열 내의 모든 영문자를 대문자로 바꾼 새로운 문자열을 반환하며, 원본 문자열은 변경되지 않고 그대로 유지된다는 점을 기억하세요.기본 사용법예를 들어 다음과 같은 소문자 문자열이 있다고 가정해 보겠습니다.str = david;위 소문자 문자열을 대문자로 변환하려면 ToUpper() 메서드를 다음과 같이 호출합니다.Console.WriteLine(Converted to UpperCase : {0}, str.ToUpper());실행 결과는
C#에서 메서드에 데이터를 전달하는 방식은 크게 값 매개변수(Value Parameter), 참조 매개변수(Reference Parameter), 출력 매개변수(Output Parameter) 세 가지로 나뉩니다. 각 방식은 메모리를 다루는 방법과 메서드 내부의 변경 사항이 호출자에게 미치는 영향이 다르기 때문에, 이 차이를 정확히 이해하는 것이 안정적인 코드 작성의 기본입니다. 값 매개변수(Value Parameters) 값 매개변수는 인자(argument)의 실제 값을 복사하여 메서드의 형식 매개변수에 전달하는 방식입니다.
C#의 Math.Cos, Math.Sin, Math.Tan 같은 삼각 함수는 각도를 라디안(radian) 단위로 받습니다. 따라서 일반적으로 익숙한 도(degree) 단위의 각도를 그대로 전달하면 의도와 다른 결과가 나옵니다.도를 라디안으로 변환하려면 각도 값에 Math.PI / 180을 곱하면 됩니다.변환 공식Math.PI * angle / 180.0예제 코드using System; class Program { static void Main() { // 잘못된 예: 4
C#에서 대문자를 소문자로 변환하려면 ToLower() 메서드를 사용하면 됩니다. 이 메서드는 문자열의 모든 대문자를 해당하는 소문자로 바꾼 새로운 문자열을 반환합니다.먼저, 다음과 같은 문자열이 있다고 가정해 보겠습니다.str = TIM;위와 같이 대문자로 이루어진 문자열을 소문자로 변환하려면 ToLower() 메서드를 아래처럼 호출하면 됩니다.Console.WriteLine(Converted to LowerCase : {0}, str.ToLower());전체 예제 코드다음은 C#에서 문자열의 대소문자를 변환하는 전체 코드입니다.
직사각형 배열(rectangular array)의 요소에 접근하려면, 가져오고자 하는 요소의 인덱스를 지정하기만 하면 됩니다. C#에서 다차원 배열은 직사각형 배열이라고도 불리며, 각 행의 길이가 모두 동일한 2차원 이상의 배열을 의미합니다.a[0,1]; // 두 번째 요소배열 요소에 접근할 때는 쉼표로 구분된 인덱스를 사용합니다. 첫 번째 인덱스는 행(row), 두 번째 인덱스는 열(column)을 나타냅니다.예제다음 예제는 C#에서 직사각형 배열을 선언하고, 값을 할당한 후 각 요소에 접근하는 전체 과정을 보여줍니다.using
C#에서 Array 클래스는 모든 배열의 기본(base) 클래스로, System 네임스페이스에 정의되어 있습니다. 이 클래스가 제공하는 메서드와 속성을 활용하면 배열 복사, 검색, 정렬 방향 변경 등 다양한 작업을 손쉽게 처리할 수 있습니다.Array 클래스의 주요 메서드다음은 C# Array 클래스에서 자주 사용되는 메서드 목록입니다.번호메서드 및 설명1Clear요소의 형식에 따라 배열 내 지정된 범위의 요소를 0, false 또는 null로 설정합니다.2Copy(Array, Array, Int32)첫 번째 요소부터 시작하는 원본