본문 바로가기

분류 전체보기

(86)
람다식(Lambda Expression) 람다식이란, 이름이 없는 익명 메서드를 정의하는 방법으로, 주로 콜백 메서드나 LINQ와 같이 사용한다. 일반적으로 메서드는 이름을 통해 호출되지만 델리게이트와 같은 메서드 참조 타입에 연결된 메서드는 이름이 꼭 필요하진 않다. 그래서 람다식을 통해서 이름이 없는 익명의 메서드를 정의하고, 델리게이트에 연결하여 사용한다. 그리고 이때, 매개 변수를 넘겨받지 않고 람다식이 정의된 스코프에 정의된 변수를 사용할 수 있어 재사용되지 않는 간단한 함수를 간결하게 작성할 수 있다는 장점이 있다. 하지만 반복문 같은 작업에서는 오히려 메모리 할당이 늘어나 성능이 저하될 수 있기 때문에 간단한 작업에서는 문제가 없지만 복잡한 작업에서는 성능 저하가 발생할 수 있다.
박싱(Boxing)과 언박싱(UnBoxing) 박싱(Boxing)은 값 형식을 참조 형식으로 변환해 주는 것을 의미한다. 반대로, 언박싱은(UnBoxing)은 박싱했던 값을 다시 원상태로 복귀시키는 것을 의미한다. object타입이 참조형식이기 때문에 object형으로 형변환이 일어나는 것을 박싱이라고 하고, 원상태로 복귀시키는 것이 언박싱이다. 박싱/언박싱을 사용하는 예를 들면, int[] array = new int[2]; 이러한 배열을 만든다고 하였을 때, 배열에는 특정 타입이 필요하다. 이에 따라서 배열에는 string타입을 넣을 수 없다. 하지만 배열을 int가 아닌 object 타입으로 선언한다면, object[] array = new object[2]; 이러한 형식으로 구조를 짠다면 다양한 타입을 다 넣을 수 있다. 이렇게 선언을 하면 ..
가비지 컬렉터(GC) 가비지 컬렉터는 C#의 메모리 관리 시스템의 핵심 컴포넌트로, 사용되지 않는 메모리를 자동으로 찾아서 해제하는 역할을 한다. 개발자가 직접 메모리를 관리하지 않고 메모리 해제, 메모리 할당 요청 처리, 새 객체에 할당 가능한 메모리 공간을 찾아주는 등의 작업을 자동으로 해주는 역할을 한다. 가비지 컬렉터는 Mark and Sweep 알고리즘을 사용하여 실행 중인 프로그램에서 접근 가능한 모든 객체를 표시하고, 접근 불가능한 객체는 메모리에서 제거한다.
제네릭(Generic) 제네릭은 타입을 매개변수로 받아 코드를 일반화하는 기술이다. 제네릭을 사용하면 클래스, 메서드 등을 여러 타입에서 재사용할 수 있다. 예를 들면, List와 같이 타입을 동적으로 결정할 수 있는 컬렉션을 생성할 수 있다. 즉, 불필요한 클래스 구현을 방지하고 타입 검사가 엄격하기 때문에, 애플리케이션 배포 전 미리 문제를 해결할 수 있고 명시적 변환보다 속도가 빠르기 때문에 코드의 재사용성과 유연성이 향상된다.
델리게이트(Delegate) 델리게이트는 메서드를 참조하는 타입으로, 메서드 호출을 위임하거나 콜백 패턴을 구현하는 데 사용한다. 델리게이트는 '대리자'라고도 하며, 메서드에 대한 참조를 갖는 형식이다. 함수포인터나 콜백과 동일한 동작으로, 델리게이트를 호출하면 참조하고 있는 메서드가 호출된다. 참조하는 함수의 반환 형식 및 매개변수를 사용하여 선언하며, 선언한 함수 형식이 일치하는 메서드에 대해서만 참조가 가능하다. 델리게이트는 C#에서 다형성과 유연성을 제공하며, 객체 지향 프로그래밍의 핵심 원칙 중 하나인 "의존성 역전 원칙"을 따르게 해준다. 또한, 런타임에 메서드를 동적으로 선택하고 호출할 수 있어 다양한 상황에서 활용할 수 있는 강력한 기능이다.
배열(Array)과 리스트(List) 배열은 특정 타입의 연속된 메모리를 정적으로 선언하여 관리할 수 있다. 배열은 생성 시 메모리 공간의 크기가 고정되어 있으며 변경이 어렵다 리스트는 특정 타입의 연속된 메모리를 동적으로 관리하며 크기가 부족할 경우 2배로 할당하고, 메모리가 없다면 새로운 메모리 공간을 기본 용량만큼 만든다. 리스트는 동적 크기의 배열로 요소를 추가하거나 제거할 수 있는 유동성을 가지고 있다. 하지만 리스트도 내부적으로는 배열로 이루어져 있기 때문에 가능하다면 배열 크기를 먼저 정해주는 것이 좋고, 배열을 옮김으로써 생기는 부하를 방지할 수 있다. 이렇게만 보면 리스트가 성능적으로 우월하다고 느껴 배열보다는 리스트만 사용하게 될 것 같지만, 리스트를 무분별하게 사용하는 것도 지양해야 한다. 1. 메모리 사용량 증가 리스트..
접근제한자란? 접근 제한자는 클래스, 변수, 메서드 등의 접근 범위를 제한할 때 사용한다. C#에서는 크게 6가지 정도로 알고 있으면 좋다. 1. public : 어떠한 클래스, 메서드, 변수든지 어디에서나 접근이 가능하다. 2. private : 선언된 필드의 해당 멤버는 오직 같은 클래스 내에서만 접근이 가능하다. 3. protected : 같은 클래스 또는 해당 클래스를 상속받은 클래스에서만 접근이 가능하다. 4. internal : 같은 어셈블리 내에서만 접근할 수 있다. 5. protected internal : 같은 어셈블리 내에서만 접근이 가능하며, 해당 클래스를 상속받은 다른 어셈블리 클래스에서도 접근 가능하다. 6. private protected : 같은 어셈블리 내의 해당 클래스 또는 해당 클래스를..
클래스(Class)와 구조체(Struct)의 차이 클래스(Class)는 상속이 가능한 '참조 타입'이지만, 구조체(Struct)는 '값 타입'으로서 상속을 할 수 없다. 또한 구조체는 스택(Stack) 영역에 할당이 되며 메모리 크기가 작고 한정적이다. 클래스는 힙(Heap)에 할당이 되며 많은 메모리를 가질 수 있다. 하지만 스택은 가비지가 발생하지 않는 다는 장점이 있기 때문에 성능상의 이점이 있다. 또한, 추가적으로 구조체로 선언을 하더라도 힙에 할당이 되는 경우가 있다. 1. 클래스의 멤버로 구조체가 있을 경우 구조체 포함하여 힙에 할당 2. 구조체를 배열이나 리스트로 사용하는 경우 힙에 할당 그 외에도 구조체의 멤버 변수로 클래스가 있을 경우, 클래스는 힙에 할당되고 구초제는 클래스의 메모리 주소값을 가지고 있는 참조 변수만 포함하여 스택에 할..