C#에서 protected 접근 한정자는 파생 클래스(자식 클래스)가 기반 클래스(부모 클래스)의 멤버 변수와 멤버 함수에 접근할 수 있도록 허용하는 역할을 합니다. 이러한 특성 덕분에 상속(inheritance)을 효과적으로 구현할 수 있으며, 상속에 대한 자세한 내용은 상속 챕터에서 더 깊이 다루게 됩니다.protected 멤버 변수 선언 예제다음은 클래스 A 내부에 protected로 멤버 변수를 선언한 간단한 예제입니다.class A { protected int a2 = 87; }이렇게 선언된 변수는 외부에서는 직접
C# 범위 확인 연산자(::)란 무엇일까요?C#의 범위 확인 연산자(scope resolution operator)인 ::는 C++와는 전혀 다른 의미로 사용됩니다. C++에서는 ::가 주로 전역 변수나 클래스 멤버에 접근하는 데 활용되지만, C#에서는 네임스페이스 식별과 관련된 용도로 쓰입니다.만약 서로 다른 네임스페이스에서 같은 이름(식별자)을 공유하는 타입이 존재한다면, 이들을 명확하게 구분하기 위해 범위 확인 연산자를 사용해야 합니다.대표적인 예로, System.Console 클래스를 참조할 때 전역 네임스페이스 별칭(glo
C#의 Hashtable 클래스는 키(key)의 해시 코드(hash code)를 기준으로 구성되는 키-값(key-value) 쌍 컬렉션을 나타냅니다. Hashtable은 System.Collections 네임스페이스에 속해 있으며, 인덱스가 아닌 키를 통해 컬렉션 내 요소에 빠르게 접근할 수 있다는 것이 가장 큰 특징입니다.Hashtable에서 자주 사용되는 대표적인 메서드는 다음과 같습니다.번호메서드 및 설명1public virtual void Add(object key, object value);지정한 키와 값으로 이루어진 요소
ArrayList 클래스의 IsFixedSize 속성은 해당 ArrayList가 고정된 크기를 가지고 있는지 여부를 나타내는 값을 가져오는 데 사용됩니다.이 속성은 Boolean 타입의 값을 반환하며, 리스트에 요소를 추가하거나 제거할 수 있는지 확인해야 할 때 유용합니다. 일반적인 방식으로 생성된 ArrayList는 크기가 동적으로 조절되므로 IsFixedSize 속성은 기본적으로 False를 반환하고, ArrayList.FixedSize() 메서드로 생성된 래퍼(wrapper)인 경우에만 True를 반환합니다.예제 코드다음은 I
C#에서는 List<T>를 사용하여 여러 요소를 저장하고 필요할 때 손쉽게 가져올 수 있습니다. 먼저 간단한 예제를 통해 리스트의 기본적인 사용법을 살펴보겠습니다.리스트 생성 및 요소 출력 예제using System; using System.Collections.Generic; public class Demo { public static void Main(string[] args) { var subjects = new List<string>(); &n
C#에서 ArrayList 클래스의 IsReadOnly 속성은 해당 ArrayList가 읽기 전용(read-only)인지 여부를 나타내는 값을 확인할 때 사용합니다. 이 속성은 컬렉션에 요소를 추가하거나 수정할 수 있는지 판단해야 할 때 매우 유용합니다.IsReadOnly 속성은 bool 타입의 값을 반환하며, ArrayList가 읽기 전용이면 True, 아니면 False를 반환합니다. 일반적으로 new 키워드로 생성한 ArrayList는 읽기 전용이 아니므로 False가 출력됩니다.IsReadOnly 속성 사용 방법먼저 다음과 같
Length 속성은 BitArray에 포함된 요소(비트)의 개수를 가져오거나 설정하는 데 사용됩니다. 이 속성을 활용하면 배열의 크기를 손쉽게 확인할 수 있으며, 필요에 따라 크기를 동적으로 조정할 수도 있습니다.BitArray 선언하기먼저 다음과 같이 5개의 비트를 가지는 BitArray 객체를 생성합니다.BitArray arr = new BitArray( 5 );Length 속성으로 길이 확인하기생성된 BitArray의 길이는 Length 속성으로 간단히 조회할 수 있습니다.Console.WriteLine( Length: {0}
정규식(Regular Expression)은 입력 텍스트와 비교하여 일치 여부를 판별할 수 있는 패턴입니다. 다양한 종류의 문자, 연산자, 구성 요소를 조합해 원하는 형태의 정규식을 정의할 수 있으며, 이 중 대체(Substitution)는 치환(replacement) 패턴 안에서 사용되는 특수한 구문입니다. C# 정규식 대체란 무엇인가? 대체 요소는 Regex.Replace 메서드처럼 매칭 결과를 다른 문자열로 바꿀 때 치환 패턴 내에 삽입하여 사용합니다. 이를 활용하면 매칭된 그룹의 순서를 재배열하거나, 특수 문자($)를 그대로
C#에서 문자열을 초기화하는 것은 매우 간단한 작업입니다. 예를 들어 이름을 저장하고 싶다면 다음과 같이 문자열 변수를 선언하고 값을 할당하면 됩니다.string str = Hello, World!;문자열 초기화 방법문자열은 큰따옴표(")로 감싼 리터럴 값을 사용하거나, new 키워드를 통해 생성할 수도 있습니다. 가장 일반적인 방법은 문자열 리터럴을 직접 할당하는 것입니다.string name = Amit; string greeting = new string(H, 5); // HHHHHC#에서 문자열 비교하기두 문자열을
C# 배열 초기화의 기본 개념모든 배열은 연속된 메모리 공간으로 구성됩니다. 가장 낮은 주소가 첫 번째 요소에 해당하며, 가장 높은 주소가 마지막 요소에 해당합니다.배열을 사용하려면 먼저 선언해야 합니다.int[] rank;하지만 배열을 선언하는 것만으로는 메모리에서 배열이 초기화되지 않습니다. 배열 변수를 초기화한 후에야 실제로 값을 할당할 수 있습니다.new 키워드로 배열 인스턴스 생성하기C#에서 배열은 참조(reference) 타입입니다. 따라서 new 키워드를 사용하여 배열의 인스턴스를 명시적으로 생성해야 합니다.int[]
C# 프로그래밍에서 두 숫자를 비교하여 더 큰 값을 찾는 것은 가장 기본적이면서도 자주 사용되는 작업입니다. 이 글에서는 if-else 조건문을 활용해 두 숫자 사이의 최댓값을 구하는 방법을 단계별로 살펴보겠습니다.1단계: 두 숫자 선언 및 초기화먼저 비교할 두 개의 정수 변수를 선언하고 값을 초기화합니다.int num1 = 50;int num2 = 90;2단계: if-else 문으로 최댓값 비교선언된 두 숫자를 if-else 문으로 비교합니다. num1이 num2보다 크면 num1을, 그렇지 않으면 num2를 최댓값 변수에 저장하
C#에서 문자열 객체를 생성하는 방법은 여러 가지가 있습니다. 상황과 목적에 따라 적합한 방식을 선택하면 되는데, 대표적인 방법은 다음과 같습니다.문자열 리터럴을 String 변수에 직접 할당하는 방법String 클래스의 생성자를 사용하는 방법문자열 연결 연산자(+)를 사용하는 방법문자열을 반환하는 속성에 접근하거나 해당 메서드를 호출하는 방법서식 지정(포맷팅) 메서드를 호출하여 값이나 객체를 문자열 표현으로 변환하는 방법아래 예제는 C#에서 문자열 객체를 생성할 수 있는 다양한 방법을 보여줍니다.예제 코드using System;
C#에서 Tuple 클래스를 사용하면 서로 다른 자료형의 값들을 하나의 객체로 묶어 관리할 수 있습니다. 이번 글에서는 정수(int)와 문자열(string) 두 가지 항목을 가지는 튜플을 생성하고, 각 항목에 접근하는 방법을 알아보겠습니다.튜플 생성하기먼저 정수와 문자열 두 개의 항목을 가지는 튜플을 선언합니다. 제네릭 타입 매개변수에 각각 int와 string을 지정하고, 생성자에 값을 순서대로 전달하면 됩니다.Tuple<int, string> tuple = new Tuple<int, string>(20, T
스레드(Thread)란 무엇인가?스레드는 경량 프로세스(Lightweight Process)라고도 불리며, 프로그램 내에서 실제 작업이 실행되는 경로를 의미합니다. 하나의 프로세스 안에서 여러 개의 스레드가 동시에 실행되면서 각각의 작업을 수행할 수 있습니다.C#에서는 Thread 클래스를 기반으로 스레드를 생성합니다. 스레드 객체를 만든 뒤 Start() 메서드를 호출하면 자식 스레드(child thread)의 실행이 시작됩니다.스레드를 사용하는 이유스레드의 대표적인 활용 사례는 현대 운영체제에서 구현하는 동시성 프로그래밍(Con
C#에서 일반 배열은 한 번 선언하면 크기를 변경할 수 없습니다. 하지만 실제 개발 환경에서는 데이터의 개수가 실행 중에 달라지는 경우가 많기 때문에, 크기가 고정된 정적 배열보다 유연하게 늘어나고 줄어들 수 있는 동적 배열(Dynamic Array)이 훨씬 유용합니다.ArrayList란 무엇인가?C#에서 동적으로 배열을 생성하려면 System.Collections 네임스페이스에 포함된 ArrayList 컬렉션을 사용할 수 있습니다. ArrayList는 다음과 같은 특징을 가집니다.요소를 개별적으로 인덱싱할 수 있는 순서 있는 컬렉
무한 루프(Infinite Loop)란 종료 조건이 충족되지 않아 프로그램이 끝나지 않고 계속해서 반복 실행되는 루프를 말합니다. 의도적으로 특정 작업을 지속적으로 수행해야 할 때 사용되기도 하지만, 실수로 발생할 경우 프로그램이 멈추거나 시스템 리소스를 과도하게 소모하는 원인이 될 수 있습니다.그렇다면 C#에서는 어떻게 무한 루프를 만들 수 있을까요? 아래 예제를 통해 살펴보겠습니다.C# 무한 루프 예제using System; namespace Demo { class Program { static void M
사용자 지정 속성(Custom Attribute)은 코드에 선언적 정보를 저장할 수 있게 해주며, 저장된 정보는 런타임에 리플렉션(Reflection)을 통해 조회할 수 있습니다.이번 글에서는 C#에서 사용자 지정 속성을 선언하고 구현하는 방법을 단계별로 살펴보겠습니다.사용자 지정 속성 선언하기사용자 지정 속성 클래스는 System.Attribute 클래스를 상속받아 정의하며, AttributeUsage 특성을 통해 해당 속성이 적용될 수 있는 대상을 지정합니다.[AttributeUsage ( AttributeTargets.Clas
가변 배열(Jagged Array)은 배열의 배열로, 각 행(내부 배열)의 길이가 서로 다를 수 있는 2차원 배열 구조입니다. 일반적인 다차원 배열과 달리 메모리를 유연하게 사용할 수 있어 상황에 따라 매우 유용합니다.가변 배열 초기화 방법가변 배열은 선언과 동시에 아래와 같이 초기화할 수 있습니다.int[][] rank = new int[2][]{new int[]{3,2,7},new int[]{9,4,5,6}};위 코드에서 첫 번째 내부 배열은 요소 3개(3, 2, 7)를, 두 번째 내부 배열은 요소 4개(9, 4, 5, 6)를
중첩 while 루프(nested while loop)는 두 개의 while 루프가 서로 포함된 구조를 말합니다. 바깥쪽 루프(외부 루프)가 먼저 조건을 검사하고, 그 조건이 참(true)일 때 안쪽 루프(내부 루프)로 진입하게 됩니다.기본 구조루프 1 (외부 루프)while (a<25) { }루프 2 (루프 1 내부에 위치)while (b<45){ }위와 같이 외부 루프 안에 내부 루프를 배치하면 중첩 while 루프가 완성됩니다. 아래는 실제 동작하는 전체 예제 코드입니다.예제 코드using System; namesp
다른 프로그래밍 언어와 마찬가지로 C#에서도 개발자가 직접 사용자 정의 예외(User-defined Exception)를 손쉽게 만들 수 있습니다. 사용자 정의 예외 클래스는 .NET의 최상위 예외 클래스인 Exception 클래스를 상속받아 작성합니다.기본 제공 예외만으로는 애플리케이션의 특정 상황을 표현하기 어려울 때, 이처럼 직접 예외 클래스를 정의하면 오류의 의미를 명확하게 전달할 수 있고 코드의 가독성과 유지보수성도 크게 향상됩니다.사용자 정의 예외의 기본 구조사용자 정의 예외를 만드는 방법은 매우 간단합니다. 핵심은 다음