언어 57

C# 의 타입 - 3. 값 타입과 참조타입 / 박싱, 언박싱

참조 타입과 값 타입 CLR은 참조 타입(Reference Type)와 값 타입(Value Type)이라는 두 종류의 타입 체계를 지원한다. 참조 타입은 항상 관리되는 힙에 할당된다. 따라서 참조 타입을 사용할 때 마다 메모리의 할당이 발생하는데, 모든 타입이 참조 타입이라면 엄청난 성능 저하가 있을 것이다. 따라서 성능 향상을 목적으로, 단순하고 자주 사용되는 타입들을 위하여 경량화된 값 타입이 존재한다. 값 타입의 인스턴스는 그 자체가 하나의 필드이며 필드를 얻어내기 위해 역추적을 할 필요가 없고 GC의 관리 대상또한 아니다. C#에서 모든 클래스는 참조 타입이며 모든 구조체, 열거 타입은 값 타입니다. (System.Int32등도 구조체이다.) 모든 구조체 타입은 System.ValueType 추상..

언어/C# 2020.11.14

C++ (복사/이동) 생성자, 할당자, Rule of Three(Five)

Cpp 의 클래스에는 기본 생성자 말고도, 소멸자, 복사 생성자, 복사 할당자, 이동 생성자, 이동 할당자가 존재한다. 위의 다섯가지는 컴파일러가 알아서 만들어 주기 때문에 (기본 생성자 까지도), 일반적으로는 구현할 일이 없지만 만약 클래스에서 raw pointer 멤버 변수 등을 가지고 있어서 메모리 관리가 필요한 경우에는 위와 같은 생성/할당/소멸자를 프로그래머가 직접 구현해 줘야 한다. 이동 생성/할당자를 뺀 세가지를 구현해야 한다는 법칙을 Rule of Three, 이동 생성/할당자를 포함하면 Rule of Five 라고 부른다. 그냥 코드에 주석달았음 참고로 noexcept 같은 경우에는 성능상의 이점도 있다고 한다. C++11 부터는 소멸자 등에 자동으로 컴파일러가 붙여준다고 함 class ..

언어/C++ 2020.11.08

스마트 포인터

RAII RAII : Resource Acquisition Is Initialization 리소스의 라이프사이클과 오브젝트의 라이프사이클을 일치시킨다는 뜻이다. 여기서 리소스란 메모리, 쓰레드, 파일IO, 뮤텍스 ,DB와의 커넥션 등이 있다. C++ 에서는 스마트 포인터를 이용하여 메모리 리소스와 인스턴스의 라이프사이클을 일치시킬 수 있다. unique_ptr 유니크 포인터는 exlusive ownership을 제공하는 스마트 포인터다. 유니크 포인터는 하나의 오브젝트(메모리 영역)을 단 하나의 포인터만 가리키게 한다. include ... class Cat { public : Cat() : mAge{1} {} ~Cat(){} void speak(){cout

언어/C++ 2020.11.08

C# 의 타입 - 2. 기본 타입 (Primitve Type)

기본 타입 (Primitve Type) 32비트의 정수형 변수를 할당한다면 다음과 같이 코드를 쓸 수 있다. System.Int32 a = new System.Int32(); 그런데 이렇게 쓰면 너무 귀찮으니까... 대부분의 컴파일러는 다음과 같이 표현하도록 해준다. int a = 0; 그리고 위와 같은 코드는 System.Int32 타입을 사용한 코드와 의미가 동일한 IL 코드를 만들어준다. 이처럼 컴파일러가 직접 지원하는 데이터 타입들을 기본 타입이라고 부른다. C#의 기본 타입과 FCL에 대응되는 타입은 다음과 같다. 기본 타입 FCL 타입 CLS 호환 비고 sbyte System.SBtye ㄴㄴ byte System.Byte ㅇㅇ short System.Int16 ㅇㅇ ushort System.U..

언어/C# 2020.10.31

C# 의 타입 - 1. 타입의 기초

System.Object c#의 모든 타입들은 System.Object를 상속받는다. class A // class A : System.Object 와 같다. (암시적으로 상속) { // code } Object 클래스에는 필드는 존재하지 않으며 다음과 같은 메서드들이 존재한다. (~Object()는 Finalize 메서드이며 protected임) namespace System { public class Object { public Object(); ~Object(); public static bool Equals(Object objA, Object objB); public static bool ReferenceEquals(Object objA, Object objB); public virtual boo..

언어/C# 2020.10.31

L_value와 R_value

L-value & R-value L value는 왼쪽에 있는 거, R value는 오른쪽에 있는 거... 가 아니다. L-value는 나중에 다시 부를 수 있는 것. R-value는 그렇지 못한 것.으로 구분하면 쉽다. 예를 들어, int a=0; int b=a; 에서 a 는 L-value이다. 0은 다시 부를 수 없으므로 R-value이다. b 역시 L이겠지? R-value는 임시적으로 생성된 값이라고 볼 수 있다. 그러면 대체 왜 이런 걸 구분할까? R-value를 잘 이용하면 메모리를 효율적으로 사용할 수 있기 때문이다. 예를 들어, 어떤 값이 R-value이고 이 값을 전달하기 위해 몇 개의 변수를 거친다고 가정해보자. 이 값을 전달하기 위해 변수를 거칠 때마다 값을 복사할 필요가 있을까? 어차피..

언어/C++ 2020.10.11