상세 컨텐츠

본문 제목

부스트코딩 뉴비챌린지 스터디 2주차 : C언어

IT/스터디

by J KIMS 2020. 8. 13. 17:55

본문

반응형

몇 주전에 학습한 내용인데 포스팅이 밀려서 이제 업로드하네요.

아직 임시저장에 글 열개 넘게 쌓여있는 😅

 

-

 

1) C기초

 

https://sandbox.cs50.io/

 

CS50 Sandbox

Temporary programming environments for students and teachers.

sandbox.cs50.io

cs50 샌드박스를 이용하면 별도의 프로그램 설치 없이 C언어로 프로그램을 작성하고 실행 가능합니다.

로그인에 깃허브 계정이 필요하고 코드는 자동 저장됨.

 

📣 cs50 샌드박스뿐만 아니라 리눅스 운영 체제에도 실행되는 명령어들

- 컴파일하는 방법 : clang filename.c- cs50 헤더 파일을 포함해서 컴파일 하는 법 : clang filename.c -lcs50

- 컴파일 + 헤더파일을 포함해서 더 간단히 하는 법 : make filename (filename이란 이름으로 실행파일이 생김)

- 실행파일 실행 :./a.out

 

💡 컴파일이란?

우리가 작성한 코드는 '소스코드(source code)'라고 불리는 것으로 컴퓨터가 읽을 수 있는 언어가 아님. 컴파일을 통해 소스코드를 컴퓨터가 이해 가능한 언어인 '머신 코드(machine code)'로 변환한다. 머신 코드는 2진수로 작성되어있다. 이를 실행해주는 프로그램은 컴파일러라고 부른다.

 

 

 

C언어에선 기본적으로 다음과 같은 구조로 코드를 작성함.

#include <stdio.h>

int main(void)
{
	printf("Hello, World!\n");
}

첫 줄의 stdio.h는 헤더 파일 중 하나이며 stdlib.h, string.h 등등 여러 가지가 있음.

기본적으로 stdio.h는 반드시 포함시켜줘야 함. 

 

int main(void){ }는 메인 함수로 메인함수 안에 코드를 작성함.

 

그리고 띄어쓰기나 들여 쓰기는 코드 가독성과 관련 있기 때문에 표준 스타일 가이드를 참고해서 작성하면 좋음.

띄어쓰기 없이 마음대로 코드를 붙여서 적어도 정상적으로 실행은 되겠지만 바람직하지 않음. 좋은 코드를 많이 보고 그들의 스타일을 익히자는 주의.

 

 

 

2) 문자열

 

cs50.h 헤더 파일을 포함시키면 문자열을 입력받는 함수 get_string()과 string 타입을 쓸 수 있음.

#include <stdio.h>
#include <cs50.h>

int main(void)
{
	//변수 answer을 string 타입으로 선언하고 문자열을 입력받음
	string answer = get_string("What's your name?");
    
    //answer 출력
   	printf("hello, %s\n", answer);
}

C언어에서는 입력받는 데이터 타입에 따라 변수의 타입을 지정해줘야 함.

이 경우 문자열을 입력받기 위해 string 타입으로 변수를 선언함. 사실 c언에는 string타입이 존재하지 않지만 cs50.h에서 별도도 지정되어 있음. 문자열을 입력받는 것은 꽤 복잡하기 때문에 차후 강의에서 다룸.

 

📣 C언어 자료형의 기본

자료형(data type) 설명
int 정수
float 실수 (32비트)
double 실수 (64비트)
char 문자 한 글자
string 문자열 (cs50.h에만 존재)

float와 double은 둘 다 실수를 출력할 때 쓰지만 double의 범위가 더 크다. (자료형 크기도 두배임)

 

문자열을 출력할 때는 string의 앞 글자인 s를 따와서 % s변환자를 사용함.

% s의 자리에 변수 answer의 값이 출력되는 것.

 

C언어에서 변수 입출력에 필요한 서식 지정자는 여러 가지가 있는데 처음부터 다 외울 필요는 없고 중요한 거 몇 개만 기억하자.

 

📣 C언어 서식 지정자

서식 지정자 타입
%d 정수 출력
%f 실수 출력
%c 문자 하나 출력
%s 문자열 출력 (cs50.h에만 존재함)

 

 

 

3) 조건문과 루프

 

📣 조건문 if

if(x<y)
{
	printf("x is less than y\n");
}
else
{
	printf("x is not less than y\n");
}

if문의 괄호 안의 조건이 참이면 바로 다음 문장을 실행하고 그렇지 않으면 else 이후의 문장을 실행함.

중괄호는 조건에 따른 실행문이 하나일 때는 생략 가능함.

if(조건문1)
	실행문1;
else if(조건문2)
	실행문2;
else
	실행문3;

조건문을 추가할 수도 있음. 이 경우 조건문 1이 거짓이면 조건문 2의 검사로 넘어감. 만약 조건문1, 조건문2 둘 다 거짓이면 else 뒤의 문장이 실행됨.

 

📣 while 문

while(x>0){
	printf("x is greater than 0\n");
}

괄호 안의 조건이 참일 때 중괄호 안의 코드를 반복해서 실행한다.

while(true){
	printf("hello, world!\n");
}

괄호 안에 true라고 적어도 루프가 실행됨! 이 경우 무한히 반복되므로 루프가 멈추는 조건을 만들어주는 게 필요함.

 

📣 for 문

for(int i=0; i<10; i++){
	printf("%d", i);
}

위 코드는 i를 0으로 초기화 한 뒤, i가 10보다 작을 때 루프를 반복하여 i값을 출력한다.

i++는 i의 값을 1 증가시키는 걸 의미한다. (반대로 --도 있음)

 

for문의 실행 순서는 1234234234..라고 생각하면 된다. 변수 초기화는 처음만 해주고 그다음부턴 조건을 판단하고 괄호 안의 코드를 실행하고 변수를 증가시키고를 반복한다.

 

for문 안에 또 for문을 넣어서 중첩 루프를 만드는 것도 가능하다.

 

만약 반복 조건을 비워두면 무한 루프가 된다.

 

 

 

4) 사용자 정의 함수

 

메인 함수뿐만 아니라 직접 원하는 기능을 정의한 함수를 만드는 것이 가능하다.

사용자 정의 함수는 코드의 재사용성, 가독성을 높여준다.

 

이미지출처: 부스트코스 모두를 위한 컴퓨터 과학 

프로토타입은 함수의 헤더 부분과 똑같이 생겼다. C는 그렇게 똑똑하지 않다.

프로그램의 말머리에 프로토타입을 적어주는 것은 C에게 이런 함수가 있다는 걸 알려주기 위함이다.

 

만약에 사용자 정의 함수를 메인 함수보다 위에 적는다면 굳이 프로토타입을 적을 필요가 없지만 가독성이 떨어지기 때문에 보통은 말머리에 프로토타입을 적고 함수 본체는 메인 함수 뒤에 적는다.

 

함수가 실행되는 걸 함수 호출이라고 한다. 메인 함수가 지정한 함수를 호출하면 사용자 정의 함수가 실행되며, 실행이 끝나면 다시 메인 함수의 그 위치로 돌아가 남은 코드를 마저 실행한다.

 

 

 

5) 하드웨어의 한계

 

 

📣RAM(Random Access Memory) : 모든 프로그램이 실행 중 저장되는 곳. 컴퓨터의 메모리 용량은 유한하다.

 

컴퓨터의 메모리 용량이 유한하기 때문에 계산에서 오차가 발생하기도 한다.

 

#include <stdio.h>
#include <cs50.h>

int main(void)
{

	float x = get_float("x : "); // 실수 x값 입력
    float y = get_float("y : "); // 실수 y값 입력
    
    printf("x / y = %f\n", x / y);
    
}
   

위의 코드를 실행시키면..

1과 10으로 나누었는데 결괏값이 조금 이상하다. 이는 float 자료형이 32비트까지만 숫자를 담기 때문에 그 뒤는 연산이 안 되는 부분이 생기고, 결과적으로 0.1에 가장 가까운 값을 저장하기 때문이다.

 

📣 오버플로우(overflow)

 

위 프로그램은 i에 2를 계속 곱하면서 출력하는 것인데, int형이 표현할 수 있는 숫자의 범위를 넘어서서 오류가 발생했다. 이를 오버플로우라고 한다.

 

int의 크기는 32비트(4바이트)-2,147,483,648 ~ 2,147,483,657 사이의 범위에서 값을 나타내는 게 가능하다. 

 

위의 프로그램에서는 int의 최댓값인 2,147,483,657을 초과하여 최솟값인 -2,147,483,648을 뱉고 그 후론 0을 출력하고 있는 모습이다.

 

 

📣 Y2K 문제

 

과거에 저장 공간을 절약하기 위해 연도의 끝자리 두 개만 저장하면서 생긴 문제. 앞의 두 자리는 변경이 불가능하기 때문에,  99에 1을 더하면 2000이 아닌 1900이 되어버리는 문제가 발생한다. 

 

 

이 문제를 해결하기 위해 프로그래머들에게 수백만 달러를 투자해서 더 많은 메모리를 사용하도록 했다고 한다.

 

이와 비슷하게 보잉 787도 248일 동안 사용된 후 오버플로우로 인해 안전모드로 들어가는 버그가 존재했다고 한다. 248일을 1/100초로 계산하면 248x 24 x 60 x 60 x 100 = 2,142,720,000 거의 2의 32승이다. 

반응형

관련글 더보기

댓글 영역