ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C언어/Day1] C언어 수업정리 (정보처리기사, 실기)
    Backend 2019. 5. 12. 15:38

    정보처리기사 실기반 수강을 시작하면서 C언어 기초를 배우게 되었다.

    아마 컴퓨터공학 관련 학과를 나왔다면 아마 필수적으로 공부했을 과목인데,

    나는 비전공이라서 이번 기회에 처음 접하게 되었다.

     

    내가 지금 공부하고 있는 자바스크립트와 가장 크게 다른 점은

    자바스크립트는 인터프리터 언어이고 C언어는 컴파일러 언어라는 점이다.

    이 부분에 대해서는 아래 글에 좀 더 자세하게 설명되어 있다.

     

    https://im-developer.tistory.com/77

     

    [JS/호이스팅] Interpreted Language인 자바스크립트의 호이스팅(Hoisting)에 대하여

    자바스크립트, 인터프리터 언어(Interpreted Language) 보통 우리가 사용하는 프로그래밍 언어는 고급 언어(High Level Language), 컴파일러 언어라고도 한다. 즉, 기계가 이해할 수 있는 0과 1로 표현된 2진수 언..

    im-developer.tistory.com

     

    하여튼 c언어 기초를 공부해보니 자바스크립트랑 다른 점이

    은근히 많아서 재밌긴 한데 매우 헷갈리므로.. 블로그에 열심히 정리해보려고 한다.

     

     

    1. printf

    #include<stdio.h>		// standard input output.head
    int main() {
    	printf("Hello \'c\' \n");
    	printf("안녕 \n");
    	printf(" \"me\" \n");
    	printf("c:\\workEx \n");
    	printf("\n");
    	printf("-----------------\n");
    	
    	system("pause");
    	return 0;
    }

    먼저 가장 기본적인 출력부터 해보자.

    #include<stdio.h> 부분이 head부분인데 stdio.h는 standard input output.head의 약자이다.

     

    c의 가장 기본적인 함수는 int main() {} 이러한 형태로 작성한다.

    여기서 main()앞에 붙은 int는 main()함수의 return값이 정수라는 뜻이다.

    실제로 저 함수 맨 마지막에 return 0;이라고 적혀있다.

     

    printf()함수의 f는 format의 약자이다.

    다양한 형태로 ()안의 내용들을 화면에 출력해준다.

     

    출력결과

     

    ★ 자바스크립트는 문장 마지막에 ;을 붙이지 않아도 에러가 나지 않지만,

    C언어는 문장 마지막에 ;을 붙이지 않으면 에러가 난다.

     

     

    2. 대입문 / 10진수, 16진수, 8진수, 문자 표현

    #include<stdio.h>
    int main() {
    
    	printf("10진수= %d \n", 65);
    	// 0100 0001
    	printf("10진수= %5d \n", 65);	// 5: 자릿수
    
    	printf("16진수= %x \n", 65);
    	printf("16진수= %#x \n", 65);
    	printf("16진수= %#X \n", 65);
    	// 0100 0001
    	//  4    1
    
    	printf("8진수= %o \n", 65);
    	printf("8진수= %#o \n", 65);
    	// 001 000 001
    	//  1   0   1
    
    	printf("문자= %c \n", 65);
    	// 0100 0001
    	//  4    1
    
    	printf("10진수 = %d, 16진수 = %#X, 8진수 = %#o, 문자 = %c \n", 65, 65, 65, 65);
    	printf("10진수 = %d, 16진수 = %#X, 8진수 = %#o, 문자 = %c \n", 97, 97, 97, 97);
    	printf("10진수 = %d, 16진수 = %#X, 8진수 = %#o, 문자 = %c \n", 49, 49, 49, 49);
    	printf("-----------------------------------\n");
    	printf("10진수 = %d, 16진수 = %#X \n", 250, 250);
    	printf("10진수 = %d, 16진수 = %#x \n", 250, 250);
    
    
    	system("pause");
    	return 0;
    }

    printf("10진수 = %d", 50);와 같이 적으면 뒤에 적은 50을 %d자리에 대입하여 출력한다.

    여기서 %d10진수(decimal number) 정수를 출력할 때 사용한다.

    8진수(octal number)를 출력할 때는 %o를 사용하면 된다.

    16진수(hexadecimal number)를 출력할 때는 %x 또는 %X를 사용한다.

    (x를 사용하면 16진수가 소문자로, X를 사용하면 대문자로 표현되므로 주로 대문자 X를 사용한다.)

     

    여기서 문제점은 8진수 65를 출력하면 101

    16진수 65를 출력하면 41이 출력되는데

    이 숫자들이 10진수 101을 말하는건지 8진수 101을 말하는건지 알 수가 없다는 점이다.

     

    그래서 우리는 8진수와 16진수를 구분하기 위해서

    %#o

    %#X

    이런 식으로 #을 붙여준다.

    그러면 16진수는 숫자 앞에 0X가 붙어서 출력되고,

    8진수는 숫자 앞에 0이 붙어서 출력된다.

     

    출력결과

     

     

    3. 대입문 / 변수의 주소값 출력

    #include<stdio.h>
    int main() {
    	int a = 0, b = 1, c;	// int : 정수 (4byte - 32bit)
    
    	printf("a의 값은 %d 입니다. \n", a);
    	printf("b의 값은 %d 입니다. \n", b);
    	// printf("c의 값은 %d 입니다. \n", c);
    
    	printf("--------------------- \n");
    	printf("a의 변수의 주소는 %#X 입니다. \n", &a);	// &a : a공간의 주소가 출력
    	printf("b의 변수의 주소는 %#X 입니다. \n", &b);
    	printf("c의 변수의 주소는 %#X 입니다. \n", &c);
    	printf("--------------------- \n");
    
    	a = a + 7;
    	b = b + 10;
    	c = a;
    	printf("a의 값은 %d 입니다. \n", a);
    	printf("b의 값은 %d 입니다. \n", b);
    	printf("c의 값은 %d 입니다. \n", c);
    
    	printf("--------------------- \n");
    	printf("a의 변수의 주소는 %#X 입니다. \n", &a);	// &a : a공간의 주소가 출력
    	printf("b의 변수의 주소는 %#X 입니다. \n", &b);
    	printf("c의 변수의 주소는 %#X 입니다. \n", &c);
    
    	system("pause");
    	return 0;
    }

    printf()함수에 값을 대입시킬 때, 바로 숫자를 넣을 수도 있지만

    변수를 선언하여 변수를 대입시킬 수도 있다.

     

    정수 타입인 변수를 선언할 때는 int를 사용한다.

    (자바스크립트에서는 변수의 type과는 상관없이 var라는 변수를 사용하는 데,

    c언어에서는 변수 type에 따라 변수 선언하는 방식이 달라진다.)

     

    변수 앞에 &을 붙이면 그 변수의 주소를 출력할 수 있는데,

    주소는 보통 16진수로 출력한다.

     

    실행결과

     

    실행결과를 보면 변수의 주소는 어디서 출력하던지 항상 동일하다.

    또한, 이 구문을 실행할 때마다 주소값이 바뀌는데, 그 이유는

    RAM(Random Memory Access)이 실행할 때마다 공간을 랜덤으로 할당하기 때문이다.

     

     

    4. 반복문

    // sum = 7+7+7+7+7
    #include<stdio.h>
    int main() {
    	int sum = 0, cnt;
    
    	for (cnt = 1; cnt <= 10; cnt++) {
    		sum = sum + 7;
    		printf("%d번 sum = %d \n", cnt, sum);
    	}
    
    	printf("---------------반복문 종료--------------- \n");
    	printf("cnt= %d, sum = %d \n", cnt, sum);	// cnt = 11
    
    	system("pause");
    	return 0;
    }

    sum = 7+7+7+...+7;

    이런 식으로 sum이라는 변수에 7을 10번 반복하여 더하는 함수는 위와 같이 만든다.

    자바스크립트와 거의 동일한 내용이어서 자세한 설명은 패스.

     

    (중요한 것은 반드시 sum이라는 변수에 0을 할당하여 초기화시켜주어야 한다는 점이다.

    sum에 어떤 값도 할당하지 않고 선언만 하면 그 값은 undefined가 된다.

    undefined에는 어떤 값도 더하거나 빼거나 할 수 없으므로 에러가 발생한다.

    이 것은 자바스크립트에서도 동일하다.)

     

    출력결과

     

    여기서 또 짚고 넘어가야할 점은 반복문이 종료된 후 cnt를 출력해보면 

    10이 아닌 11이 실행된다는 점이다.

    cnt는 증감식에서 cnt++에 의해 11이 되고

    조건식으로 가는 데, 조건식인 cnt <= 10을 만족하지 않으므로 반복문을 빠져나가게 된다.

     

     

    5. 산술연산자 / 몫과 나머지 구하기

    #include<stdio.h>
    int main() {
    	int a = 13, b = 2, na;
    	double mok;	 // 실수 - float도 가능
    
    	printf("  덧셈 연산 결과: %d \n", a + b);
    	printf("  뺄셈 연산 결과: %d \n", a - b);
    	printf("  곱셈 연산 결과: %d \n", a * b);
    	printf("나누기 연산 결과: %d \n", a / b);	// 6이 출력 - 나눗셈에서 몫 계산할 때
    	printf("나머지 연산 결과: %d \n", a % b);	// 1이 출력 - 나눗셈에서 나머지 계산할 때
    
    	mok = (double)a / b;	// 실수로 계산
        
        	mok = (int)a / b;	// 정수 몫
    	na = a - a / b * b;  // 나머지 = a - mok * b
    
    	printf("나누기 연산 결과:몫 %.2f \n", mok); // 소수점 자릿수 표시 %.2f
    	printf("나머지 연산 결과: %d \n", na);
    
    	system("pause");
    	return 0;
    }

    변수 타입이 정수라면 int를 사용해서 선언해야하지만

    실수인 경우에는 double이나 float을 사용해서 선언한다.

     

    a가 13이고 b가 2인 경우에 a / b를 한다면 값은 6.5가 아니고 6이 출력된다.

    c언어에서는 a / b 연산 시 자동으로 정수형으로 변환해준다.

     

    만약에 double c = a / b 연산을 한다면

    a / b 연산으로 6이 계산되고 c라는 실수형 변수에 값을 넣었으므로 6.0000...이 출력된다.

     

    만약 a / b를 연산하여 실수값 그대로 출력하고 싶다면

    (double)a / b 혹은 (float)a / b를 해주면된다. (6.50000.... 출력)

    즉, a와 b 둘 중에서 하나만 실수 타입으로 바꿔주면 실수로 계산된다.

     

    다만! 그 실수 타입으로 계산된 값을 넣을 변수 mok은 반드시 실수 타입으로 선언해야한다.

     

    나머지와 몫은 다음과 같이 풀어서 계산할 수도 있다.

    몫: mok = (int)a / b;

    나머지: na = a - mok * b;

     

    실행결과

     

    반응형

    COMMENT