본문으로 바로가기

Day-1 프로그램과 C언어, 자료형

category Programming/TIPS 17기 2017. 6. 28. 20:38

 

 

 

 

C언어 공부 순서

 

 

 

 

 

C언어의 특

 

C언어는 절차 지향 프로그램이다. 절차 지향이라는 것은 "정해진 순서대로의 실행"을 중요시 한다는 뜻이다.

구조화된 언어를 갖고 이식성과 생산성이 높고, 확장성이 좋고, 표현법이 다양하다는것 또한 특징이다.

 

C언어의 공부법

 

우리는 일상적으로 말이나 생각을 할때 생략된 부분이 많다. 하지만 C언어의 특성처럼 절차를 중요시 하기 때문에 생략이 있으면 안되고 순서를 중요시 해야 한다. 따라서 일상적인 부분에서 생략된 부분을 찾아서 생각해 보는 연습도 중요하다.

 

다시한번 말하지만 C언어는 절차 지향프로그램이다. 따라서 순서도 or 플로우 차트등을 그려보는 연습을 하는것도 좋다.

 

C언어는 Unix라는 운영체제의 개발을 위해 Dennis Ritchie와 Ken Thompson이 만든 언어다. Dennis Ritchie 와 Ken Tompson의 C언어를 만들게 된 일화나 이야기들을 읽어보면  C언어에 대해서 더욱 자세히 이해할수 있기 때문에 이러한 뒷 이야기들을 읽어보자

 

 

데이터의 저장

 

데이터에는 저장할 수 있는 값들이 있는데 데이터에는 변수와 상수를 저장할 수 있다.

변수는 변할수 있는 값들을 말하고 상수는 변수와 반대되는 개념으로 변할수 없는 값들을 의미한다.

 

명령문

 

명령문을 알아보기 앞서 ;(세미콜론)에 대해서 알아보자.

;(세미콜론)은 문장분리자라고 불리면서 명령문과 명령문을 구분해주는 문자이다.

 

명령문은 단일명령문과 복합명령문으로 나뉘어 진다.

단일 명령문은 ;(세미콜론)으로 구분하며 논리적 명령의 최소실행 단위이다.

a = a + b ; 이렇게 쓰이며 a = a + b가 명령문이고 ;으로 명령문이 끝났다는 것을 알려준다.

 

복합 명령문은 단일 서술문 여러 개를 하나로 묶은 형태로 { }를 사용하여 표현한다.

{ a = a + b; a = a + c; }로 사용한다. { }뒤에는 ;(세미콜론)을 붙여주지 않아도 된다. 간혹 초보자 중 복합 명령문 뒤에 ;(세미콜론)을 붙이는 사람도 있지만 컴파일 에러가 발생하지 않아 확인이 되지 않는다. 이유는 ;(세미콜론)은 명령문을 구분해주는 문자이기때문에 {}; 는 ;(세미콜론)이 의미없는 명령문을 가지고 있다고 컴파일러가 인식하기 때문이다.

 

주석문

 

주석은 소스코드에 삽입되는 메모라고 할 수 있다. 주석문은 코드와 같이 소스코드 속에 기입 되지만 컴파일이 되지 않는다.

주석문은 크게 두가지로 나뉘어 지는데 블록 단위 주석과 행단위 주석이 있다.

블록단위 주석의 사용법은 /*(주석 내용)*/사이에 내용을 입력하는 것이다. 블록 단위 주석문은 행과 상관없이 블록 단위로 주석처리가 된다.

/* 블록단위 주석문입니다. */ 

행단위 주석의 사용법은 // (주석내용) 을 입력하는 것이다. 행단위 주석은 한 행만 주석 처리 되는것이니 차이점을 알아두자

// 행단위 주석문 입니다.

 

예약어

 

프로그래밍 언어의 문법에서 미리 사용되고 있는 단어라고 할 수 있다.

main while for int char 등이 있는데 이름을 짓는 문법이 사용될때 예약어를 사용할 수 없다.

 

C프로그램 실행 파일의 실행 과정

 

프로그래머가 *.c이라는 소스파일을 디버깅 하면 컴파일 과정을 통해 *.obj라는 목적 파일이 생긴다. 이 목적 파일을 가지고 링커가 링크하여 *.exe라는 실행파일이 생긴다. 참고로 컴파일에서 링크로 넘어가는 과정을 빌드 또는 make라고 한다.

 

그러면 왜 굳이 소스파일을 바로 실행파일로 만들지 않고 소스파일을 목적파일로 나누는지에 대하여 알아보자.

소스파일이 짧을 때는 상관 없지만 소스파일이 길어지면 컴파일하는데 시간이 오래걸린다. 즉 오탈자나 문법적 오류가 발생해서 다시 컴파일을 해야할 경우에 소스파일 중 다시 컴파일 하지 않아도 되는 부분을 처음부터 끝까지 다시 컴파일 해야하는 경우가 생긴다. 이렇게 된다면 속도가 느려지게 되고 프로그램의 개발이 더뎌진다. 따라서 소스파일이 길어질때 소스파일을 여러개로 나누어 준다. 따라서 소스파일에 해당하는 각각의 목적 파일이 생성되고 소스파일의 변경으로 인해 바뀐부분만 다시 컴파일되어 목적파일을 생성하고 바뀌지 않은 부분은 기존의 목적파일을 가지고 링커가 링크해주어서 실행파일이 생긴다. 이같은 과정을 통해 속도 향상의 이점을 얻을 수 있다.

 

비트(Bit)

 

비트는 데이터를 저장할 수 있는 최소단위이다. 일반적으로 비트에 0과 1만 들어갈수 있다고 생각하며 선입견을 갖는데 사실 두가지 중 한가지를 저장한다. 오전, 오후 또는 불의 켜짐, 꺼짐 과 같은 것들을 저장할 수 있다.

 

바이트(Byte)

8개의 비트로 구성된 저장단위로 그림으로 표현하면 아래와 같다.

 

1바이트에 저장될 수 있는 경우의 수는 위와 같이 256개의 경우의 수가 존재한다. 대부분의 처음 입문을 하시는 분들은 1바이트의 저장되는 수는 양수로만 표현할 때 0~255 사이의 값, 음수와 양수로 표현할때 -128 ~ 127까지의 수 만 저장할 수 있다고 생각하는데 우리가 주목해야할 값은 256이라는 경우의 수이다. 데이터의 크기가 중요한 것이 아니라 데이터의 경우의 수가 중요하다. 데이터의 경우의 수에 주목을 하면 500~600 사이의 데이터를 읽을 수 있다. 500~600사이의 데이터는 경우의 수가 경우의 수가 100이니 Byte에 저장할 수 있다. 위와 같이 경우에 수에 주목을 하면 소스를 작성할때 프로그램의 용량을 조금이라도 줄일 수 있으니 경우의 수에 주목하자.

 

표현방식

 

1Byte -> 1KByte -> 1MByte -> 1GByte -> 1TByte 순으로 오른쪽으로 갈수록 용량이 큰것을 의미한다.

데이터 표현 방식이 바뀌기 위해서 는 각 데이터 표현방식에 X1024를 하면된다.

 

부호비트

 

부호비트는 양수와 음수를 구별하는 비트로서 비트의 가장 왼쪽에 위치한 비트가 부호비트이다.

표현해보면 아래와 같다.

부호비트가 0이면 양수, 1이면 음수라는 뜻이다.`

따라서 양수로는 0~127까지 표현이 가능하고(0을 양수로 취급), 음수는 -128~-1까지 표현이 가능하다.

총 1Byte의 표현 범위는  -128 ~ 0 ~ 127까지 이다.

자주 헷갈리는 것 중 하나가 음수 중 가작 작은값은 -128이고 음수 중 가장 큰값은 -1이라는 것을 잘 기억해 두자.

 

 

각 비트를 아래와 같이 표현하기도 하니 알아두자.

 

자료형을 사용할때 부호가 있는 자료형을 사용할때도 있고 부호가 없는 자료형을 쓸때도 있다.

아래의 예제를 보고 알아보자

 

 

 

부호가 있는 자료형이면 부호비트를 뺀 나머지 값을 보면 된다. 부호가 있는 자료형을 보면 부호비트를 빼면 000000이기 때문에 음수 중 제일 작은값 -128이 나오는 것이고 부호가 없는 자료형은 부호비트를 부호비트가 아닌 그냥 7비트로 본 숫자이다. 따라서 128이다.

 

 

 

부호가 있는 자료형을 보면 1을 뺀 나머지 비트는 1111111이다. 따라서 음수 중 가장 큰 값은 -1이다.

부호가 없는 자료형을 보면 부호비트를 부호가 없는 7비트의 수로 생각 하기 때문에 가장 큰 수인 255이다.

 

아스키 코드(American Standard Code Information Interchange)

 

컴퓨터와 사람이 서로 의사소통 하기 위한 약속이다. 즉, 컴퓨터에서 문자를 숫자로 표현하기 위한 약속이다.

아스키 코드 중 알면 좋은 값들이 있다.

 

A=65 , a=97, 0=48 이정도만 알고 있으면 편리하다.

A와 a를 보면 32의 숫자 차이가 난다. 32 = 2^5 이다. 이것을 보며 아스키코드를 그냥 만든것이 아니라 충분히 생각해서 만들었다는 것을 알 수 있다.