프로그래밍 언어/C#
C# 클래스 접근 제한자 (Access Modifier)
접근 제한자에는 public, protected, internal, private가 있다. 클래스 기본형은 internal이다. 접근 제한자 설명 private 클래스 내부에서만 접근이 가능하다. public 모든 곳에서 해당 멤버로 접근이 가능하다. internal 같은 어셈블리에서만 public으로 접근이 가능하다. protected 클래스 외부에서 접근할 수 없으나 파생 클래스에서는 접근이 가능하다. protected internal 같은 어셈블리에서만 protected으로 접근이 가능하다. using System; using System.Collections.Generic; using System.Runtime.InteropServices; namespace ConsoleApplication1 {..
C# 힙 구조 (Heap)
스택은 단순히 데이터를 넣고 뺄 수 있는 구조이며, System.ValueType을 상속하는 기본 데이터형(int, long, bool 등)만 저장할 수 있다. 힙은 예약된 주소 공간을 뜻한다. 최초에 프로세스가 초기화될 때 시스템은 프로세스 주고 공간 내에 하나의 힙을 생성한다. 이 힙을 프로세스의 기본 힙이라 하며, 기본 할당 크기는 1M로 정해져있다. 닷넷에서는 가비지 컬렉터가 자원을 관리하기 때문에 힙에 대한 함수를 직접 제공하지 않지만 Win32 API GetProcessHeap() 사용하여 현재 프로세스의 힙을 가져올 수 있다. using System.Runtime.InteropServices; public unsafe class Memory { static int ph = GetProcess..
C# 구조체 (struct) 클래스 (class) 차이
struct 코드 struct Point { public int X; public int Y; public int Z; public Point(int x, int y, int z) { this.X = x; this.Y = y; this.Z = z; } public static Point operator +(Point p1, Point p2) { return new Point(p1.X + p2.X, p1.Y + p2.Y, p1.Z + p2.Z); } public String toString() { return "x: " + X + ", y: " + Y + ", z: " + Z; } } class 코드 class Point { public int X; public int Y; public int Z; pub..
C# 클래스 타입 업/다운 캐스팅 (Up-DownCasting)
업캐스팅 부모 클래스 객체를 자식 클래스 객체로 변환. 인스턴스화 또는 자식 클래스 객체 할당하는 방법이 존재. 다운캐스팅 자식 클래스 객체를 부모 클래스로 객체로 변환. 오직 부모 클래스 객체로부터 할당만 가능. using System; using System.Collections.Generic; using System.Runtime.InteropServices; public class Parent { public virtual void Print() { Console.WriteLine("Parent 클래스"); } } public class Child : Parent { public override void Print() { Console.WriteLine("Child 클래스"); } } public..
C# 읽기 전용 (readonly)
readonly 키워드는 다음 네 가지 컨텍스트에서 사용할 수 있는 한정자다. 필드 선언에서 필드에 대한 할당을 나타내는 readonly는 선언의 일부로 또는 동일한 클래스의 생성자에서만 발생할 수 있다. 필드 선언과 생성자 내에서 읽기 전용 필드를 여러 번 할당 및 재할당할 수 있다. 값 형식은 해당 데이터를 직접 포함하므로 값 형식인 readonly 필드는 변경할 수 없다. 참조 형식에는 해당 데이터에 대한 참조가 포함되므로, readonly 참조 형식인 필드는 항상 같은 개체를 참조해야해당 개체를 변경할 수 있다. 생성자가 종료된 후에는 readonly 필드를 할당할 수 없다. 이 규칙의 의미는 값 형식과 참조 형식에서 서로 다르다. readonly struct 형식 정의에서 readonly는 구조..
C# 클래스 상속 불가 및 함수 오버라이딩 불가 (sealed)
클래스에 적용된 경우 sealed 한정자는 다른 클래스가 해당 클래스에서 상속하지 못하도록 한다. using System; using System.Collections.Generic; using System.Runtime.InteropServices; public class Parent { } public sealed class Derived : Parent { } public class AnotherDerived : Derived { } public class Test { public static void Main() { AnotherDerived anotherDerived = new AnotherDerived(); } } 함수 같은 경우에는 가상 함수 오버라이딩 방지용으로 쓰여진다. using Sys..
C# 중첩 클래스 (Nested Class)
클래스 내부에서 클래스를 정의할 수 있다. 중첩 클래스를 사용하여 클래스를 그룹화할 수 있으며, 클래스의 사용 범위를 제한할 수 있다. class OutsideClass { // ... class InsideClass { // ... } } OutsideClass 내부에 InsideClass 클래스를 정의했으므로 OutsideClass는 중첩 클래스다. 사용하는 이유 클래스를 논리적으로 그룹화할 수 있다. 특정 클래스 내부에서만 사용되기 때문에 코드를 더 쉽게 파악할 수 있으며, 유지 관리가 쉽다. 특정 클래스 내부에서만 사용되므로 클래스 구조가 단순해진다. 예제 학교에는 선생님이 존재하므로 School 클래스 내부에 Teacher 클래스를 선언한다. public class School { public ..
C# 부분 클래스 (partial)
partial 키워드는 C#에서 부분 클래스를 지정한다, 장점으로는 여럿이서 하나의 프로젝트를 작업할 시 클린 코드를 유지할 수 있다는 점이다. 여러 책임이 있는 클래스가 있는 경우 각 클래스를 두 개의 구분자 클래스로 분할해야 한다. 부분 클래스를 사용하면 한 클래스의 정의를 여러 파일로 분할할 수 있다. 이 튜토리얼에서는 Person 클래스의 정의를 Person1.cs 및 Person2.cs 여러 파일로 분할한다. Person.cs using System; namespace partial_class { public partial class Person { private int id; private string name; public Person(int id, string name) { this.id ..
C# 인덱서 (Indexer)
인덱서는 인덱스를 이용해 객체 내의 데이터에 접근하게 해주는 프로퍼티이다. 인덱서를 선언하는 방법 class 클래스이름 { // 한정자 인덱서형식 this[형식 인덱스식별자] { get { // 인덱스식별자를 이용하여 내부 데이터 반환 } set { // 인덱스식별자를 이용하여 내부 데이터 저장 } } } 인덱서는 프로퍼티처럼 식별자를 따로 가지지는 않는다. 프로퍼티는 이름을 통해 객체 내의 데이터에 접근하지만 인덱서는 인덱스를 통해 객체 내의 데이터에 접근한다. 인덱서의 선언 예 인덱서를 통해 정수 형식 배열 array에 접근한다. 인덱서를 통해 데이터를 저장할 때 인덱스보다 배열의 크기가 작다면 배열의 크기를 인덱스에 맞춰 재 조정하는 코드이다. class MyList { private int[] a..
C# 확장 메서드 (Extension Method)
확장 메서드(MSDN 링크) 는 C# 3.0부터 추가된 기능으로 미리 정의된 형식에 사용자 정의 함수를 확장(추가)시키는 작업을 수행한다. 예로 들어서 string 형식에 Print라는 함수를 확장할 때 일반적인 경우라면 형식에 메서드를 추가하기 위해서는 해당 형식의 소스 코드가 필요하다. string 형식은 mscorlib (Multi-language Standard Common Object Runtime Library, 다국어 표준 공용 언어 런타임 라이브러리) 프로젝트에 포함되어 있으며, 변경 후에는 이 프로젝트를 다시 빌드하여 어셈블리를 만들어야 한다. 깃헙 링크 하지만, 확장 메서드를 사용한다면 해당 형식의 코드를 변경하지 않고 내 코드에서 어떤 형식이던지 메서드를 확장시킬 수가 있게 된다. 확..