프로그래밍 언어
C++ 클래스 접근제한자 관련 보충 내용
클래스 접근제한자는 오브젝트 레벨이 아닌 클래스 레벨로 작동되기 때문에 생성자 내에서 파라미터로 받는 같은 클래스 변수의 private 또는 protected 멤버 변수에 접근이 가능하다. #include using namespace std; class A { private: int mValue = 0; public: A() = default; A(int val) : mValue(val) { } A(const A& a) { this->mValue = a.mValue; } void Print() { cout
C++ 객체 이동 std::move
에 정의됨 // C++ 14 이전에는 constexpr 아님! template constexpr typename std::remove_reference::type&& move(T&& t) noexcept; std::move 는 어떤 객체 t 가 이동 될 수 있음 을 알려준다. 이동 이라 하면 C++ 11 에 도입된 개념으로 t 가 가지고 있는 자원을 다른 객체에게 효율적으로 전달하는 것을 의미한다. std::move 된 객체를 함수에 전달한다면, 우측값 레퍼런스를 인자로 받는 함수(예를 들어서 이동 생성자, 이동 대입 연산자, vector 의 push_back 함수 같은 애들)가 오버로딩 되어서 선택된다. 참고로 우측값 레퍼런스 자체는 rvalue 가 아니라 lvalue 이기 때문에, 이동 생성자나 이동..
C++ 해시(Hash)의 의미 그리고 구현
3명의 사람 (김연아, 손흥민, 서장훈) 이 위와 같이 부탁을 했다. 그리고 이러한 기능을 C++ 를 사용해서 구현해달라고 했다. 파이썬과 다르게, 기본적으로 C++ 에서는 이런 기능을 지원하지 않는다. 어떻게 가장 효율적이고, 빠른 자료구조가 될 수 있을까? 답은, 각각의 이름(텍스트)에 대해서, 유일한 Key 값을 가지게 하는 것이다. 만들어진 Key 값을 이용해서 자료에 접근한다면 O(1) 시간만에 접근할 수 있다. 해시(Hash)의 동작원리 해시에서 Key를 생성하기 위한 다양한 알고리즘이 존재한다. MD-5나 SHA이 그 유명한 해시 알고리즘 중 하나이다. 우리는 학습을 목표로, 문자열을 통해서 간단한 해시를 만드는 방법을 알아본다. 'apple' 이라는 문자열이 주어졌다고 가정하고 Key를 만..
C++ 변수와 함수에서의 const
Const 의미 컴파일러 상수(*상수 : 정적인 data. 초기화를 한번밖에 못하는 data. 메모리 변경이 불가하다). 변수를 상수화하여, 한번 할당된 상수로 할당된 메모리의 모든 비트를 변경하지 못한다. Const의 장점 const키워드가 붙은 객체는 외부 변경을 불가능하게 한다. class 바깥에서는 전역 / namespace 유효범위의 상수를 정의하는데 씀. static 선언한 객체에도 const를 붙이는 것이 가능하다. 정적 / 비정적 data 멤버 모두를 상수로 선언할 수 있다. 변수에서의 Const int a = 10; int const *pn const int* pn = &n; -> 포인터가 가리키는 대상(값)이 상수. pn(주소)은 변경 가능하다, *pn(값)은 변경이 불가하다. int ..
C# 난수 생성 Random 클래스
1. C# random(랜덤) 클래스에 대해서. 랜덤 클래스가 정의 되어있는 곳을 살펴보면 아래 캡쳐와 같다. 1. 랜덤클래스는 System 네임스페이스 안에 속해있다. Random 클래스는 namespace System 괄호 안에 존재한다. Systen 네임스페이스는 C# 파일을 만들면 자동으로 포함되어있기 때문에 Random 클래스를 사용하기 위해서 특별히 무언가를 추가한다거나 할 필요가 없다. 2. 랜덤클래스 객체를 생성하는 방법 (생성자) Random 변수명 = new Random();: new 키워드와 생성자를 이용해서 Random 타입의 객체를 생성한다. 3. 랜덤클래스의 Next() 메서드 Next() 메서드는 임의의 정수를 반환하는 메서드(멤버 함수) 입니다. (음수는 나오지 않음, n>=..
C++ 난수 생성 std::random + 생성 시간 측정하는 std::chrono 라이브러리
#include #include int main() { // 시드값을 얻기 위한 random_device 생성. std::random_device rd; // random_device 를 통해 난수 생성 엔진을 초기화 한다. std::mt19937 gen(rd()); // 또는 미리 범위를 지정 할 수가 있음 // std::mt19937 gen(1234); // 0 부터 99 까지 균등하게 나타나는 난수열을 생성하기 위해 균등 분포 정의. std::uniform_int_distribution dis(0, 99); for (int i = 0; i < 5; i++) { std::cout
C 난수 생성
C언어 프로그래밍에서 코드를 작성하다보면 무작위의 숫자가 필요한 경우가 존재한다. 보통 무작위 숫자를 난수라고 표현한다. C언어에서 난수를 표현하기 위해서는 stdlib.h 헤더파일에 포함되어있는 rand()라는 함수를 사용하면 된다. ☞ rand()함수 사용법 #include #include // rand() 함수 포함 라이브러리 int main() { int random = 0; // 정수형 변수 선언 for (int i = 0; i < 10; i++) { // 10번 반복 random = rand()%9; // 난수 생성 printf("%d\n", random); // 출력 } } 8번째 줄에 random = rand()%9; 라는 코드가 있다. 해석하면 rand() 함수에 의해 난수를 생성하고 그..
C++ 데이터 타입(data type)
1. 변수 선언하기 타입명을 적고 띄우고, 변수명을 적는다. 공백은 스페이스 탭등이 여러개 들어가도 된다. 콤마(,)로 구분하여 여러개를 한번에 선언할 수 있다. int a; int b, c, d; 2. 변수값 초기화 선언과 동시에 초기화 한다. int value = 0; 함수 호출 처럼 초기화 할 수 도 있다. int value(0); 여러개를 한번에 초기화 할 수도 있다. int a = b = c = 0; 콤마(,)로 분리해서 여러개를 초기화 할 수 도 있다. int a = 0, b = 1; 선언 후에 초기화 해도 된다. int a; a = 1; 3. 데이터 타입 C++에는 아주 많은 데이터 타입이 있다. C++ 언어의 데이터 타입이 가지는 저장공간은 컴파일러마다 다를 수 있다. 이 글은 Visual..
C++ std::tuple 여러가지 타입들의 객체를 보관 / Structured binding
#include #include #include int main() { std::tuple tp; tp = std::make_tuple(1, 3.14, "hi"); std::cout
std::variant와 std::monostate 여러가지 타입 중 한 가지의 객체를 보관
std::variant 는 one-of 를 구현한 클래스라고 보면 된다. 즉, 컴파일 타임에 정해진 여러가지 타입들 중에 한 가지 타입의 객체를 보관할 수 있는 클래스이다. 물론 공용체(union) 을 이용해서 해결할 수 도 있겠지만, 공용체가 현재 어떤 타입의 객체를 보관하고 있는지 알 수 없기 때문에 실제로 사용하기에는 매우 위험하다. // v 는 이제 int std::variant v = 1; // v 는 이제 std::string v = "abc"; // v는 이제 double v = 3.14; 먼저 variant 를 정의할 때 포함하고자 하는 타입들을 명시해줘야 한다. 위의 경우 정의한 variant 는 int, std::string, double 이 셋 중 하나의 타입을 가질 수 있다. var..