C언어를 사용하다보면 주로 콘솔로 데이터를 출력하고 입력받는 작업들을 수행하게 될것입니다. 이렇게 계속해서 프로그램이 진행되다보면 자연스럽게 콘솔창에 텍스트들이 누적될것이고 누적된 텍스트들로 인하여 가독성이 떨어집니다. 따라서 경우에 따라서는 콘솔창을 한번씩 초기화 시켜 줄 필요성이 있습니다. 콘솔 화면지우기 #include //windows 헤더파일 include system("cls"); //콘솔창 clear 헤더파일의 system()함수를 이용하면 cmd 명령어를 사용 할 수 있습니다. 여기서 위와 같이 system함수안에 "cls"를 입력하면 콘솔 창을 clear할 수 있습니다. 사용 예제 #include #include void main() { printf("출력되지 않음\n"); system(..
콘솔 환경설정 C언어나 C++을 사용하여 콘솔 개발을 할 때가 많은데 콘솔도 환경설정값이 있어 개발자가 원하는 세팅을 해줄 수 있습니다. 다만 소스코드를 삽입한게 아니라 단순 환경설정이므로 내 PC한정입니다. 1. 콘솔창에 우클릭을 하게 되면 위와 같이 기본값이라는 항목이 있는데 클릭해서 콘솔 창 속성에 들어갑니다. 2. 콘솔 창 속성에서 콘솔의 글꼴과 크기, 창 크기와 색상변경 등 다양한 옵션값을 줄 수 있습니다. 자신만의 스타일로 콘솔창을 꾸며보세요. 명령어 사용 하나의 소스코드로 모든 디바이스의 콘솔 형태를 맞춰주고 싶다면 windows 헤더파일에 있는 함수들을 활용하여야 합니다. #include 콘솔창 크기 변경 //col = 가로, lines = 세로 system("mode con:cols=10..
컴퓨터의 연산속도는 너무나도 빨라서 아무리 많은 연산을 하더라도 실제 사용자가 보기에는 찰나의 순간에 지나가버립니다. 이런 CPU의 연산을 잠시 지연시키고 싶다면 windows의 Sleep함수를 사용하면 됩니다. 이렇게 Sleep 함수를 활용하여 CPU의 연산을 잠시 지연시키게 되면 마치 프로그램이 천천히 실행되는 효과를 줄 수 있게됩니다. Sleep함수는 밀리초 단위의 간격으로 설정이 가능하며 여기서 밀리초는 1/1000초입니다. 딜레이(Sleep) 함수 사용법 (잠시 멈춤) #include // Sleep함수가 포함된 헤더 Sleep(밀리초); // Sleep함수 호출 헤더파일의 Sleep() 함수를 사용하면 명령어의 실행시간을 지연시킬 수 있습니다. 1초를 지연시키고 싶다면 인자값으로 1000을 넣..
상수란? 상수는 변하지 않는 값을 뜻합니다. 값을 계속 바꿀 수 있는 변수와는 달리 상수는 처음 선언할 때 값을 할당받게 되면서 그 다음부터는 값을 바꿀 수가 없습니다. 그렇기에 상수를 선언하실때는 꼭 선언과 동시에 초기화를 같이 해야만 합니다. 상수는 값을 변경시키지 못하도록 제한하고 싶을때 사용합니다. 코딩을 하다보면 고정되어 있어야 할 값을 실수로 값을 바꿀 가능성이 있습니다. 그렇기에 변하지 않을 값이라면 상수로 만들어줌으로써 값을 바꾸는 것을 방지하고 코드의 의도를 명확하게 만들 수 있습니다. 상수 사용법 #include // define은 전처리기이므로 main밖에 써야함 (매크로 상수) #define PI 3.141592 #define COL 100 #define ROW 200 void ma..
const 포인터란? const라는 키워드는 변수를 상수화 시킬때 사용하는 키워드입니다. 이렇게 상수화 된 변수는 이후 변경이 불가능하며 포인터 변수에 const 키워드를 붙여도 같은 동작을 합니다. 다만 const의 위치가 어디로 가느냐에 따라 의미가 다릅니다. int a = 100; //1) const 자료형 변수명 = 초기값 const int *ptr = &a; //2) 자료형 const 변수명 = 초기값 int const *ptr2 = &a; //3) const 자료형 const 변수명 = 초기값 const int const *ptr3 = &a; const 포인터에서 const 키워드는 위와 같이 3가지 형태로 붙일 수 있습니다. const 키워드의 위치별 의미 상수 포인터(const pointe..
다중 포인터란 2차원 이상의 포인터 변수를 의미합니다. 포인터 변수도 메모리위에 올라가야하기에 주소값이 있습니다. 이러한 포인터의 메모리 주소값을 참조하는 포인터의 포인터를 이중 포인터라고 하며 이런 원리로 무한대의 다차원 포인터를 만들 수 있습니다. 다만 이중포인터까지만 종종 사용되고 실질적으로 2차원을 넘어서는 고차원 포인터는 잘 사용되지 않습니다. 이중포인터 사용법 int **ptr = NULL; 포인터를 선언할 때 ** 이런식으로 자료형 뒤에 *을 두 번 사용하면 포인터의 포인터(이중 포인터)를 선언할 수 있습니다. 이중 포인터 사용 예제 #include void main() { char ch = 'A'; char* ptr = NULL; char** ptr2 = NULL; ptr = &ch; //..
포인터 배열이란? 포인터 배열이란 말 그대로 포인터를 배열로 나열해놓은 것을 말합니다. 즉 포인터 변수의 배열이죠. 각각의 index에 여러 개의 포인터를 넣을 수 있습니다. char* arr[5]; int* arr[5]; void* arr[5]; 위와 같이 선언하여 사용합니다. char* arr[5]는 5개의 char형 포인터를, int* arr[5]는 int형 포인터 5개를 저장하고 있는 배열이 됩니다. 그냥 단순 주소값만 저장하고 싶을 때는 주로 void로 선언하며 이렇게 선언할 경우 이후 어떤 타입이든지 변환이 가능합니다. 포인터 배열 활용 예제 #include int main() { int num1 = 100; int num2 = 200; int num3 = 300; int* arr[3] = {..
int형의 값의 범위는 –2,147,483,648 ~ 2,147,483,647입니다. 이렇게 큰 숫자를 저장할 수 있는 공간이죠. 하지만 우리는 int타입에 이렇게 큰 값을 잘 넣어서 사용하지는 않습니다. 그렇다면 그만큼의 공간이 낭비되는 셈입니다. 그렇다면 int형을 반으로 나눠서 사용할 수는 없을까요? 가능합니다. 비트 연산자의 간단한 기법을 통해서 말이죠. 이렇게 된다면 하나의 int값 안에 2개의 값을 넣을수가 있게 되겠죠. 참고로 이러한 방법들은 실제 코딩에서는 잘 사용되지 않습니다. 메모리를 타이트하게 잡고싶다면 __int8, __int16과 같은 변수타입을 선언해서 사용하면 됩니다. 비트 쪼개기 (Bit Split) 사용법 & 예제 (비트연산 활용) #include int main() { u..
2진수는 숫자를 표현할때 0과 1 두 가지 값으로만 표현합니다. 여기서 0과 1을 On / Off로 사용하는 개념을 비트 플래그라고 합니다. 이것을 어디에다 사용하냐?라고 반문하실 수도 있는데 전혀 사용성이 없는 것은 아니고 한 번에 여러 가지 속성을 동시에 지정할 때, 편리하게 사용할 수 있는 방법 중에 하나가 비트 플래그입니다. 비트 플래그를 사용하면 좀 더 공간을 효율적으로 사용할 수 있습니다. 단순 비교를 해보아도 8개의 상태를 저장하려면 bool 타입 변수 8개를 선언해야 할텐데 8비트의 char을 비트단위로 쪼개서 저장한다면 1개의 char 변수(1byte = 8bit)만으로도 8개의 상태를 저장할 수가 있죠. 비트 플래그 (Bit Flag) 사용 간단한 예제 #include int main(..
8진수나 16진수의 경우와는 달리 C언어에서는 2진수를 출력해줄 수 있는 서식 문자가 없습니다. 그렇기에 2진수는 직접 구해서 출력해야 하는데 일일이 2로 나누어 거꾸로 읽지 않아도 아래와 같이 비트 연산자를 사용하면 쉽게 구할 수 있습니다. 10진수를 2진수로 변환하여 출력하기 (비트연산 활용) #include int main() { unsigned int num; printf("정수를 입력해주세요\n"); scanf_s("%d", &num); printf("2진수 변환 : "); //이진수 출력 for (int i = 7; i >= 0; --i) { //8자리 숫자까지 나타냄 int result = num >> i & 1; printf("%d", result); } } 52를 바이너리로 8자리 숫자까..
C언어에서는 10진수를 8진수나 16진수로 변환해주는 서식문자를 제공합니다. 8진수는 %뒤에 o를 붙이면 되고 16진수는 %뒤에 x를 붙이면 됩니다. 또한 출력한 값이 8진수인지 16진수인지 %뒤에 #을 붙이면 알 수 있게 출력할수도 있습니다. 그리고 원하는 자릿수까지 0으로 채워서 출력할수도 있습니다. 아래 예제를 확인해주세요. 입력받은 10진수를 8진수, 16진수로 출력하기 #include int main() { int num; printf("정수를 입력해주세요\n"); scanf_s("%d", &num); printf("10진수 : %d\n", num); // 서식문자 : %d printf("8진수 : %o\n", num); // 서식문자 : %o printf("16진수(소문자) : %x\n", n..
열거형이란? 열거형은 사용하면 변수가 갖는 값에 의미를 부여할 수 있고 프로그램 가독성이 향상됩니다. 열거형은 명명된 정수형 상수의 집합으로 구성됩니다. 열거형을 선언하면 컴파일러는 열거형 멤버들을 정수형 상수로 인식합니다. enum 형식의 변수를 인덱싱 식에서 사용할 수 있으며 모든 산술 및 관계형 연산자의 피연산자로 사용할 수 있습니다. 열거형 상수 또는 열거형 형식의 값은 C 언어에서 정수 식을 허용하는 모든 곳에서 사용할 수 있습니다. 열거형(enum) 사용법 열거형 만들기 //문법 enum 열거형 이름{상수 이름}; //ex enum week{SUN, MON, TUE, WED, THU, FRI, SAT}; 열거형을 만드는 방법은 구조체와 비슷한데 구성은 열거형은 열거형 키워드(enum), 열거형..
구조체에서 포인터가 사용되는 경우는 아래와 같이 크게 3가지로 구분됩니다. 1. 멤버 변수로 포인터 사용하기 2. 구조체 변수로 포인터 사용하기 3. 구조체 간의 상호 참조 멤버 변수로 포인터 사용하기 #include struct Score { int *kor; //국어성적 int *mat; //수학성적 int *eng; //영어성적 }; int main() { int score1 = 100; int score2 = 90; int score3 = 80; struct Score s; s.kor = &score1; s.mat = &score2; s.eng = &score3; printf("국어점수 : %d\n", *s.kor); printf("수학점수 : %d\n", *s.mat); printf("영어점수 ..