참조

    [C#] 참조에 의한 매개변수 전달 (ref, out)

    값에 의한 호출 (Call by value) 함수와 메소드를 호출할 때, 필요한 값들을 전달해주기 위해 매개변수에 값을 넣어 전달해 준다. 허나, 기본적으로 값 형식(Value type)은 매개 변수로 전달 시에 해당 인자의 값을 복사해서 전달을 한다. 이건 함수와 메소드에서 값을 리턴할 때도 마찬가지다. 이것을 값에 의한 호출(Call by value)이라고 한다. 두 매개 변수를 받아서 서로 값을 바꾸는 Swap() 함수에서 이런 예시가 자주 나온다. static void Swap(int x, int y) { int temp = x; x = y; y = temp; } static void Main(string[] args) { int x = 3; int y = 5; Swap(x, y); Console..

    C# 자기 자신 참조 (this) / 위임 생성자 (delegating constructor)

    C#은 C++과 다르게 위임 생성자 호출 시 부모 클래스 또는 자기 클래스 명칭을 사용하지 않는다. 아래와 같이 하면 에러가 뜬다. using System; using System.Collections.Generic; using System.Runtime.InteropServices; namespace ConsoleApplication1 { public class Test { int mVal = 0; public int ValProp { get { return mVal; } set { mVal = value; } } public Test() { Console.WriteLine("기본 생성자"); } public Test(int Val) : Test() { ValProp = Val; Console.Writ..

    C++ 자기 자신 참조 (this)

    아래 코드를 살펴보면 Set 함수에서 멤버 변수 val에 파라미터로 넘어오는 값을 대입하고자 하는데 공교롭게도 val을 파라미터로 넘어오는 값으로 인식한다 val은 초기화가 안됐으므로 쓰레기값이 출력될거다. #include using namespace std; class Parent { int val; public: void Set(int val) { val = val; } int Get() const { return val; } }; int main() { Parent parent; parent.Set(10); cout

    C++ 참조 대상 수 (Reference Counting)

    Reference Counting은 객체의 소유권 관리( = 라이프 사이클 )의 방법 중 하나로 객체를 참조(포인팅) 하고 있는 횟수를 추적하여 그 횟수가 0이 되면 메모리에서 해제(소멸)한다. 대부분의 Managed Language (python, c#, swift등 메모리 관리를 직접 하지 않는 언어 ) 에서 널리 사용되고 있다. 장점 - 메모리를 직접 해제하는 번거로움이 사라진다. - 객체의 소유권을 공유할 수 있다 - 객체 관리 매커니즘이 비교적 단순해서 빠르다. (Garbage Collection) 단점 - 순환 참조 문제가 있다. c++ 에서의 구현방식에는 크게 두가지가 있다. Intrusive Reference Counting (침습성 참조 카운팅) - 객체에 대한 참조 카운트가 "내장" 되..

    C++ 순환 참조 (Circular Dependency) & 데드락

    순환 참조 문제는 비단 Reference Counting 뿐만이 아니라 다양한 영역에서 이를 피하는것이 매우 중요하다. 설계적 관점에서, 서로 참조를 하는 두 객체가 있다면 의존 관계가 양방향이 되고 의존성(Dependency)이 커지기 때문에 코드 관리에 어려움이 생긴다. 멀티 스레드( or 프로세스 ) 환경에서는 Resource를 점유한 상태로 새 Resource의 요청이 "순환"하는 경우 교착 상태(Dead Lock)에 빠지게 된다. class ObjectA { public: ObjectA() { std::cout

    C# Boxing Unboxing 박싱 언박싱 값>참조, 참조>값

    Boxing ( 박싱 ) : 값 형식을 참조 형식으로 변환하는 것을 말한다. boxing은 암시적으로 발생한다. ( 예를 들어 int, float 를 object 로 변환하는 것을 말하는데 이 과정에서 단순 참조의 20배에 해당 하는 오버헤드와 메모리의 추가 사용이 발생한다. ) int test = 100; object tetsObj = test; UnBoxing ( 언박싱 ) : 참조 형식을 값 형식으로 변환하는 것을 말한다. Unboxing은 명시적으로 발생한다. ( 예를 들어 object를 int, float로 변환하는 것을 말하는데 이 과정에서 일반적인 할당의 4배에 달하는 시간이 소요된다. ) int test = 100; object testObj = test; int i = (int)test;..