[C++] 시프트 연산자 - 논리 시프트, 산술 시프트
·
C++
1. 개념시프트 연산 ">" 연산자로 비트를 이동시킬 때, 왼쪽 시프트 연산자인 ">"를 사용하게 되면 왼쪽에는 0 또는 1이 채워지게 된다. 보통 부호가 없으면 0이 채워지고 부호가 있으면 1이 채워지는데, 오른쪽 시프트 연산자를 사용하면 위와 같은 차이가 생기는 이유가 무엇일까? 결론적으로, 양수일경우와 부호가 없는(unsigned) 정수일 경우 논리 시프트가, 음수일 경우 산술 시프트가 사용되어 오른쪽 시프트 연산자를 사용할 때 차이가 발생한다.해당 이유에 대해 파악하기 위해서 우선 세가지 개념( 논리 시프트, 산술 시프트, 보수법 )에 대해 추가로 학습해야한다.논리 시프트컴퓨팅에서 논리 시프트(logical shift)는 피연산자의 모든 비트를 이동하는 시프트 연산이다. 논리 시프트에서는 부호를 ..
[C++] 콘솔 텍스트에 색상을 적용시키는 2가지 방법
·
C++
1. ANSI 이스케이프 코드 사용ANSI 이스케이프 코드를 이용해 터미널 출력에 색상을 적용할 수 있다다음과 같이 코드에 #define 문을 넣어주고 색상을 넣어주고 싶은 텍스트 앞에 색상을 입력해 주면 된다#include #define RESET "\x1b[0m"#define BLACK "\x1b[30m"#define RED "\x1b[31m"#define GREEN "\x1b[32m"#define YELLOW "\x1b[33m"#define BLUE "\x1b[34m"#define MAGENTA "\x1b[35m"#define CYAN "\x1b[36m"#define WHITE "\x1b[37m"using namespace std;int main(){ //GR..
[C++] System() 함수 - "cls" , "pause"
·
C++
1. System()System() 함수는 시스템 명령을 수행하는 함수이다헤더파일Windows.h기본형int system(const char *cmd) cmd 자리에 들어가는 여러 명령어가 있는데 그 중 "cls"와 "pause"에 대해 개념 정리해보자 2. system("cls")"cls"는 cleen screen의 약자로 system("cls")를 사용하면 콘솔창을 지울 수 있다while(true) { system("cls"); cout 해당 코드는 도서관 관리 프로그램의 코드의 일부인데, while문 가장 위에 system("cls")를 사용하여 1~7까지의 명령 중 하나가 끝났을 때, 다시 콘솔 창을 초기상태로 되돌리기 위해 사용했다. 3. System("pause")자동으로 창이 종..
[C++] 얕은 복사 vs 깊은 복사
·
C++
1. 얕은 복사얕은 복사(Shallow Copy)는 클래스 내의 포인터 멤버를 복사할 때, 포인터가 가리키는 데이터가 아니라 포인터가 저장하고 있는 주소값만 복사하는 것을 의미한다.즉, 두 객체가 동일한 동적 메모리 영역을 가리키게 된다. 얕은 복사를 수행한 후 원본 객체가 메모리를 해제하면, 복사된 객체의 포인터는 해제된 메모리 영역을 가리키게 된다. 따라서 dangling pointer가 발생할 가능성이 존재한다. 아래 그림은 얕은 복사 시, 객체 내 멤버 변수 중 포인터가 어떻게 변하는지를 나타낸 그림과 코드이다.#include using namespace std;int main() { // 포인터 A가 동적 메모리를 할당하고 값을 30으로 설정 int* A = new int(30); ..
[C++] 스마트 포인터(Smart Pointer) 개념 정리
·
C++
1. 포인터 사용으로 발생할 수 있는 이슈들포인터는 C++의 강력한 도구이지만, 그와 동시에 치명적인 이슈를 일으키는 원인이기도 하다포인터 사용으로 발생할 수 있는 이슈들은 대표적으로 다음과 같은 것들이 있다1) 메모리 누수(Memory Leak) 메모리를 할당하고 해제하지 않을 경우 힙에 해당 객체가 계속 남게 되는데, 이 경우 해당 코드가 실행될 때마다 힙 메모리를 잡아먹고, 사용하지도 않는 메모리가 계속 할당되어 있는 메모리 누수 문제가 발생한다 보통 c++에서 [new - delete] 쌍을 맞추면 된다고는 하지만, 코드가 복잡해질수록 포인터끼리 얽히기 쉬워 주해야 한다2) 널 포인터(nullptr)아무것도 가리키지 않고 있는 널 포인터를 통해 무언가에 접근할 경우 발생하는 문제이다. 포인터 사..
[C++] 헤더파일 중복방지 #Pragma once vs #ifndef ~ endif
·
C++
1. 헤더파일의 역할헤더파일은 함수, 매크로, 구조체, 클래스 등의 정의를 담고 있는 파일이다다른 소스파일에서 헤더파일을 include하여 해당 코드를 재사용하거나 모듈화할 수 있다헤더파일은 일반적으로 .h 확장자를 가지며, 함수의 정의가 아닌 선언만 포함한다2. 헤더파일 중복의 문제점헤더파일을 여러 소스파일에서 중복해서 include하는 경우, 동일한 내용이 중복으로 정의될 수 있다 이로 인해 컴파일러는 같은 클래스, 함수 등을 중복 정의하는 것으로 인식하게 된다 이는 컴파일 시간이 증가하고 메모리 사용량이 증가하는 원인이 되고, 코드의 가독성과 유지보수성이 저하될 수 있다3. 헤더파일 중복방지 지시자이를 방지하기 위해 C++에는 두가지 지시자가 있는데, #Pragma once와 #ifndef ~end..
[C++] 깔끔한 코드 작성법 - 헤더파일과 소스파일을 나누는 이유
·
C++
헤더파일과 소스파일그동안은 코딩테스트를 준비하면서 소스코드를 오직 main.cpp에만 코드를 작성했기 때문에 헤더파일과 소스파일을 구분해서 작성하지 않았던 것 같다. 최근 Class를 활용하여 객체지향 프로그래밍을 본격적으로 공부하면서 헤더파일과 소스파일을 왜 분리하여 사용하면 좋을지 정리하면 좋을 것 같아 글을 작성한다 단순하게 헤더파일과 소스파일을 구분해서 코드를 작성하는 이유는 프로그래밍 중 main.cpp 파일에 모든 소스코드를 작성하면 소스코드가 길어져서 가독성도 떨어질뿐더러, 다른 파일에서 이 코드를 재사용할 때 불편함이 더러 생기게 된다.이 부분에 대해서는 SOLID 원칙을 정리해 놓은 글을 참고하면 이해가 될 것 같다 객체지향 프로그래밍의 5가지 원칙 - SOLID 객체지향 프로그래밍의 5..
[C++] String 클래스 정리 및 함수 사용
·
C++
1. string 클래스란?- C++ STL에서 제공하는 클래스로, 말 그대로 string(문자열)을 다루는 클래스이다.- C에서는 char* 또는 char[] 의 형태로 문자열을 다뤘다면, C++에서는 문자열을 하나의 변수 type처럼 사용하며, 문자열을 훨씬 다양하고 쉽게 다룰 수 있게 해 준다. - char* , char[] 과 다르게 문자열의 끝에 '\0' 문자가 들어가지 않으며, 문자열의 길이를 동적으로 변경 가능하다. 2. string 클래스의 입/출력C++ 입출력 방식인 cin , cout 으로 입출력이 가능하며, getline 함수도 이용할 수 있다. C에서의 scanf와 printf는 사용이 불가능하다. string str; // 문자열 생성cin >> str; ..