Language/C#

· Language/C#
서론 C/C++ 언어는 힙에 객체를 할당하기 위해 비싼 비용을 치르는 문제를 갖고 있다. C/C++ 기반의 프로그램을 실행하는 C-Runtime은 객체를 담기 위한 메모리를 여러 개의 블록으로 나눈 뒤, 이 블록을 링크드 리스트로 묶어 관리한다. 가령 어떤 객체를 힙에 할당하는 코드가 실행되면, C-Runtime은 메모리 링크드 리스트를 순차적으로 탐색하면서 해당 객체를 담을 수 있을만한 여유가 있는 메모리 블럭을 찾는다. 적절한 크기의 메모리 블록을 만나면 프로그램은 이 메모리 블록을 쪼개서 객체를 할당하고 메모리 블록의 링크드 리스트를 재조정한다. 단순히 메모리 공간에 데이터를 집어넣는 것이 아니라 공간을 “탐색”하고 “분할” 하고 “재조정”하는 오버헤드가 필요하다는 것이다. C#의 CLR은 자동 메..
· Language/C#
ref, out 키워드를 사용하면 매개변수를 "참조에 의한 전달(pass by reference)" 을 할수있다. using System; namespace RefReturn { class MainApp { public static void Swap(int a, int b) { int temp = b; b = a; a = temp; } static void Main(string[] args) { int x = 3; int y = 4; Console.WriteLine("x:x,y:y");Swap(x,y);Console.WriteLine("x:x,y:y");Swap(x,y);Console.WriteLine("x:{x}, y:{y}"); } } } 위 코드는 Swap() 함수의 두 매개변수의 교환을 수행하지 못한다. 매개변수도 메소드 외부에서 메소드 내부로 데..
· Language/C#
확장 메소드는 기존 클래스의 기능을 확장하는 기법이다. 기반 클래스를 물려받아 파생 클래스를 만든 뒤 여기에 필드나 메소드를 추가하는 상속과는 다르다. 확장 메소드를 선언하는 방법은 다음과 같다. static 한정자를 이용해 클래스를 선언한다. static 한정자를 이용해 메소드를 선언한다. 메소드의 첫번째 매개변수는 반드시 this키워드와 함께 확장하고자 하는 클래스의 인스턴스여야한다. 그 뒤에 실제 확장 메소드를 호출할때 전달할 매개변수를 선언한다. 아래의 코드는 확장 메소드 선언의 예시이다. public static class Vector2Extension { public static int Half(this Vector2 myVec2) { Vector2 result = myVec2; return ..
· Language/C#
For의 컬렉션 접근 방법 for문은 콜렉션의 데이터에 직접 접근하여 해당 리스트의 값을 수정할 수 있습니다. List items = new List() { new Item("Sword"), new Item("Gun") }; for (int i = 0; i < items.Count; ++i) { items[i] = new Item("None"); Console.WriteLine(items[i].Name); } // Result None None Foreach의 콜렉션 접근 방법 foreach문은 컬렉션의 복사본에 접근합니다. 복사본의 데이터들은 원래 컬렉션의 데이터들을 참조하고 있기 때문에 데이터 안에 있는 값을 수정하는 것은 문제가 되지 않지만, 데이터 그 자체를 바꾸는 것은 불가능합니다. List i..
· Language/C#
C#은 컴파일 타임 상수와 런타임 상수 두 유형의 상수를 가진다. 런타임 상수는 readonly 키워드를 사용하여 선언하고, 컴파일타임 상수는 const키워드를 사용한다. 이 둘은 얼핏 비슷하게 보이지만, 접근하는 방법에서 차이를 보인다. 컴파일타임 상수는 컴파일타임에 변수가 값으로 대체된다. 반면, 런타임 상수는 런타임에 값이 평가된다. readonly 키워드를 이용하여 선언된 런타임 상수는 컴파일타임 상수처럼 컴파일타임에 값으로 대체되지 않고 상수에 대한 참조로 컴파일된다. 이러한 차이로 인해 각각의 상수형은 서로 다른 한계를 가진다. 컴파일 타임상수는 내장자료형에 대해서만 사용될 수 있다. 반면 런타임상수는 어떤 타입과도 함께 사용될 수 있다. 또한 런타임 상수는 멤버 초기화 구문뿐 아니라 생성자를..