C#은 unsafe 수정자로 표시된 코드 블록이나 함수에서 포인터 변수 사용을 허용합니다. 안전하지 않은 코드(unsafe code) 또는 비관리 코드는 포인터(pointer) 변수를 사용하는 코드 블록입니다. 포인터 포인터는 다른 변수의 주소, 즉 메모리 위치의 직접 주소를 값으로 가지는 변수입니다. 모든 변수나 상수와 마찬가지로 포인터를 사용하기 전에 선언해야 합니다. 포인터 선언의 일반적인 형식은 다음과 같습니다. type *var-name; 다음은 유효한 포인터 선언들입니다. int *ip; /* 정수 포인터 */ do
대리자는 대리자와 동일한 시그니처를 가진 모든 메서드를 참조하는 데 사용된다고 논의했습니다. 즉, 대리자 객체를 사용하여 대리자가 참조할 수 있는 메서드를 호출할 수 있습니다. 무명 메서드(Anonymous methods)는 코드 블록을 대리자 매개 변수로 전달하는 기법을 제공합니다. 무명 메서드는 이름이 없고 본문만 있는 메서드입니다. 무명 메서드에서 반환 형식을 지정할 필요가 없습니다. 메서드 본문 내의 return 문에서 유추됩니다. 무명 메서드 작성 무명 메서드는 delegate 키워드를 사용하여 대리자 인스턴스 생성과 함께
제네릭(Generics)은 클래스나 메서드에서 프로그래밍 요소의 데이터 형식 사양을 실제 프로그램에서 사용될 때까지 정의하지 않고 미루는 것을 허용합니다. 즉, 제네릭을 사용하면 모든 데이터 형식과 작동하는 클래스나 메서드를 작성할 수 있습니다. 데이터 형식에 대한 대체 매개 변수를 사용하여 클래스나 메서드의 사양을 작성합니다. 컴파일러가 클래스의 생성자나 메서드의 함수 호출을 만나면 특정 데이터 형식을 처리하는 코드를 생성합니다. 간단한 예제로 개념을 이해해 보겠습니다. Live Demo using System; using Sy
컬렉션 클래스는 데이터 저장과 검색을 위한 특수 클래스입니다. 이 클래스들은 스택, 큐, 리스트, 해시 테이블을 지원합니다. 대부분의 컬렉션 클래스는 동일한 인터페이스를 구현합니다. 컬렉션 클래스는 요소에 동적 메모리 할당, 인덱스 기반 항목 목록 접근 등 다양한 목적을 제공합니다. 이 클래스들은 C#에서 모든 데이터 형식의 기본 클래스인 Object 클래스의 객체 컬렉션을 생성합니다. 다양한 컬렉션 클래스와 용도 다음은 System.Collections 네임스페이스의 일반적으로 사용되는 클래스들입니다. 번호 클래스 및 설명과
이벤트(Event)는 키 누름, 클릭, 마우스 이동 등의 사용자 액션이나 시스템 생성 알림과 같은 발생 사항입니다. 애플리케이션은 이벤트가 발생할 때 이에 응답해야 합니다. 예를 들어 인터럽트가 있습니다. 이벤트는 프로세스 간 통신에 사용됩니다. 이벤트와 대리자 사용 이벤트는 클래스에서 선언되고 발생하며, 동일 클래스 또는 다른 클래스에서 대리자를 사용하여 이벤트 핸들러와 연결됩니다. 이벤트를 포함하는 클래스는 이벤트를 게시하는 데 사용되며, 이를 게시자(publisher) 클래스라고 합니다. 이 이벤트를 수락하는 다른 클래스를 구
C# 대리자(delegate)는 C 또는 C++의 함수 포인터와 유사합니다. 대리자는 메서드에 대한 참조를 저장하는 참조 형식 변수이며, 이 참조는 런타임에 변경할 수 있습니다. 대리자 선언 대리자 선언은 대리자가 참조할 수 있는 메서드를 결정합니다. 대리자는 대리자와 동일한 시그니처를 가진 메서드를 참조할 수 있습니다. 예를 들어, 다음과 같은 대리자를 생각해 보세요. public delegate int MyDelegate(string s); 앞의 대리자는 단일 string 매개 변수를 받고 int 형식 변수를 반환하는 모든 메서
인덱서(Indexer)를 사용하면 객체를 배열처럼 인덱싱할 수 있습니다. 클래스에 인덱서를 정의하면 이 클래스는 가상 배열(Virtual Array)처럼 동작합니다. 그러면 이 클래스의 인스턴스를 배열 접근 연산자([ ])로 접근할 수 있습니다. 인덱서 구문 (Syntax) 1차원 인덱서 구문: 요소_타입 this[int 인덱스] { // get 접근자 get { // 인덱스로 지정된 값 반환 } // set 접근자 set { // 인덱스로 지
프로퍼티(Properties)는 클래스, 구조체, 인터페이스의 명명된 멤버입니다. 클래스나 구조체의 멤버 변수 또는 메서드를 필드(Fields)라고 합니다. 프로퍼티는 필드의 확장 개념으로, 같은 문법으로 접근하지만 접근자(Accessors)를 통해 private 필드의 값을 읽고, 쓰고, 조작합니다. 프로퍼티는 저장 위치를 직접 명명하지 않습니다. 대신 값을 읽거나(get), 쓰거나(set), 계산하는 접근자를 가집니다. 접근자 (Accessors) 프로퍼티의 접근자에는 실행문이 들어있으며, 값을 가져오기(get) 또는 설정하
리플렉션(Reflection) 객체는 런타임에 타입 정보를 얻는 데 사용됩니다. 실행 중인 프로그램의 메타데이터에 접근하는 클래스들은 System.Reflection 네임스페이스에 있습니다. System.Reflection 네임스페이스는 애플리케이션 정보를 얻고, 런타임에 동적으로 타입, 값, 객체를 추가할 수 있는 클래스들을 포함합니다. 리플렉션의 응용 런타임에 어트리뷰트 정보 보기 어셈블리의 다양한 타입 조사 및 인스턴스화 메서드와 프로퍼티에 지연 바인딩(Late Binding) 런타임에 새 타
어트리뷰트(Attribute)는 클래스, 메서드, 구조체, 열거자, 어셈블리 등 프로그램 요소의 동작에 대한 정보를 런타임에 전달하는 선언적 태그(Declarative Tag)입니다. 대괄호 [ ] 안에 요소 위에 배치하여 사용합니다. 어트리뷰트는 컴파일러 지시사항, 설명, 메서드/클래스 정보 등 메타데이터(Metadata)를 프로그램에 추가하는 데 사용됩니다. .NET Framework는 미리 정의된(Predefined) 어트리뷰트와 사용자 정의(Custom) 어트리뷰트 두 가지를 제공합니다. 어트리뷰트 지정 구문 [어트리뷰트
파일(File)은 특정 이름과 디렉터리 경로를 가진 디스크에 저장된 데이터 모음입니다. 파일을 읽기/쓰기 위해 열면 스트림(Stream)이 됩니다. 스트림은 통신 경로를 통과하는 바이트 시퀀스입니다. 두 주요 스트림: 입력 스트림(Input Stream): 파일에서 데이터 읽기 (읽기 작업) 출력 스트림(Output Stream): 파일에 데이터 쓰기 (쓰기 작업) C# I/O 클래스 (System.IO 네임스페이스) 파일 생성/삭제, 읽기/쓰기, 닫기 등 다양한 파일 작업을 위한 클래스들:
예외(Exception)는 프로그램 실행 중에 발생하는 문제입니다. C# 예외는 프로그램이 실행되는 동안 발생하는 예외적 상황(예: 0으로 나누기)에 대한 응답입니다. 예외는 프로그램의 한 부분에서 다른 부분으로 제어를 전송하는 방법을 제공합니다. C# 예외 처리는 네 가지 키워드(try, catch, finally, throw)를 기반으로 합니다. try: 특정 예외가 활성화되는 코드 블록 식별. 하나 이상의 catch 블록이 따름 catch: 문제 처리하고 싶은 위치에서 예외 처리기로 예외 잡기 fin
정규표현식(Regular Expression)은 입력 텍스트와 매칭될 수 있는 패턴입니다. .NET 프레임워크는 이러한 매칭을 수행하는 정규표현식 엔진을 제공합니다. 패턴은 하나 이상의 문자 리터럴, 연산자, 구성 요소로 이루어집니다. 정규표현식 정의를 위한 구성 요소 문자, 연산자, 구성 요소의 다양한 카테고리가 정규표현식 정의를 가능하게 합니다. 문자 이스케이프 (Character Escapes) 문자 클래스 (Character Classes) 앵커 (Anchors) 그룹화 구성 요소 (Group
전처리기 지시문(Preprocessor Directives)은 실제 컴파일이 시작되기 전 컴파일러에게 정보를 미리 처리하도록 지시합니다. 모든 지시문은 #으로 시작 한 줄에 지시문만 있어야 함 (공백만 허용) 문장이 아니므로 세미콜론(;)으로 끝나지 않음 C# 컴파일러는 별도 전처리기가 없지만, 마치 있는 것처럼 동작 주로 조건부 컴파일(Conditional Compilation)에 사용 C/C++과 달리 매크로 생성 용도로는 사용 안 함 C# 전처리기 지시문 목록
네임스페이스(Namespace)는 한 집합의 이름을 다른 집합과 분리하여 관리하는 방법을 제공합니다. 한 네임스페이스에 선언된 클래스 이름이 다른 네임스페이스의 같은 클래스 이름과 충돌하지 않습니다. 네임스페이스 정의 namespace 네임스페이스_이름 { // 코드 선언 } 네임스페이스에 속한 함수나 변수를 호출하려면 네임스페이스 이름을 접두사로 붙입니다. 네임스페이스_이름.항목_이름; 네임스페이스 사용 예제 using System; namespace FirstSpace { class NamespaceClas
인터페이스(Interface)는 인터페이스를 상속받는 모든 클래스가 따라야 하는 구문적 계약(Syntactical Contract)입니다. 인터페이스는 무엇(What)을 정의하고, 파생 클래스는 어떻게(How)를 구현합니다. 인터페이스는 속성(Properties), 메서드(Methods), 이벤트(Events)를 멤버로 가집니다. 인터페이스에는 멤버의 선언만 포함되며, 구현은 파생 클래스의 책임입니다. 파생 클래스들이 따라야 할 표준 구조를 제공합니다. 추상 클래스도 비슷한 목적을 가지지만, 기본 클래스에서 몇 개의 메서드만 선
C#에서 제공하는 내장 연산자 대부분을 재정의(Overload)하거나 오버로딩(Overloading)할 수 있습니다. 프로그래머가 사용자 정의 타입에도 연산자를 사용할 수 있게 해줍니다. 오버로드된 연산자는 operator 키워드 뒤에 연산자 기호가 오는 특수 이름을 가진 함수입니다. 일반 함수처럼 반환 타입과 매개변수 리스트를 가집니다. 연산자 오버로딩 구현 예: Box 클래스에 + 연산자 오버로딩 public static Box operator+ (Box b, Box c) { Box box = new Box();
다형성(Polymorphism)은 여러 형태를 가짐을 의미합니다. 객체 지향 프로그래밍에서 하나의 인터페이스, 여러 기능으로 표현되곤 합니다. 다형성은 정적(Static)과 동적(Dynamic)으로 나뉩니다. 정적 다형성: 함수에 대한 응답이 컴파일 타임에 결정 (조기 바인딩/Early Binding) 동적 다형성: 런타임에 결정 (지연 바인딩/Late Binding) 정적 다형성 (Static Polymorphism) 컴파일 타임에 함수와 객체 연결. C#은 두 가지 기법으로 구현합니다. 함수 오버로
객체 지향 프로그래밍에서 가장 중요한 개념 중 하나는 상속(Inheritance)입니다. 상속을 사용하면 기존 클래스를 기반으로 새 클래스를 정의할 수 있어, 애플리케이션 생성과 유지보수가 쉬워집니다. 코드 기능 재사용이 가능하고 구현 시간이 단축됩니다. 새 클래스를 만들 때 완전히 새로운 멤버를 작성하는 대신, 기존 클래스의 멤버를 물려받도록 지정할 수 있습니다. 기존 클래스를 기본 클래스(Base Class), 새 클래스를 파생 클래스(Derived Class)라고 합니다. 상속은 IS-A 관계를 구현합니다. 예: 포유류 I
클래스(Class)를 정의하면 데이터 타입에 대한 청사진(Blueprint)을 정의하는 것입니다. 실제 데이터를 정의하는 것은 아니지만, 클래스 이름이 의미하는 바, 즉 클래스 객체가 무엇으로 구성되고 어떤 연산을 수행할 수 있는지를 정의합니다. 객체는 클래스의 인스턴스(Instance)입니다. 클래스를 구성하는 메서드와 변수를 클래스의 멤버(Members)라고 합니다. 클래스 정의 클래스 정의는 class 키워드로 시작하고 클래스 이름이 오며, 중괄호로 클래스 본문을 감쌉니다. <접근_지정자> class 클래스_이름
C 언어