c#
C# 부모 클래스 함수 호출과 오버라이딩 (base / override)
개념 부모 클래스 내 함수를 자식 클래스 재정의 하는 것이며 C++하곤 살짝 다른 개념이다 기본적으로 룰이 존재하는데. 1. 절대로 private이면 안된다. 2. C++과 다르게 같은 함수명을 적어도 컴파일러는 알아채질 못한다. using System; using System.Collections.Generic; using System.Runtime.InteropServices; namespace ConsoleApplication1 { public class Parent { int mVal = 0; public int ValProp { get { return mVal; } set { mVal = value; } } public Parent() { this.mVal = 10; Console.WriteLi..
C# 추상 클래스 (abstract)
추상 클래스(abstract class)와 추상 메서드(abstract method)이다. 추상 메서드는 abstract 예약어가 지정되고 구현 코드가 없는 Method이다. 추상 메서드는 반드시 추상 클래스 안에서만 선언할 수 있으며, 추상 메서드를 하나라도 가지고 있으면 추상 클래스로 만들어줘야 한다. 특징 추상 메서드에는 접근 제한자로 private를 사용할 수 없다. new를 사용해 인스턴스로 만들 수 없다 추상 메서드만을 가질 수 있다. abstract class Employee { public int EmpID { get; private set; } public long Salary { get; set; } public Employee(int empId, long salary) { EmpID ..
C# 인터페이스 (interface)
인터페이스는 계약이라고 볼 수 있다. interface는 클래스가 아니기 때문에 다중 상속이 가능하다. 인터페이스는 추상 메서드만 0개 이상 담고 있는 추상 클래스라고 봐도 무방하다. 특징 Method만을 포함할 수 있다. 비어 있는 인터페이스 정의가 가능하다. 자식 클래스에서 구현할 때, 반드시 public 접근 제한사를 명시해야 한다. (인터페이스명을 직접 붙이면 생략 가능) 인터페이스명을 직접 붙이는 경우에는 반드시 인터페이스로 형변환해야 호출이 가능하다. C#에서는 property가 메서드로 구현되기 때문에 인터페이스에 포함 가능하다. interface IFlyable { void Fly(); } interface IRunnable { void Run(); void Stop(); } abstrac..
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# 원자적 연산 (Interlocked 클래스)
Interlocked 클래스는 int 형 값을 증가시키거나 감소시키는데 사용한다. 멀티 스레드 환경에서 하나의 int 형 전역 변수를 공유한다고 생각해보자. 이런 경우에 A 쓰레드와 B 쓰레드가 값을 동시에 읽어와서 B 쓰레드가 수정한 값을 저장하고, A 쓰레드가 다시 수정한 값을 저장하게 되면 B 쓰레드의 변경사항을 잃어버리게 된다. 지금까지 이러한 자원의 동기화를 위해서 모니터나 뮤텍스를 사용하는 방법을 설명했지만 간단한 int 형의 값을 여러 쓰레드가 공유하는 것이 일반적이기 때문에 이러한 작업을 캡슐화한 클래스를 제공한다. Interlocked 클래스는 System.Threading 클래스에 있으며 주요 멤버는 다음과 같다. 메소드 이름 설 명 CompareExchange 두 대상을 비교하여 값이..
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..