C++ (85) 썸네일형 리스트형 [C++] 값 타입 변환 vs 참조 타입 변환 비트열 재구성 여부 1.값 타입 변환 의미를 유지하기 위해 원본과 다른 비트열 구성 int a = 123456789; float b = (float)a; b는 정수형 a와 유사한 값의 의미를 가지지만 비트단계에서는 완전히 다른 비트열을 가지게됨 2.참조 타입 변환 비트열을 재구성하지 않고 관점만 바꾼다. (포인터 타입 변환도 동일한 룰을 따름) int a = 123456789; float b = (float&)a; b는 a와 같은 비트열을 가지지만 의미에서는 전혀 다른 값을 가지게 된다. 연관 없는 클래스 사이 변환 1.값 타입 변환 일반적으로는 안되고 타입 변환 생성자나 타입 변환 연산자가 있어야 함 Knight knight; Dog dog = (Dog)knight; // 타입 변환 생성자 Knight.. [C++] new vs malloc 편의성 -> new 승 (사이즈가 클래스 타입에 자동으로 맞춰짐) 할당 크기를 정해줘야 할 경우 -> malloc 승 new의 특수효과: 생성 타입이 클래스일 경우 new 할 때 생성자, delete 할 때 소멸자를 호출한다. [C++] 초기화 리스트는 선처리 영역에서 실행된다. C++에서 초기화 리스트를 사용하는 이유가 단순히 가독성 때문인가라고 생각했었는데, 그게 아니였다. 초기화 리스트는 선처리 영역에서 실행된다. 이 말의 의미에 대해 알아보자. Child 클래스는 Parent 클래스를 상속받는 자식 클래스라고 하자. 그러면 Child 클래스는 본인의 생성자를 호출하기 전에 Parent 클래스의 생성자를 호출하는데 그게 어디일까? Child() // [C++] 포인터 vs 배열 문자열은 포인터와 배열, 두가지로 표현할 수 있다. const char* test1 = "Hello World" char test2[] = "Hello World" 둘의 결정적인 차이점은 test1은 문자열이 시작하는 주소를 가리키는 포인터이고 배열명 test2는 문자열이 시작하는 주소 자체이다. 그래서 test1은 자신의 주소를 따로 가진다. 그래서 &test1은 문자열이 시작하는 주소가 아닌 전혀 다른 위치를 가리킨다. [C++] 포인터 vs 참조(레퍼런스) 포인터와 참조는 로우레벨 개념까지 봤을 때 원리는 동일하다. 그렇기 때문에 속도도 같다. 그렇다면 어떤 것을 이용하는게 좋을까? 먼저 포인터와 참조의 가장 큰 차이점은 nullptr이다. 포인터는 nullptr을 가질 수 있지만 참조는 어떤 변수의 별명이기 때문에 반드시 무언가를 가리켜야 한다. 그래서 nullptr값을 가질 수 있다면 포인터, 아니라면 참조를 사용하는 것이 좋을 것이다. 참조를 사용하는 이유는 일단 편해서이다. 포인터는 ->로 접근해야 하는데 참조는 . 로 일반적인 방법으로 접근이 가능하다. 그렇지만 이 편한 것이 장점만 있는 것은 아니다. . 으로 접근하기 때문에 레퍼런스인지 일반 데이터인지 헷갈릴 수 있다. 그래서 사용하는 것이 #define OUT으로 의미없는 문자열을 만들어서 참.. [C++] 정수형, 불리언, 부동소수점 정수형 정수형은 가장 기본이 되는 데이터 타입으로 int 뿐만 아니라 , boolean , float 들도 정수형으로 이루어져있다. 위처럼 char도 문자를 담는다고 알고 있지만 1바이트 크기의 정수형 데이터 타입이다. 여기에 unsigned를 붙이면 최상위 비트가 1이더라도 항상 양수로 계산하기 때문에 두배만큼 양수쪽으로 범위가 커진다. 불리언 불리언은 c++에서 bool 변수이름 = true or false로 표현하는데 1바이트의 정수형이다. 그런데 이 사람이 플레이어인지 int IsPlayer = 1 or 0 으로 표현하기에는 이게 플레이어의 개수인지 헷갈린다. 그래서 가독성의 문제때문에 만들어졌다. 그렇다면 0과 1만 쓰니까 1비트만 써도 되지 않을까?라는 의문이 생기지만 보통 프로그램에서 사용하.. [C++] 음수를 비트로 표현하는 방법(2의 보수), 진법 표현 비트는 0과 1로 조합되는 데이터를 나타내는 최소 단위이다. 8비트면 -128 ~ 127까지의 정수를 표현할 수 있다. 1번째 자리부터 7번째 자리까지는 양의 정수를 표현하지만 8번째 자리의 비트가 1이 되면 마이너스가 붙는다. 01111111은 127이지만 10000000은 -128이 된다. 여기에 2~8번째 자리의 비트값을 더해서 계산한다. 이 경우는 1바이트일 때 이야기이고 데이터 크기가 커져도 동일하게 최상위 비트가 1이 되면 마이너스가 붙는다. 원래 데이터에 마이너스만 붙이는 방법은 2의 보수를 이용하는데, 1의 보수(1인 비트는 0으로 , 0인 비트는 1로 반전한 후)에 1을 더해준다. ex) 01001010 => 10110101 + 1 => 10110110 1의 보수라고 부르는 이유는 각 자.. [C++] RAII C++는 가비지 컬렉터가 없기 때문에 메모리 관리를 잘해야 한다. 메모리 관리를 쉽게 해주는 디자인 패턴이 RAII (Resource Acquisition Is Initialization)이다. C++에서는 객체를 힙 영역에 동적으로 할당하면 Scope를 벗어나도 스택에서 포인터만 소멸할 뿐이지 힙 영역에 할당된 메모리는 그대로 남는다. 하지만 RAII는 프로그램이 해당 객체의 Scope 범위를 벗어날 경우 메모리를 해제한다. 스택에 할당된 객체들은 모두 소멸자를 호출하는 것을 이용해서 Scope를 벗어나면서 소멸자를 호출해 delete로 동적할당된 메모리를 해제하는 것이다. 이러한 방식을 이용한 포인터 객체가 스마트 포인터이다. 이전 1 2 3 4 5 6 ··· 11 다음