프로젝트를 하다보면 어느 특정한 사건에서 바로 메서드를 호출하고 싶은 상황이 있다. 이를 가능하게 하는 기능은 여러가지 있지만 그 중 델리게이트 에 대해서 설명하고자 한다. 델리게이트란? Delegate는 대리자 라고 불리며 메서드를 갖고와서 실행하는 기능이기 때문에 메서드에 대한 참조를 갖고 있다. 그렇기 때문에 delegate 인스턴스를 통해 참조하고 있는 메서드를 호출할 수 있다. 이러한 특징으로 특정 이벤트가 발생했을 때 원하는 함수를 호출할 수 있게 만들어 준다. 주의할점은 메서드를 구현할 때 반환 형식이 델리게이트의 반환 형식과 같아야 한다. 사용법 델리게이트는 namespace나 클래스 내부에서도 선언 가능하며 delegate 타입 함수명 형식으로 선언 가능하다. 위 코드에서는 델리게이트를 ..
TIL/C#
1. 제네릭이란? 제네릭은 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 기술을 말합니다. 그렇기 때문에 제네릭은 클래스, 구조체, 인터페이스 및 메서드의 형식 매개 변수에 사용자가 원하는 타입을 지정해줘야 하고 원하는 형식을 매개 변수처럼 넘겨줘야합니다. 2. 제네릭의 장점 2 - 1. 제네릭의 큰 장점은 형식 안전성입니다. object 타입에 비해 제네릭은 형식을 엄격하게 검사하기 때문에 컴파일러에서 형식 안정성을 보장해야 하는 부담이 없어집니다. 이러한 이유로 데이터 형식 테스트를 할 필요 없고 형식 캐스팅의 필요성과 런타임 오류 발생 가능성도 감소합니다. 2 - 2. 제네릭은 클래스, 구조체, 인터페이스 및 메서드를 원하는 타입으로 지정 후 사용할 수 있기 때문에 코드의 재사용성이 ..
Collection을 제작하는 과정에서 배열, List, ArrayList, Dictionary 중 하나를 선택하여 사용하곤 한다. 모든 사람이 같은 컬렉션을 쓰지 않고 다르게 쓰이는데 왜 그런지 각 개념의 차이점을 설명하면서 알아보고자 한다. 1. Array란? Array는 고정 길이를 가진 동일한 데이터 타입의 컬렉션이다. 고정 길이를 가지고 있기 때문에 크기에 대한 동적 할당이 불가능 하다. 정적이며 연속적이고 메모리 효율적이다. 그래서 정해진 크기에서는 실행 속도가 빠르지만 반대의 상황에서는 메모리가 크게 낭비될 수 있다. 2. List란? List는 고정되지 않는 가변 크기를 가지고 있는 동일한 데이터 타입의 컬렉션이다. 그렇기 때문에 데이터의 크기를 동적으로 할당 가능하다. List는 포인터를..
박싱과 언박싱에 대한 개념은 잘모르지만 무의식적으로 코딩할 때 자연스럽게 쓰는 경우가 있다. 그렇기 때문에 박싱과 언박싱에 대한 개념을 확실히 알고 사용하면 좋을 것 같아서 이에 대해 설명하고자 한다. 박싱(boxing)이란? boxing은 가비지에서 수집되는 힙에 값 형식을 저장하는 데 사용한다. 이를 풀어서 설명하자면 boxing은 값 형식을 object형식이나 값 형식에서 구현된 임의의 인터페이스 형식으로 암시적 변환을 한다. 그 다음 힙에 개체 인스턴스가 할당되고 값이 새 개체에 복사된다. i라는 변수를 선언한 뒤 object o = i라는 박싱 연산을 적용하는 과정이다. 힙에서 개체 인스턴스가 할당되고 그 곳에 값 형식이 복사되는 것을 볼 수 있다. 언방식(unboxing)이란? 박싱은 값 형식..
얼마전에 가비지 컬렉터에 관하여 개념을 정리하여 글을 적었다. 근데 정보를 찾다가 발견한거는 가비지 컬렉터와 가비지 컬렉션은 같은 단어인줄 알았는데 사실은 다른 개념이었다. 그래서 가비지 컬렉션에 관한 개념을 정리하고자 한다. 1. 가비지 컬렉션이란? 동적으로 할당된 메모리 영역을 찾아서 만약 사용하지 않는 영역이면 자동으로 해제하는 메모리 관리 기법이다. 사용하지 않는 영역은 포인터를 이용하여 변수 접근 가능메모리를 파악하여 찾아낸다. 이러한 가비지 컬렉션 과정을 수행하는 부분을 가비지 컬렉터(Garbage Collector)라고 부른다. 2. 가비지 컬렉션의 장점과 단점 장점 가비지 컬렉션은 메모리를 자동으로 관리해주기 때문에 사용자가 직접 메모리를 할당, 해제해주는 부분을 완벽하게 관리할 필요가 없..
C#에는 공용언어런타임인 CLR에 가비지 컬렉터가 있다. 그래서 개발자가 사용하는 메모리를 모두 가비지 컬렉터에서 알아서 관리해줄거라 생각하는데 사실 아니다. 파일 IO, DB, Connection 등 이러한 것들은 CLR에 의해 관리되지 않는다. 그래서 그에맞는 기능들을 사용해야 하는데 이것에 대해 설명하고자 한다. 1. Finalizer Finalizer 란 "종료자" 라는 뜻으로 위에서 말한 IO, DB, Connection 등을 직접 해제할 수 있는 기능이다. Finalizer는 이러한 형식으로 작성하여 사용된다. 2. Finalizer의 단점 Finalizer는 가비지 컬렉터가 가비지라고 판단한 시점부터 문제가 생긴다. 일반적인 메모리라면 즉시 해제되지만 Finalizer의 경우 이를 호출한 다..
자바나 C#을 이용하던 사람들이면 가비지 컬렉터라는 개념을 한 번은 들어봤을 것이다. 메모리를 관리해주는 것은 알겠는데 어떤 방식으로 관리를 해주는지 자세히 모른다. 그렇기 때문에 가비지 컬렉터에 대한 개념을 설명하고자 한다. 1. 가비지 컬렉터란? 공용 언어 런타임에서 가비지 컬렉터는 자동 메모리 관리자 역할을 하는데 주로 메모리 할당 및 해제를 관리해준다. 그래서 따로 메모리를 할당 및 해제하는 코드를 작성하지 않아도 된다. ex) C++의 Malloc 2. 가비지 컬렉터 구성 가비지 컬렉터는 포인터가 담긴 가상 주소 공간이 있다. 하지만 이 공간은 CLR(공용 언어 런타임)에서 관리해주기 때문에 개발자가 건들일 필요가 없다. 가상 주소 공간은 관리되는 힙 즉, Managed Heap 이라고 부르고 ..
Struct와 Class는 비슷한 기능을 하고 있지만 확실하게 다른 구조를 가지고 있다. 기능을 사용할 때 확실히 알고 쓰는거랑 모르고 쓰는거는 큰 차이가 있기 때문에 이 둘의 대한 개념을 설명하고자 한다. Struct란? 영어 뜻 그대로 구조체 형식이며 관련 기능을 캡슐화 할 수 있다. 구조체 형식은 값 형식이다. Class란? Class는 Struct와 비슷한 기능을 하지만 상속이 가능하며 클래스 형식은 참조 형식이다. Struct와 Class의 차이점 우선 테스트를 진행 할 Class와 Struct를 만들었다. 둘은 현재 이름과 나이, 이름과 나이를 표시해주는 함수를 공통적으로 가지고 있으며 이를 통해 둘의 차이점을 알아보고자 한다. 선언한 Class와 Struct를 Main부분에서 사용하는 부분이..