자바에서는 패키지(Package)를 사용해 클래스를 체계적으로 관리하지만, C# 언어에서는 이에 해당하는 개념으로 네임스페이스(Namespace)를 제공합니다. 자바의 패키지란? 패키지는 자바에서 다음과 같은 목적으로 사용됩니다. 이름 충돌(naming conflict) 방지 클래스 및 멤버에 대한 접근 제어 클래스, 인터페이스, 열거형(enum), 애노테이션(annotation)을 더 쉽게 검색하고 찾아서 사용할 수 있도록 지원 C#의 네임스페이스란? 네임스페이스는 한 집합의 이름을 다른 집합의 이름과 분리하여 관리할 수
C# try 키워드란?try 블록은 특정 예외가 활성화되는 코드 영역을 식별하는 역할을 합니다. 즉, 실행 중 오류가 발생할 가능성이 있는 문장들을 try 블록 내부에 배치하면, 해당 구간에서 발생한 예외를 감지하고 적절히 처리할 수 있습니다.try 블록은 단독으로 사용할 수 없으며, 뒤에 반드시 하나 이상의 catch 블록이 따라와야 합니다. catch 블록에는 실제 예외가 발생했을 때 실행될 오류 처리 코드를 작성합니다.try-catch 기본 문법예외를 잡아내려면 catch 문도 반드시 함께 설정해야 합니다.try {  
C# 타이머란 무엇인가?C#에서 타이머 기능을 사용하려면 System.Timers 네임스페이스를 활용해야 합니다. 이 네임스페이스에 포함된 Timer 클래스는 미리 설정한 시간 간격이 지나면 자동으로 이벤트를 발생시키며, 필요에 따라 이벤트를 반복적으로 생성하도록 설정할 수도 있습니다.타이머는 백그라운드 작업 스케줄링, 주기적인 데이터 동기화, 로그 자동 저장 등 다양한 시나리오에서 유용하게 활용됩니다.타이머 구현 단계1단계: 타이머 객체 생성먼저 5초(5000밀리초) 간격으로 작동하는 타이머 객체를 생성합니다.timer = new
C#의 Task(태스크) 클래스는 비동기 작업(asynchronous operation)을 나타내는 핵심 요소입니다. .NET의 TPL(Task Parallel Library, 작업 병렬 라이브러리)에 속해 있으며, 스레드를 직접 관리하지 않고도 효율적인 병렬 처리를 구현할 수 있게 해줍니다. 이번 글에서는 C#에서 태스크를 시작하는 대표적인 4가지 방법을 예제와 함께 살펴보겠습니다. 1. 델리게이트(delegate)로 태스크 시작하기 가장 전통적인 방식은 델리게이트를 인자로 전달하여 새로운 Task 인스턴스를 생성한 뒤, Sta
C#에서 임시 변수(temp variable)를 사용하지 않고 두 문자열을 서로 교환하려면 문자열 연결과 Substring() 메서드를 활용하면 됩니다. 이 글에서는 그 원리와 구현 방법을 단계별로 살펴보겠습니다.교환 로직의 핵심 원리이 방법은 크게 세 단계로 이루어집니다. 먼저 첫 번째 문자열에 두 번째 문자열을 이어 붙여 하나로 만든 뒤, Substring() 메서드로 각 문자열을 다시 분리해 내는 방식입니다.1단계: 두 문자열을 하나로 연결첫 번째 문자열(str1) 뒤에 두 번째 문자열(str2)을 붙입니다. 예를 들어 Bra
C#에서 한 줄로 두 변수 값 교환하기두 변수의 값을 서로 맞바꾸는(swap) 작업은 보통 임시 변수(temp)가 필요하지만, 비트 XOR 연산자(^)를 활용하면 단 한 줄의 코드로 교환할 수 있습니다.val1 = val1 ^ val2 ^ (val2 = val1);동작 원리C#은 식을 왼쪽에서 오른쪽으로 평가합니다. 위 코드의 실행 순서는 다음과 같습니다.① 먼저 val1과 val2의 현재 값으로 XOR 연산이 준비됩니다.② 이어서 괄호 안의 대입식 (val2 = val1)이 평가되어 val2에 val1의 원래 값이 저장되며, 이
C#에서 멤버 함수를 static 키워드로 선언하면 그 함수는 정적(static) 메서드가 됩니다. 정적 메서드는 오직 정적 변수에만 접근할 수 있으며, 클래스의 객체가 생성되기 전에도 이미 존재합니다. 즉, 객체를 만들지 않고도 클래스 이름을 통해 바로 호출할 수 있다는 것이 가장 큰 특징입니다.정적 클래스란?정적 클래스는 인스턴스화(instantiation)할 수 없으며, 오직 정적 멤버만 포함할 수 있습니다. 따라서 유틸리티 성격의 기능이나 공용 데이터를 다룰 때 유용하게 활용됩니다.정적 메서드 선언 방법정적 메서드는 stat
C#에서 double 타입의 숫자를 원하는 문자열 형식으로 변환하려면 정적 메서드인 String.Format을 사용하면 됩니다. 이 메서드는 표준 및 사용자 지정 숫자 서식 지정자를 활용해 소수점 자릿수, 천 단위 구분 기호 등을 손쉽게 제어할 수 있습니다.소수점 세 자리까지 표시하기서식 지정자 {0:0.000}을 사용하면 소수점 아래 세 자리까지 고정하여 출력할 수 있습니다. 숫자가 소수점 셋째 자리보다 짧으면 0으로 채워지고, 더 길면 반올림됩니다.String.Format({0:0.000}, 987.383); String.For
C# 문자열 리터럴(String Literal)이란? 문자열 리터럴 또는 상수는 큰따옴표( )로 묶거나, @ 기호를 붙인 @ 형태로 표현합니다. 문자열에는 일반 문자(plain character), 이스케이프 시퀀스(escape sequence), 유니버설 문자(universal character) 등이 포함될 수 있으며, 이러한 구성 방식은 문자 리터럴(character literal)과 매우 유사합니다. 대표적인 문자열 리터럴의 예는 다음과 같습니다. Hello, World Welcome, \n @C:\Docs\file.tx
C#에서 return 문은 메서드(함수)의 실행을 종료하고 호출한 곳으로 값을 되돌려주는 역할을 합니다. 프로그램이 어떤 함수를 호출하면, 프로그램의 제어 흐름이 해당 함수로 이동하게 됩니다. 그리고 함수 내부에서 return 문이 실행되는 순간, 지정된 값이 호출자에게 전달되며 함수 실행이 종료됩니다.return 문의 기본 개념return 문은 크게 두 가지 기능을 수행합니다.① 함수의 실행을 즉시 종료합니다.② return 뒤에 명시된 값을 함수를 호출한 코드로 반환합니다.반환값이 있는 메서드는 반드시 선언된 반환 타입과 일치하
C#에서는 List<T>와 같은 컬렉션에 저장된 요소를 인덱스를 통해 손쉽게 검색할 수 있습니다. 이번 글에서는 리스트 컬렉션을 만들고, 특정 위치의 요소를 가져오는 방법을 예제와 함께 살펴보겠습니다.리스트 컬렉션 생성 및 요소 추가먼저 정수형 요소를 담는 리스트를 선언하고 값을 추가합니다.List<int> list = new List<int>(); list.Add(20); list.Add(40); list.Add(60); list.Add(80);인덱스로 첫 번째 요소 검색하기리스트의 첫 번째 요소를
C# 구조체란 무엇인가?구조체(Structure)는 값 형식(value type) 데이터 타입입니다. 구조체를 활용하면 서로 연관된 여러 데이터를 다양한 자료형으로 묶어 하나의 변수에 저장할 수 있습니다. C#에서는 struct 키워드를 사용하여 구조체를 생성합니다.구조체 정의하기구조체를 정의하려면 반드시 struct 문을 사용해야 합니다. struct 문은 프로그램에서 사용할 새로운 데이터 타입을 정의하며, 두 개 이상의 멤버를 포함할 수 있습니다.예를 들어, 도서 정보를 담는 Books 구조체는 다음과 같이 선언할 수 있습니다.
C#에서는 상속 관계에 있는 클래스 간에 메서드를 다르게 동작시키는 방법으로 오버라이딩(Overriding)과 섀도잉(Shadowing)을 제공합니다. 두 기능은 비슷해 보이지만 동작 방식과 사용 목적이 분명히 다르므로, 그 차이를 정확히 이해하는 것이 중요합니다.오버라이딩(Overriding)이란?오버라이딩은 부모 클래스에 정의된 메서드를 자식 클래스가 자신의 필요에 맞게 재정의하는 것을 의미합니다. 이를 통해 서브클래스 타입에 특화된 동작을 구현할 수 있으며, 다형성(Polymorphism)을 실현하는 핵심 문법입니다.오버라이딩
C#에서 오버라이딩(Overriding)과 섀도잉(Shadowing)은 모두 상속 관계에 있는 클래스에서 부모 클래스의 메서드를 다루는 기법이지만, 동작 방식과 용도가 확연히 다릅니다. 두 개념을 혼동하면 예상치 못한 버그를 유발할 수 있으므로, 각각의 특징을 정확히 이해하는 것이 중요합니다. 오버라이딩과 섀도잉의 주요 차이점 1. 재정의 범위의 차이 섀도잉은 부모 클래스의 메서드 전체를 새롭게 다시 정의하는 반면, 오버라이딩은 메서드의 시그니처는 그대로 유지한 채 구현 내용만 다시 작성합니다. 2. 부모 클래스 멤버 접근 여부 오
C#에서 클래스와 메서드의 상속 및 재정의 동작을 제어하는 대표적인 키워드로 virtual, sealed, new, abstract가 있습니다. 각 키워드의 역할과 사용 시점을 정확히 이해하면 객체 지향 설계를 훨씬 유연하고 안전하게 할 수 있습니다.virtual — 메서드 재정의 허용하기virtual 키워드는 파생 클래스(자식 클래스)에서 해당 메서드를 재정의(override)할 수 있도록 허용합니다. 부모 클래스의 메서드를 자식 클래스에서 다르게 동작하게 만들고 싶다면, 부모 클래스의 메서드를 virtual로 선언해야 합니다.즉
C#에서 두 숫자 교환(Swap)하기프로그래밍에서 두 변수의 값을 서로 맞바꾸는 작업을 스왑(Swap)이라고 합니다. C#에서는 별도의 임시 변수 없이도 덧셈과 뺄셈 연산만으로 두 숫자를 간단하게 교환할 수 있습니다.기본 로직먼저 교환할 두 개의 변수를 선언하고 초기화합니다.val1 = 100; val2 = 200;이제 다음 세 단계의 연산을 통해 두 값을 교환합니다.val1 = val1 + val2; val2 = val1 - val2; val1 = val1 - val2;동작 원리이 방식이 어떻게 작동하는지 초기값(val1 = 10
C#에서 배열을 다룰 때 요소를 다른 배열로 복사하거나 배열 전체를 복제해야 하는 경우가 자주 발생합니다. 이때 많이 사용되는 메서드가 바로 CopyTo()와 Clone()입니다. 두 메서드는 이름은 비슷하지만 동작 방식과 용도가 분명히 다르므로, 각각의 특징을 정확히 이해하고 상황에 맞게 사용하는 것이 중요합니다.C# Array.CopyTo() 메서드란?CopyTo() 메서드는 현재 1차원 배열의 모든 요소를 지정한 대상 1차원 배열로 복사합니다. 이때 복사가 시작될 대상 배열의 인덱스를 32비트 정수(int) 형태로 직접 지정할
C#에서 lvalue와 rvalue의 개념C#에서 표현식(expression)은 크게 lvalue와 rvalue 두 가지 유형으로 구분됩니다. 이 두 개념은 변수와 값이 메모리에서 어떻게 다뤄지는지 이해하는 데 중요한 기초가 됩니다.lvalue (좌값)lvalue는 할당문(대입문)의 왼쪽 또는 오른쪽 어느 쪽에도 위치할 수 있는 표현식을 의미합니다. 일반적으로 lvalue는 메모리상의 특정 위치를 참조하며, 따라서 값을 저장할 수 있는 대상이 됩니다.rvalue (우값)rvalue는 할당문의 오른쪽에만 위치할 수 있고 왼쪽에는 올
FizzBuzz는 프로그래밍 학습자라면 한 번쯤 마주치게 되는 대표적인 알고리즘 문제입니다. 간단해 보이지만 조건문의 처리 순서와 논리 구조를 이해하고 있는지 확인할 수 있어 코딩 면접에서도 자주 등장합니다. FizzBuzz 문제의 규칙 FizzBuzz 문제는 1부터 100까지의 숫자를 출력하되, 다음 규칙에 따라 특정 숫자를 문자열로 대체하는 것입니다. 3의 배수인 경우 → 숫자 대신 Fizz 출력 5의 배수인 경우 → 숫자 대신 Buzz 출력 3과 5의 공배수(즉, 15의 배수)인 경우 → 숫자 대신 FizzBuzz 출력 그
C# 비정적 클래스의 개념C#에서 비정적(non-static) 클래스는 인스턴스를 생성할 수 있는 일반적인 클래스를 의미합니다. 반면 정적(static) 클래스는 인스턴스화할 수 없어서 new 키워드를 사용해 해당 클래스 타입의 변수를 만들 수 없습니다.비정적 클래스와 정적 클래스의 주요 차이점인스턴스 생성 가능 여부: 비정적 클래스는 new 키워드로 객체를 생성할 수 있지만, 정적 클래스는 그렇지 않습니다.메서드 구성: 비정적 클래스는 인스턴스 메서드와 정적 메서드를 모두 가질 수 있습니다. 정적 클래스는 정적 멤버만 포함할 수