공부/C++ \C# 11

c# try catch finally

try catch 를 쓰는 이유 - https://stackoverflow.com/questions/4540155/why-cant-i-write-just-a-try-with-no-catch-or-finally catch 를 쓰면 throw 한 exception 을 삼켜 버린다. 그러므로 catch 를 쓸거면 exception handling 과 로그를 남겨야 한다. 만약 적절한 exception handing 과 로그를 남기지 않을 거면 catch 를 쓰지 말고 exception 을 throw 하게 냅두는 것이 낫다. 이후에 당연히 throw 한 exception 을 보고 처리를 해야 한다. catch 를 쓰지 않고 try - finally 만 쓰는 경우도 있다. finally 는 exception 을 ..

공부/C++ \C# 2023.08.01

c# init 키워드

프로퍼티의 get 지정자에 private 을 붙이면 선언한 클래스(구문) 내에서만 수정이 가능하다. init 키워드를 사용하면 private 보다 더 제한된 방법으로만 변수를 바꿀 수 있다. init 키워드를 사용하면 초기화 시점 외에는 변수 변경이 불가능하다. class Person { public string Name { get; init;} private string _name; } int Main() { var john = new Person { Name = 1984 }; john.Name = 1926; //Not allowed, as its value can only be set once in the constructor } init 보다 값 변경을 더 제한하는 키워드는 readonly, con..

공부/C++ \C# 2023.07.26

정수의 합이 오버 플로우 났을 때

정수의 합이 오버 플로우가 났을 때 더하는 정수들을 더 큰 자료형으로 캐스팅 한 후에 더한다. 더한 값을 동일하게 큰 자료형에 저장하면 오버 플로우가 나지 않고 정상적인 합을 구할 수 있다. int32_t num1 = INT32_MAX; int32_t num2 = INT32_MAX; // num1 + num2 의 값은 오버플로우가 나서 sum 은 -2 이다. int32_t sum = num1 + num2; // num1 + num2 의 값은 이미 오버플로우가 났기 때문에 int64에 저장해도 sum 은 -2 이다. int64_t sum = num1 + num2; // num1 과 num2 를 int64_t 형으로 캐스팅하면 오버플로우가 나지 않고 정상적인 값이 나온다. int64_t sum = (int6..

공부/C++ \C# 2023.05.03

partial 키워드

Partial Class, Struct, Interface C#은 클래스를 한 곳이 아닌 여러 소스 파일에서 정의를 할 수 있다. 그리고 컴파일할 때 나눠진 partial class들을 합친다. 한 partial class의 코드는 나중에 하나로 합친 클래스에 영향을 미치는데, 예를 들어 순수 가상 함수를 한 partial class에서 정의하면 클래스 전체가 추상화 된다. 또 서로 다른 partial class에서 여러 클래스들을 상속 받았을 때 컴파일 과정에서 전체 클래스는 partial class들이 상속 받은 모든 클래스들을 모두 상속 받는다. partial class Earth : Planet, Rotate {} partial Class Earth : Moon {} partial class Ea..

공부/C++ \C# 2020.07.14

C++ 프로그래밍 : 런타임 타입 정보(Runtime Type Information)

C++ 프로그래밍 런타임 타입 정보(Runtime Type Information) 클래스 사이 타입 변환에 대해 두 번에 걸쳐 자세한 소개를 했다. 간단히 떠올려보면 강제 타입 변환을 비롯해 static_cast, reinterpret_cast에 관련한 성질을 중점적으로 알아봤다. 몇몇 개발자는 C++ 타입 변환 중에 자바(Java)에 필적할만한 RTTI(Runtime Type Information)를 추가적으로 소개해주면 좋겠다는 의견을 제시했다. 비록 RTTI가 C++ 개발에 많이 사용되는 편은 아니지만 C++이 현대화하고 있는 추세에 맞춰 RTTI를 한번쯤 이해하고 가는 것은 많은 도움이 될 수 있을 거라는 생각이 들었다. 따라서 이번 글에서는 C++의 RTTI를 자세히 알아보겠다. 1. 다이나믹 ..

공부/C++ \C# 2020.06.03

인라인 (Inline)

사용 목적 C++에서 함수를 호출하면 어느정도의 비용이 듭니다. 함수를 호출하기 전에 컴파일러에서 자동으로 생성하는 코드의 일부를 Prefix라고 합니다. 함수 호출하기 전, Prefix의 코드를 실행해 CPU의 레지스터 상태, 플래그 등을 스택에 저장합니다. 이 작업은 메모리와 시간을 소요해서 실행 속도를 저하 시킵니다. 메모리나 성능이 제약된 프로세서를 프로그래밍 할 땐 이런 오버헤드는 무시하지 못할 성능 저하의 요인이 됩니다. 이 오버헤드를 줄이기 위해서 인라인 키워드를 함수 앞에 붙여 사용합니다. 인라인 키워드를 붙인 함수를 호출하는 곳에 함수의 코드를 그대로 치환해 함수 호출 비용이 없습니다. 또한 이런 작업이 컴파일 도중에 일어나기 때문에 런타임 도중에 함수를 호출해서 생기는 성능 저하가 없습..

공부/C++ \C# 2018.08.08

vector의 size와 capacity

벡터의 reserve와 resize의 차이에 대해서 이해하기 위해선 size와 capacity에 대해 알고 있어야 합니다. 위 그림을 보면 capacity는 벡터의 요소(element)들을 담을 수 있는 메모리가 할당되어 있는 공간의 용량이고, size는 실제 유효한 요소(element)들의 갯수입니다. reserve 키워드는 벡터의 capacity 크기를 정할 수 있게 해줍니다. push_back 함수를 통해 새로운 요소를 추가할 때 size가 capacity보다 작으면 그냥 맨뒤의 공간에 요소를 복사해 넣고 size의 크기만 늘어납니다. 하지만 size랑 capacity의 크기가 같으면 벡터의 메모리를 재할당 해줘야 합니다. 먼저 기존 capacity보다 더 많은 메모리를 새로운 연속된 공간에 할당하..

공부/C++ \C# 2018.07.04

레퍼런스와 포인터의 차이

1. 포인터는 재할당 할 수 있습니다. 12345678int x = 5;int y = 6;int* p;p = &x;p = &y;*p = 10;assert(x == 5);assert(y == 10); 레퍼런스는 무조건 초기화 할 때 할당 해줘야 합니다. 123int x = 5;int y = 6;int& r = x; 2. 포인터는 스택에 자신 고유의 주소를 가지고 있지만 (x86 운영체제에서 4 바이트), 반면 레퍼런스는 원본 변수와 같은 메모리 주소를 공유하면서 스택 공간에 자리를 차지합니다. 레퍼런스가 원본 변수랑 같은 주소를 공유하니깐 그냥 레퍼런스를 원본의 또 다른 이름이라고 생각하면 됩니다. 참고로 포인터가 가르키는 것은 스택뿐만 아니라 힙에 있을 수 있습니다. 레퍼런스도 마찬가지입니다. 여기서 내..

공부/C++ \C# 2018.05.15