Table of Contents 개요구조체 정의구조체 선언구조체 사용 1. 개요 지금까지 저희는 변수와 배열을 사용하여 자료를 저장해 왔습니다. 하지만 C언어에서 지원하는 변수들의 종류는 많지 않기 때문에, 복잡한 자료를 저장하기엔 효율적이지 않습니다. 예를 들면, 고등학교 한 반에 있는 학생들의 이름, 키, 몸무게를 저장해야하는 상황이 있습니다. 이름은 문자열, 키와 몸무게는 실수형 변수로 저장한다고 해보면 아래와 같이 됩니다. 12345678910//code by RiKang, weeklyps.com#include char student_name[55][21]; // 이름float student_height[55]; // 키float student_weight[55]; // 몸무게 int main()..
Table of Contents 개요 기본 문법 함수의 정의 함수의 호출 함수의 선언 전역 변수와 지역 변수 호출 방식 문제 1. 개요 C언어로 만든 프로그램은 운영체제가 main() 함수를 호출하며 시작하고, main() 함수가 0을 반환하면 종료하게 됩니다. 따라서 지금까지는 main() 함수 안에 모든 명령문을 작성하는 식으로 프로그래밍을 해왔습니다. 하지만, 복잡한 프로그램을 만들게 되면 이런 방식은 곧 한계에 부딪힙니다. 예를 들기 위해, 앞글에서 살펴본 strlen() 함수가 존재하지 않는다고 가정하면 어떻게 되는지 생각해보겠습니다. 그러면 일단 strlen()의 효과를 얻을 수 있는 3줄 정도의 명령문을 작성하게 될 것입니다. 물론 여기까지는 1줄로 끝낼 수 있는 작업이 3줄 정도로 늘어난 ..
Table of Contents 개요 strlen() strcmp() strcpy() strcat() 문제 1. 개요 문자열이 다른 변수형의 배열들과 다른 점은, 문자열 자체가 하나의 의미를 가지는 경우가 많다는 점입니다. int 변수가 여러 개가 모여 하나의 의미를 나타내는 경우는 거의 없지만, 문자가 모여 하나의 의미를 나타내는 경우는 굉장히 많습니다. 간단하게 문자를 사용하는 예시를 생각해보면 이름, 제목, 검색 키워드등이 있지요. 이들 모두 문자 한 개보다는 문자열로 표현해야 하는 경우가 많음을 알 수 있습니다. 따라서 문자열은 그 자체를 자유롭게 사용할 수 있어야 합니다. 하지만 문자열도 결국 char들의 배열로 사용되며, 배열 전체를 하나의 변수만큼이나 자유롭게 쓰기는 굉장히 어렵습니다. 예를..
Table of Contents 개요기본 문법간접 참조오프셋포인터와 배열 1. 개요 포인터는 다른 프로그래밍 언어에서는 찾아보기 힘든 C언어의 문법입니다. 또한 고급 언어이면서도 저급 언어에 가까운 C언어의 특징을 잘 나타내주는 요소이기도 합니다. 특이하게도 메모리의 주소를 다루기 위한 문법이기 때문입니다. 포인터를 공부하시는 분이라면, 지금까지 C언어를 공부하면서 메모리에 여러가지 변수들을 저장하고 사용해 오셨을 겁니다. 그런데 변수들을 저장하는 컴퓨터의 메모리는 4byte, 8byte 쯤은 모래알처럼 느껴질 만큼 방대한 용량을 가지고 있습니다. 어떻게 C 컴파일러는 그 방대한 메모리에서 변수의 값을 정확하게 읽어내는 것일까요? 그건 메모리의 각 칸에 '주소(address)'가 있기 때문입니다. 마치 ..
Table of Contents 개요 변수형 변환 1. 개요 C언어에는 많은 변수형이 존재하며, 상황에 따라 여러 변수형을 혼합해서 사용하는 경우가 있습니다. 123456789101112//code by RiKang, weeklyps.com#include int main(void) { int a = 3; double b = 3.3; int c = a+b; double d = a+b; printf("c = %d\n",c); printf("d = %lf\n",d); return 0;}cs 이 문서에서는 이처럼 서로 다른 변수형을 같이 이용할 때, 컴파일러가 어떤 식으로 처리하는 지에 대해 다룹니다. 2. 변수형 변환 C 컴파일러가 판단하는 변수형의 표현 범위 크기는 아래의 순서에 따릅니다. 오른쪽으로 갈수록..
Table of Contents 개요 문자열의 입출력 NULL 문자 gets() 와 puts() strlen() 문제 1. 개요 char 들의 배열로 사용되는 '문자열'은, int 나 float 등의 배열과 조금 다른 특성과 쓰임을 가지고 있습니다. 이에 따라 C언어에서는 문자열에 사용할 수 있는 서식문자나 함수등 여러 가지 요소들을 제공하고 있으며, 이 글에서는 이런 문자열에 대해 소개하고 있습니다. 변수형 char에 대해 기억이 나지 않으신다면 char 설명 을 보고 오시는 걸 추천합니다. 2. 문자열의 입출력 1. 기본 입출력 배열의 원소 하나하나에 입력을 받는 int 배열과 달리 문자열은 한번에 입력, 출력을 할 수 있습니다. 대표적인 형식은 아래와 같습니다. 1 2 3 //code by RiKa..
Table of Contents 개요 C언어 연산자들의 우선순위와 결합성 1. 개요 우리는 1 + 2 - 3 을 계산할 경우, 덧셈을 먼저 하고 그 다음 뻴셈을 합니다. 덧셈 뺄셈 연산을 할 때는, -> 방향으로 연산하기 때문이지요. 이러한 방향을 결합성이라고 합니다. 우선순위가 같은 연산끼리는 결합성에 따른 방향순으로 연산합니다. 그리고 1 + 2 * 3 를 계산할 경우, 우리는 곱셈을 먼저 계산하고 덧셈을 계산합니다. 이는 우리가 수학에서 곱하기의 연산이 덧셈의 연산보다 우선순위가 높다고 이미 배웠기 때문입니다. 사칙 연산은 괄호와 곱셈, 나눗셈만 주의하면 될 정도로 우선순위와 결합성이 간단하지만, C언어에는 사칙연산 이외에도 많은 연산자들이 존재하기 때문에 이 연산자들이 같이 사용될 경우 혼란이 있..
Table of Contents 개요배열의 선언배열에 있는 변수 사용하기문제메모리에 저장된 배열주의할 점다차원 배열 1. 개요 예를 들어, 정부에서 일하는 한 프로그래머가 대한민국 모든 성인의 키를 저장해야 한다고 해보겠습니다. 키를 저장하려면 실수형 변수에 저장 시켜야 할 것입니다. 그런데 만일 실수형 변수 5000만개를 따로 따로, double height1, height2, height3, ..., height50000000 이런 식으로 선언해서 사용한다고 생각해보면 앞길이 막막해 집니다. 하지만 걱정하지 않으셔도 됩니다. 다행히 C언어에는 같은 변수형의 변수들을 하나로 묶어서 한 방에 선언하는 방법이 있으니까요. 바로 배열(Array)입니다. 2. 배열의 선언 배열 선언의 기본 예시는 아래와 같습..
Table of Contents 개요 비트연산자 모음 (shift 연산) & (and 연산) | (or 연산) ^ (xor 연산) ~ (not 연산) 이진수의 음수 표현 : 보수 1. 개요 C언어에는 변수를 비트 단위로 조작할 수 있는 연산자들이 존재합니다. 이들을 비트연산자라고 하며, 비트연산자로는 , &, |, ^, ~ 등이 있습니다. 여기에서는 비트연산자들의 연산 과정과 함께 이진수의 음수 표현에 대해 소개합니다. 이진수에 대해 모르거나 잘 기억이 안 난다면 이진수와 비트단위 를 먼저 보고 오시는 걸 추천합니다. 2. 비트연산자 모음 각 비트연산자가 일으키는 연산을 간단하게 설명해놓은 표입니다. (아래의 예시에 쓰인 숫자들은 십진수가 아니라 이진수입니다.) 연산자 사용 형태 예시 예시 결과 설명 b..
Table of Contents 개요 정수형 변수 (Integer Type) 실수형 변수 (Floating-Point Type) 식별자 상수 (Constants) 1. 개요 변수의 유형은 다음 두 가지에 의해 결정됩니다. 1. 얼마나 많은 용량의 저장 공간을 사용하는가 2. 저장해놓은 비트 정보(0101010)를 어떻게 해석하는가 여기에서는 이후에 나올 배열, 함수, 포인터에서 자연스럽게 익히는 void type과 derived type 은 제외하고 다양한 정수형 변수와 실수형 변수의 종류에 대해서 소개합니다. 2. 정수형 변수 (Integer Type) 타입 서식문자 용량 표현 범위 상세설명 char %c 1 byte -128 ~ 127 or 0 ~ 255 [C언어] 7. 변수(3) (변수형 char)..
Table of Contents 개요 for 문 for 문제 while 문 while 문제 do while 문 break 문 continue 문 종합 문제 1. 개요 반복문은 말 그대로 반복작업을 명령할 때 유용한 구문입니다. 거두절미하고 반복문의 필요성을 알아보기 위해 1부터 10까지의 자연수를 모두 곱한 결과를 출력하는 프로그램을 만들어 보도록 하겠습니다. 정수형 변수만을 활용한다면 아래와 같이 프로그래밍할 수 있습니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 //code by RiKang, weeklyps.com #include int main(void) { int a; a=1; a*=2; a*=3; a*=4; a*=5; a*=6; a*=7; a*=8; a*..
Table of Contents 개요 char 아스키 코드 아스키 코드 표 1. 개요 프로그래밍에서는 숫자 뿐만 아니라 문자도 다뤄야 하기 때문에 문자를 위한 변수형으로 character 의 약자인 char가 존재합니다. 서식문자는 %c 로서, 이 서식문자로 입력 및 출력을 할 수 있습니다. 12345678//code by RiKang, weeklyps.com#include int main(void) { char a; scanf("%c",&a); printf("%c",a); return 0;}cs 만일 C언어에서 문자 a 를 그냥 a 로 표기한다면 이게 변수 a를 말하는 것인지, 문자 a를 말하는 것인지 알 수 없겠지요. 예를 들어 변수 a에 문자 a를 넣고 싶을 때, a = a; 라는 구문을 쓴다면, ..
Table of Contents 개요 if 문 관계 연산자와 논리 연산자 if 문제 else 문 else if 문 else 문제 팁 추가 문제 switch case 문 1. 개요 지금까지의 내용은 입출력 함수, 정수형 변수, 실수형 변수입니다. 그런데 이 것들만 가지고 프로그래밍을 하면 순차적으로 모든 구문을 실행하는 프로그램밖에 만들 수 없습니다. 만일 아래와 같은 프로그램을 만들고자 한다면, 이들만으로는 굉장히 어렵다는 걸 알 수 있습니다. 이럴 때 사용할 수 있는 게 조건문입니다. 조건문은 주어진 조건에 따라 프로그램의 흐름을 바꾸는 구문입니다. 이전까지 소개된 입출력 함수나 변수의 경우엔 기초적인 사용법을 알면 누구나 비슷하게 사용할 수 있는 내용이었습니다. 하지만 조건문부터는 프로그램의 흐름을 ..
Table of Contents 선언 서식 문자 실수 오차 표현 범위 1. 선언 이전 글에서 나온 정수형 변수는 정수만을 저장하기 위해 만들어진 변수형입니다. 따라서 정수가 아닌 0.4, 2.6 같은 수는 저장할 수 없다는 문제가 있습니다. 아래의 프로그램을 돌려보면 소수점 이하의 숫자는 버려지는 걸 확인하실 수 있습니다. 1234567891011//code by RiKang, weeklyps.com#include int main(void) { int a, b; a=0.4; printf("%d\n",a); b=2.6; printf("%d\n",b); return 0;}cs 따라서 정수형 변수와는 별개로, 이러한 소수들을 저장하기 위한 실수형 변수가 존재합니다. 자주 사용되는 실수형 변수로는 float 와..
Table of Contents 개요 정수형 변수의 선언 정수형 변수의 출럭 정수형 변수에 값 입력 및 갱신 정수형 변수에 값 표준 입력 받기 int 범위 문제 1. 개요 C언어에서 변수란, 저장된 데이터가 변경될 수 있는 저장 공간을 의미합니다. 저장 공간이라는 점에서 흔히 사용하는 '파일'과 개념이 비슷하다고도 볼 수 있습니다. 그리고 파일이 여러가지 유형의 확장자(.txt, .avi, ...)를 가지는 것처럼, C의 각 변수에도 변수의 저장 공간 크기와 레이아웃을 결정하는 특정 유형이 있다는 공통점이 있습니다. 하지만 파일과 변수는 그 규모와 용도에 차이가 존재합니다. 보통 파일은 용량이 킬로바이트(KB) 단위 이상인 많은 정보를 저장하지만, C언어의 변수는 123, 23 같은 정수, 'a', 'b..
Table of Contents 이진수 거듭제곱 십진수 이진수 N자리의 이진수로 표현할 수 있는 숫자 이진수를 십진수로 변환하기 십진수를 이진수로 변환하기 비트 단위 1. 이진수 0과 1을 저장하는 컴퓨터의 특성상, 프로그래밍에서 이진수에 대한 이해도는 필수적입니다. 물론 중학교 정규 수학 과정에서 이진수를 배우기 때문에 크게 문제될 건 없지만, 아직 이진수를 배우지 않았거나 잊어버린 분들을 위해 간단하게 설명을 하고 넘어가도록 하겠습니다. 이진수에 대해 이미 알고 있다면 '비트 단위'에 대한 부분으로 넘어가시는 걸 추천합니다. 1. 거듭제곱 (지수가 정수인 경우) 이진수, 십진수 등 기수법을 알기 위해선 먼저 거듭제곱을 알아야 합니다. 거듭제곱은 하나의 수를 주어진 횟수만큼 곱하는 연산으로, 예를 들어..
Table of Contents printf이스케이프 시퀀스문제 1. printf C언어로 프로그램을 만들 때, 가장 많이 하게 되는 작업 중 하나가 사용하고 싶은 기능을 가진 함수를 만드는 것입니다. 그러나 사용할 함수를 모두 스스로 코딩할 필요는 없습니다. 미리 만들어져 있는 함수를 가져다 씀으로써 효율적인 프로그래밍이 가능하기 때문입니다. 이 글에서는 그러한 함수 중, printf 를 소개합니다. printf 는 에 있는C언어의 대표적인 출력 함수로서, printf("출력할 내용"); 이런 식으로 큰따옴표 안에 원하는 내용을 적기만 하면 되는 편리한 함수입니다. 아래와 같은 프로그램을 실행해보면 큰따옴표 안의 내용이 출력되는 걸 확인할 수 있습니다. 123456789//code by RiKang, ..
Table of Contents 컴파일러 hello world! 프로그램 분석 1. 컴파일러 영어로 compiler, 이름 그대로 컴파일을 해주는 도구입니다. C언어가 아무리 프로그래밍 언어라고 해도, 기계 입장에서는 0101010으로 이루어진 것이 아닌 꽤 복잡한 언어입니다. 따라서 CPU가 C언어의 명령들을 그대로 실행하는 것에는 무리가 있습니다. 하지만 C 컴파일러가 있다면 문제 되지 않습니다. C 언어로 작성된 명령들을 C 컴파일러에게 전달하면, C 컴파일러가 알아서 컴퓨터가 이해할 수 있는 기계어로 바꾸어 주기 때문입니다. 이러한 과정을 컴파일이라고 합니다. 당연하다면 당연한 이야기지만, 결국 C언어를 공부하기 위해선 이 컴파일러가 필요하게 됩니다. 컴파일러는 직접 PC에 설치하여 사용할 수도 ..
Table of Contents 프로그래밍 언어 C언어 들어가기 전에 1. 프로그래밍 언어 컴퓨터, 스마트폰 등에 장착된 CPU가 0과 1만 가지고 정보를 처리한다는 건 이미 유명한 사실입니다. 하지만, 그렇다고 해서 프로그래머가 010001100...01010 이런 식으로 하나하나 타이핑을 하며 프로그램을 만들지는 않습니다. ( 프로그래밍이 01010을 치는 작업이라면 간단한 프로그램 하나 만드는 데 평생이 걸릴지도 모르는 일입니다.) 그리고 기계는 기본적으로 한글이나 영어 같은 인간의 언어를 이해할 수 없습니다. 인간의 언어와 기계의 언어, 이 둘 사이에는 프로그래밍을 배우기 전까진 인식하기 힘든 큰 갭이 있는 것입니다. 바로 이러한 갭을 줄여주기 위하여 개발된 것이 '프로그래밍 언어' 입니다. 인간..