#상당히 늦었습니다. 죄송합니다. 오랫만에 와서 올리는 건데 짧은 내용에 대해 미리 사과의 말씀 드리고 진행 하도록 하겠습니다.




이번에는 do~while문에 의한 문장의 반복에 대해 알아보도록 하겠습니다.





1. do~while문 이란?


do~while문이란 '반복영역을 최소한 한번은 실행하는 구조'인 반복문 입니다.


do~while문은 while문과 거의 차이가 없습니다.


그러면 왜 do~while문이 필요하지? 라는 궁금증이 생기실 수 있습니다.


이와 관련하여 다음의 예제를 보도록 하겠습니다.



위의 예제에서 확인할 수 있듯이 do~while문과 while문은 차이가 거의 없습니다.


예제를 봐도 똑같지 않나? 라는 생각을 하실 수 있습니다.


이러한 궁금증에 대해서 위의 예제를 통해 다시 한 번 자세히 살펴보면 다음과 같은 사실을 알 수 있습니다.


1) 위의 예제의 경우에는 반복횟수가 이미 정해져 있습니다.

2) while문은 조건을 확인 하는 문장이 위쪽에 있는데 do~while문은 뒤쪽에 있습니다.

* 영어사전에서 do 는 '~하다' 라는 의미입니다.


여기까지 오셨으면 어느정도 눈치 채신 분들도 계실거고, 이러한 생각도 하실 수 있습니다.


단순하게 사용자의 입력이 완료될 때까지를 기다리는 계산기처럼 반복 횟수가 정해지지 않았을 경우 어떻게 하지?


C언어의 절차지향적 언어의 특성으로 위에서 부터 아래쪽의 순으로 순차적으로 실행 할 경우 do~while문의 반복영역은 무조건 한 번이 실행되나?


라는 궁금증이 생기실 수 있습니다.


우선 do~while문은 무조건 do~while문 의 중괄호 { } 사이의 영역은 무조건 처음에는 한 번 실행을 한 후, 조건을 검사합니다.


또 한가지 예를들면 사용자의 입력이 언제 끝날지 모르고, 무조건 한 번은 입력이 되어야 할 경우 do~while문을 사용합니다.


이러한 경우에는 while문 보다 do~while문이 훨씬 자연스럽기 때문입니다.


다음은 do~while문이 while문 보다 자연 스러운 상황을 나타내는 예제입니다.



위의 예제에서처럼 무조건 한 번은 실행이 되어야 할 경우에 do~while문을 사용하게 됩니다.


아직 이해가 되시지 않으신 분들은 다음 예제를 보도록 하겠습니다. (제 설명이 부족해서..)



위의 예제에서 보시는 것처럼 프로그램이 입력을 받기도 전에 종료가 되어 버렸습니다.


조건식을 만족하지 않아 while문의 반복영역을 실행조차 하지 않고 종료가 되는 것을 확인 하실 수 있습니다.


여기서 '그럼 조건식을 바꾸거나 조건에 사용된 변수를 다른 값으로 초기화 하면 되지 않나?' 라는 분들이 계실수도 있습니다.


당연히 가능합니다.


하지만 그렇게 하는 경우도 계실 수 있지만 '무조건 한 번은 실행 시키는 프로그램을 만들어야 되는데 while문 밖에 쓸 수 없다' 라는 문제에 직면 했을 경우 다음과 같이 do~while문이 while문 보다 자연 스럽다는 것을 아실 수 있습니다.



위의 예제에서처럼 무조건 한 번을 입력해야 되는데 '저는 do~while 문은 모릅니다. ㅠㅠ' 라는 상황이 생겼다고 가정하겠습니다.


그리하여 while문을 이용해서 작성을 해 본 결과 굉장히 부자연 스럽다는 것을 확인 할 수 있습니다.



이렇듯 do~while문은 입력을 받아 누적이 되어야 하는 프로그램의 경우 do~while문이 훨씬 자연스러운 것을 알 수 있었습니다.


또한 '최소한 1회는 반복영역을 실행하게 된다'는 점이 while문과의 가장 큰 차이점이라 할 수 있습니다.






이것으로 C언어 반복문 중 하나인 do~while문에 대하여 알아 보았습니다.



다음에는 for문에 의한 문장의 반복에 대하여 공부하고 글을 올리도록 하겠습니다.












'프로그래밍 언어 > C' 카테고리의 다른 글

C언어 반복문 - for문 (2)  (0) 2017.01.15
C언어 반복문 - for문 (1)  (0) 2017.01.12
C언어 반복문 - while문(2)  (0) 2017.01.02
C언어 반복문 - while문(1)  (0) 2017.01.02
C언어 printf 함수 와 scanf 함수  (0) 2017.01.01

이번에는 저번 글 http://widevery.tistory.com/7 에 이어서 while문의 루프와 중첩에 대하여 알아 보겠습니다.





1. 무한루프


while문에서 while(조건식) 과 같이 조건식이 '참'인 경우 while문의 내용을 실행하고, 조건식이 '거짓'일 경우 while문을 종료하게 됩니다.


그렇다면 조건식이 '항상 참'인 경우에는 어떻게 될까? 라는 생각을 가져 볼 수 있습니다. 이와 같은 생각으로 다음과 같이 해볼 수 있습니다.



0을 제외한 나머지 값은 참으로 인식하니까 참으로 인식하는 값 중 대표적으로 많이 쓰이는 1을 조건식에 넣어서 실행 해볼까? 라는 생각을 가지고 실행하게 되면 위의 예제에서처럼 따로 멈춰주지 않는 이상 계속 실행을 하게 됩니다. ( Ctrl + C를 누르면 멈추게 됩니다.)


이렇듯 반복문의 탈출조건이 성립하지 않는 경우 무한루프를 형성한다고 합니다.


이러한 무한루프는 실수로 만들어지는 경우도 있지만, 의도적으로 만들어서 break문과 함께 사용하기도 합니다.

(break문은 추후 조건에 따른 흐름의 분기와 관련하여 내용을 다루면서 그 때 다시 다루도록 하겠습니다.)





2. while문의 중첩


while문의 중첩은 말 그대로 반복을 위해 사용한 while문 안에 while문이 존재하는 경우를 의미합니다.


다음 예제는 while문을 중첩시켜서 구구단 2~9단 까지 출력을 하는 예제인데, 해당 예제를 통해서 중첩된 while문의 코드 흐름을 이해하도록 하겠습니다.



위의 예제를 보시면 코드를 실행한 결과로 오른쪽에 구구단이 출력이 된 것과 해당 코드가 구구단을 출력하기 위한 코드라는 것을 확인 할 수 있습니다.


짧고 간단한 코드이지만 while문의 중첩을 모르는 상태에서 보게 될 경우 복잡해 보일 수가 있습니다.


우선 위 예제의 코드에서 다음과 같은 내용을 알 수 있습니다.


1) while문의 중첩

2) 원하는 결과의 출력을 위한 변수 초기화

3) while문의 조건 설정


이와 같은 내용들을 확인 할 수 있습니다.


먼저 while문에서 while(조건식) 의 '조건식'이 만족할 때까지 while문 내부에 있는 문장을 실행하는 것을 저번 글에서 알아 보았습니다.


그렇다면 while문의 내부에 while문이 있다면 while문 안쪽의 while문이 끝날 때까지 처음 작성한 while문은 계속 실행이 된다는 것을 알 수 있습니다.


이와 같은 내용을 바탕으로 위의 코드를 해석하면 첫 번째 while문의 조건이 i = 2 일 때 내부의 while문을 9번 실행하고, i가 하나씩 증가 되는 것을 알 수 있습니다.


i 값이 하나씩 증가하여 i 의 값이 9일 때까지 실행이 되고, i 가 10이 되면 while문을 실행하지 않고, while문을 종료 후 그 다음 문장을 실행하게 됩니다.


또한 위의 코드에서 첫 번 째 while문이 끝날 때까지 내부의 while문을 실행해야 되는데 9번째 줄에서 j = 1; 로 초기화를 시켜주는 이유는 초기화를 하지 않고 진행하게 될 경우 구구단을 정상적으로 출력하지 않게 됩니다.


초기화를 진행 해 주지 않으면 j의 값이 계속 10으로 지정 되어 있기 때문에 다음과 같이 실행 결과가 나오게 됩니다.



[구구단 출력 예제에서 곱해지는 값인 j 값의 초기화를 하지 않았을 경우]




또한 while문을 사용하지 않고 예제에 사용된 구구단 출력을 할 수도 있습니다.



[while문의 중첩을 활용하지 않고 출력을 한 경우]



위와 같이 효율이 떨어지게 됩니다.


따라서 반복문의 중첩을 자주 사용하게 됩니다.










이것으로 반복문 중 하나인 while문에 대하여 모두 알아 보았습니다.


다음 글에서는 반복문 중 하나인 'do~while문에 의한 문장의 반복'에 대하여 공부하고 글을 올리도록 하겠습니다.












'프로그래밍 언어 > C' 카테고리의 다른 글

C언어 반복문 - for문 (1)  (0) 2017.01.12
C언어 반복문 - do~while문  (0) 2017.01.09
C언어 반복문 - while문(1)  (0) 2017.01.02
C언어 printf 함수 와 scanf 함수  (0) 2017.01.01
C언어 상수와 기본 자료형  (0) 2016.12.27

이번에는 C언어에서 반복 실행을 위해 사용이 되는 반복문 중 하나인 while문에 대하여 알아보도록 하겠습니다.




1. 반복문


반복문 : 하나 이상의 문장을 두 번 이상 반복 실행하기 위해서 구성하는 문장입니다.


반복문의 종류는 'while', 'do~while', 'for' 문이 있습니다.


우선 반복이 필요한 이유에 대해서 다음의 예제를 보도록 하겠습니다.



위 예제에서 확인 할 수 있듯이 반복해서 할 수 있는 작업을 하나씩 전부 작업 해 준다면 효율이 떨어지게 됩니다.

(예제에서는 10개의 문장으로 예를 들었지만 100개, 1000개 등 그 이상을 하게 될 경우 효율이 굉장히 나빠지게 됩니다.)


이렇듯 반복을 해야 할 경우 쉽게 해주는 것이 반복문입니다.





2. while문의 사용


이번 글에서는 반복문 중 하나인 'while문'에 대하여 알아 보도록 하겠습니다.


while이라는 단어를 검색해 보면 '~하는 동안' 이라고 되어 있습니다.


프로그래밍에서도 마찬가지로 while문은 '~하는 동안 반복해라' 라는 것을 의미합니다.


while문을 사용해 보도록 하겠습니다.


while문 사용은 다음의 예제를 통해 먼저 알아보고 진행하도록 하겠습니다.



위 예제와 위쪽 글의 주제에 사용 되었던 예제 사진과 비교를 해 본 결과 반복문을 사용할 경우 훨씬 효율적인 것을 알 수 있습니다.


반복문 중 하나인 while문을 사용하기 위해서 다음과 같은 사실들을 알 수 있습니다.


1) 반복을 하기 위한 조건 설정 ( 5번째 줄의 int num = 1;  /  7번째 줄의 while 다음에 있는 (num < 11)  /  10번 째 줄의 num++; )


2) 반복을 하기 원하는 문장 ( 9번째 줄의 printf 문장 )


실행 순서는 다음과 같습니다.


(1) 10번 반복 하고 싶으니까 10번 반복을 위해 count 해 줄 값인 1을 num 이라는 변수에 저장

(2) while문을 선언하고 10번 반복을 위해 num이라는 변수에 저장 되어 있는 값이 11 보다 작을 때까지 라는 조건 설정

(3) 반복을 실행할 문장 작성

(4) num이라는 변수에 저장 되어 있는 값을 1 증가 (이 때 num++ 문장으로 인하여 num 값은 2가 됩니다.)

    (또한 아직 num에 있는 값이 while문의 조건 (num < 11) 을 만족하기 때문에 return 0; 문장을 실행하지 않고 다시 while문을 실행하게 됩니다.

(5) (3) ~ (4) 를 계속 반복 하면서 num 값이 11이 되어서 다시 while문의 조건(num < 11)으로 가서 해당 조건이 만족하지 않을 경우 while문을 빠져나오게 됩니다.

(6) return 0; 실행 (프로그램 종료)


이렇듯 반복을 원하는 문장과 반복 하기 위한 조건을 설정을 하게 되면 해당 반복조건이 만족하지 않을 때까지 while문이 실행이 되고, 반복조건이 만족하지 않으면 while문을 종료하고 다음 문장을 실행하게 됩니다.





3. while문의 들여쓰기


들여쓰기와 관련하여 다음의 예제를 보고 진행하도록 하겠습니다.



[들여쓰기 하지 않았을 경우]




[들여쓰기를 한 경우]



위의 두 사진에서 알 수 있듯이 들여쓰기를 해도 되고, 하지 않아도 상관은 없습니다.


단지 들여쓰기를 하게 되면 가독성이 훨씬 좋아지기 때문에 보편적으로 들여쓰기를 해서 프로그램을 작성합니다.


들여쓰기의 기준은 보통 띄어쓰기(Space) 4회 또는 Tab을 사용합니다.


들여쓰기를 하실 때 띄어쓰기(Space)와 Tab을 혼용해서 사용하시는 것보다 하나로 통일해서 일관성 있게 하는 것이 좋습니다.

(실제로 저는 처음에 프로그래밍을 할 때 띄어쓰기(Space)와 Tab을 혼용해서 사용 했었는데 작성한 소스를 수정할 때 굉장히 불편함을 겪은 적이 있습니다.)





4. 반복문의 중괄호 { } 생략


int main(void) 함수에서도 중괄호 { } 를 사용하였는데 while문에서도 사용하니까 불편하다 라고 하실 수도 있습니다.


이와 관련하여 생략을 할 수 있는 경우가 있습니다.


실행할 문장이 한 줄이거나, 한줄로 표현이 가능한 경우 입니다.



위의 예제처럼 한 줄로 표현이 가능한 경우 중괄호 { } 를 생략할 수 있습니다.

(중괄호를 사용하지 않기 위해 일부러 한줄로 다 표현하는 경우 가독성이 굉장히 떨어지게 됩니다. 그러한 방법은 사용하지 않는 것을 권장합니다.)


또한 하나의 문장이어도 중괄호 { } 를 포함 할 수 있습니다.



위의 예제처럼 하나의 문장이지만 중괄호 { } 를 생략하지 않아도 아무런 이상이 없이 정상적으로 작동하는 것을 알 수 있습니다.







이것으로 반복문 중 하나인 while문의 첫 번째 Part에 관한 내용이 끝났습니다.


다음 글에서는 while문의 무한루프와 while문의 중첩에 대하여 공부하고 글을 올리도록 하겠습니다.











'프로그래밍 언어 > C' 카테고리의 다른 글

C언어 반복문 - do~while문  (0) 2017.01.09
C언어 반복문 - while문(2)  (0) 2017.01.02
C언어 printf 함수 와 scanf 함수  (0) 2017.01.01
C언어 상수와 기본 자료형  (0) 2016.12.27
C언어 데이터 표현방식  (0) 2016.12.25

이번에는 printf 함수와 scanf 함수에서 사용하는 서식문자에 대해서 알아 보도록 하겠습니다.





1.  특수문자 출력


printf 함수는 문자열을 출력하는 함수입니다.


문자열을 출력할 때 큰 따옴표(" ")로 묶인 문자열을 전달하고, printf 함수를 실행(호출)하면 전달된 문자열이 모니터상에 출력이 됩니다.



위 사진과 같이 큰 따옴표(" ")로 묶인 문자열이 출력 되는 것을 확인 할 수 있습니다.


이 때 이러한 생각이 들 수 있습니다.


철수가 말했습니다. "안녕 나는 철수라고 해." 라는 문장을 출력하고 싶은데 어떻게 어떻게 해야 되지? 라고 생각을 가질 수가 있습니다.


그래서 다음과 같이 문장을 작성 하시는 경우가 생길 수 있습니다.



일반적으로 사람이 볼 때는 "철수가 말했습니다. "안녕 나는 철수라고 해."" 라고 문장을 작성하게 되면 "안녕 나는 철수라고 해." 부분이 철수가 말하는 내용으로 출력이 되서 결과가 나와야 된다고 쉽게 생각을 할 수 있습니다.


하지만 컴퓨터는 처음 시작하는 큰 따옴표(" ")와 해당 큰 따옴표(" ")와 짝이 맞는 큰 따옴표(" ")를 찾아서 하나의 문장으로 인식 하기 때문에 에러가 위와 같은 경우가 발생하게 됩니다.


이러한 경우 다음과 같은 방법으로 해결할 수 있습니다.



이와 같이 큰 따옴표(" ")와 같은 문자를 직접 출력하고 싶을 경우 해당 따옴표 앞에 역슬래시(\)를 입력해주면 해당 문자가 직접 출력이 됩니다.


이렇듯 위의 예제에서 사용된 역슬래시(\)와 같은 문자를 특수문자라 합니다.



다음은 특수문자의 종류와 각 특수문자가 의미하는 내용을 나타낸 표입니다.


 특수문자

의미하는 바 

  \a 

  경고음 

  \b 

  백스페이스(backspace) 

  \f 

  폼 피드(form feed) 

  \n 

  개 행(new line) 

  \r 

  캐리지 리턴(carriage return) 

  \t 

  수평 탭 

  \v 

  수직 탭 

  \' 

  작은 따옴표 출력 

  \" 

  큰 따옴표 출력 

  \? 

  물음표 출력 

  \\ 

  역슬래시 출력 



이 때 \f와 \v는 모니터 출력이 아닌 '프린터 출력'을 위해 정의된 특수문자이기 때문에 모니터의 출력에 사용하게되면, 이상한 문자가 출력 됩니다.





2. printf 함수의 서식지정과 서식문자들


%d %X와 같은 서식문자를 이용해서 출력할 문자열의 형태를 직접 지정할 수 있습니다.



위의 예제에서 보시는 것과 같이 myAge라는 변수에 저장 되더 있는 정수 12를 서식문자인 %d(10진수 형태로 출력), %X(16진수 형태로 출력)를 사용해 출력 형태를 직접 지정하여 출력한 결과 지정한 형태대로 출력이 되는 것을 확인 할 수 있습니다.


다음은 서식문자의 종류와 그 의미를 나타내는 표입니다.


서식문자 

출력 대상(자료형) 

출력 형태 

  %d 

  char, short, int 

  부호 있는 10진수 정수 

  %ld 

  long 

  부호 있는 10진수 정수 

  %lld 

  long long 

  부호 있는 10진수 정수 

  %u 

  unsigned int 

  부호 없는 10진수 정수 

  %o 

  unsigned int 

  부호 없는 8진수 정수 

  %x, %X 

  unsigned int 

  부호 없는 16진수 정수 

  %f 

  float, double 

  10진수 방식의 부동소수점 실수 

  %Lf 

  long double 

  10진수 방식의 부동소수점 실수 

  %e, %E 

  float, double 

  e 또는 E 방식의 부동소수점 실수 

  %g, %G 

  float, double 

  값에 따라 %f와 %e 사이에서 선택 

  %c 

  char, short, int 

  값에 대응하는 문자 

  %s 

  char * 

  문자열 

  %p 

  void * 

  포인터의 주소 값 


* 위의 표에서 %s와 %p에 대해서는 추후 포인터와 배열을 다루면서 추가적으로 설명하도록 하겠습니다.



* 정수의 출력을 위한 서식문자들 중 %x, %o의 경우 출력한 결과 문자인지 숫자인지 헷갈리는 경우가 발생합니다. 이 때 사용해주느 것이 #을 사용하는 것인데 이와 관련해서 다음의 예제를 보고 추가 설명을 하도록 하겠습니다.



위의 예제에서 서식문자를 활용하여 num1과 num2에 저장되어 있는 정수인 7, 13을 각각 8진수와 16진수로 출력을 한 결과입니다.


이 때 8진수와 16진수로 출력을 했어도 단순하게 생각하고 보면 '7은 10진수 7이구나, d는 문자 d 이구나' 라고 생각을 할 수도 있게 됩니다.


그래서 사용해주는 것이 %와 출력형태인 o, x 사이에 #을 넣어주는 것입니다.


#을 넣어주게 될 경우 위와 같이 7 앞에 8진수를 나타내는 0이 붙어서 출력이 되고, d 앞에 16진수를 나타내는 0x가 붙어서 출력이 되는 것을 확인 할 수 있습니다.




3. 실수의 출력을 위한 서식문자들 : %f, %e


실수의 출력은 %f를 주로 사용하지만 '지수'를 사용한 실수를 출력할 때에 어떻게 출력해야 되는지 생각을 하게 됩니다.


이와 관련하여 컴퓨터는 지수를 표현할 수 없으므로 e 표기법으로 지수를 대신 표현하게 됩니다.


10의 n승을 기준으로 나타내게 되는데, 이 때 10을 e로 표현하고 지수인 n을 e뒤에 붙여서 출력하게 됩니다.


다음의 예제를 통해 알아보도록 하겠습니다.



위의 예제와 같이 %f의 사용 결과와 %e의 사용 결과를 알 수가 있었습니다. %e의 사용에 관한 내용은 다음 주제에서 추가적으로 다루도록 하겠습니다.




4. %g의 실수출력


서식문자 %g의 실수출력과 관련해서 다음의 예제를 먼저 보고 진행하도록 하겠습니다.



%g의 실수출력과 관련해서 위의 예제의 결과를 통해 알 수 있는 것은 서식문자 %g는 %f와 %e 표기 중 적절한 것을 사용해서 출력한다는 것입니다.


%g를 사용한 결과 d1과 d2의 경우 소수점 이하 자릿수가 너무 많지 않고 충분히 알 수 있을 정도의 자릿수여서 0.00123, 0.000123 그대로 출력이 되는 반면, d3와 d4의 경우 소숫점 이하 자릿수가 많아져서 읽을 때 불편함이 발생하게 됩니다. 


따라서 컴퓨터는 %g를 사용한 결과 d3와 d4는 %e를 사용해서 e 표기법으로 출력을 한 것을 확인 할 수 있습니다.




5. scanf 함수


1) scaf 함수에서 정수 기반의 입력형태를 정의하기


데이터를 입력 할 때 scanf 함수에세 전달해야 하는 두 가지 정보는 다음과 같습니다.


- 입력의 형식

- 입력 장소


이 두 가지 정보를 바탕으로 scanf 함수에게 데이터를 전달해야 합니다.


다음의 예제를 보도록 하겠습니다.



위의 예제에서 scanf 전달되어지는 데이터에 대해서 알 수 있습니다.


%d(10진수 정수) 형태, %o(8진수 정수) 형태, %x(16진수 정수) 형태로 데이터를 입력 받습니다.


* printf와 달리 저장 되어 지는 곳을 정해 줄 때 printf 함수 처럼 그냥 변수로 사용하면 될텐데 왜 변수 앞에 &를 붙이지? 라는 생각을 가지실 수 있는데 이와 관련해서는 포인터와 배열을 다루면서 추가적으로 설명하도록 하겠습니다.




6. 실수 기반의 입력형태 정의


printf 함수에서는 서식문자 %f, %e 그리고 %g의 의미가 각각 달랐습니다.


하지만 scanf 함수에서는 'float형 데이터를 입력 받겠다' 라는 말은 동일한 의미를 담고 있습니다.


scanf 에서의 %f %e %g는 float형 데이터의 삽입을 위한 서식문자 일 뿐입니다.


다음의 예제를 보고 진행하도록 하겠습니다.



printf 함수에서는 double형과 float형 모두 %f를 사용했습니다.


하지만 scanf 함수에서는 입력되는 자료형을 정확히 구분 해 줄 필요가 있습니다.(printf 함수의 경우 이미 저장되어 있거나 지정한 값들을 출력하는 것이기 때문에 상관이 없지만 scanf 함수의 경우 입력을 하는 것이기 때문에 정확하게 구분 해 줄 필요가 있습니다.)


다음은 scanf 함수에서 사용되어지는 서식문자를 나타낸 표입니다.


서식 문자

입력 받는 자료형

  %f 

  float 형  

  %lf 

  double 형

  %Lf 

  long double 형 


위의 표와 같이 정확하게 구분을 해줘야 합니다.


또한 double 형과 long double 형의 입력에 있어서 사용되는 서식 문자인 %lf 와 %Lf의 L의 대,소문자 또한 확실히 구분을 해주셔야 합니다.





printf 함수와 scanf 함수에 대해서 간단히 알아 보았습니다.


다음에는 반복실행을 명령하는 반복문에 대하여 공부하고 글을 올리도록 하겠습니다.








'프로그래밍 언어 > C' 카테고리의 다른 글

C언어 반복문 - while문(2)  (0) 2017.01.02
C언어 반복문 - while문(1)  (0) 2017.01.02
C언어 상수와 기본 자료형  (0) 2016.12.27
C언어 데이터 표현방식  (0) 2016.12.25
C언어 변수와 연산자  (0) 2016.12.24

# 이번 글이 많이 늦어진 점 죄송합니다. 최대한 하루에 한 개 씩 올리자는 것을 목표로 올리도록 하겠습니다.(방학 현장실습 - (이것 또한 현장실습 나가서 공부합니다. 이에 대한 내용은 추후 포스팅 하도록 하겠습니다.) 방학 현장실습으로 인하여 중간 중간 포스팅이 되지 않는 날이 있을 수도 있다는 점 양해의 말씀 드립니다.)

# 또한 이번 글의 내용이 상당히 긴 점 양해의 말씀 드립니다. 내용이 중간에 한 박자 쉬어가게 되면 이해가 안 되는 부분들이 있어서 이렇게 올리게 되었습니다. (정확하고 이해하기 쉽게 설명할 수 있도록 표현을 최대한 다양하게 하겠습니다.)



이번에는 C언어의 상수와 기본 자료형에 대하여 알아 보겠습니다.


1. 자료형


자료형은 데이터를 표현하는 방법입니다.


C언어가 제공해주는 기본 자료형에 대하여 알아 보겠습니다.


int, double, char 등 이와 같은 일부의 키워드를 자료형이라고 합니다.


이러한 자료형들은 다음과 같이 2가지 정보를 담고 있습니다.


1) 표현 또는 저장 하려는 데이터가 '정수' 인지 '실수' 인지에 따른 정보가 담겨 있습니다.


2) 표현하려는 데이터의 크기가 몇 bytes 인지에 대한 정보가 담겨 있습니다.


ex) 1) int 자료형 : '정수'를 표현 및 저장하고, 그 크기는 4 bytes !

     2) double 자료형 : '실수'를 표현 및 저장하고, 그 크기는 8 bytes !




2. 기본 자료형의 종류와 데이터의 표현범위


C언어에서는 총 8개의 기본 자료형을 제공합니다.


다음은 기본 자료형의 종류와 데이터의 표현범위 입니다.


자료형

크기 

값의 표현범위 

정수형 

  char 

 1 Byte

  -128 이상   +127 이하

  short 

 2 Bytes 

  -32,768 이상   +32,767 이하 

  int 

 4 Bytes 

  -2,147,483,684 이상   +2,147,483,647 이하

  long 

 4 ~ 8 Bytes 

  -2,147,483,684 이상   +2,147,483,647 이하

  long long 

 8 Bytes 이상 

  -9,223,372,036,854,775,808 이상

  +9,223,372,036,854,775,807이하

실수형

  float 

 4 Bytes 

  이상  이하

  double 

 8 Bytes 

  이상 이하

  long double 

 8 Bytes 이상 

  double 이상의 표현 범위




자료형 별 크기는 컴파일러(사람이 프로그래밍 언어로 작성한 것을 CPU가 이해 할 수 있도록 변환 해주는 것)에 따라서 약간의 차이를 보입니다.

- C언어의 표준에서는 자료형별 상대적 크기를 표준화 할 뿐 구체적인 크기까지 언급하지는 않습니다.


자료형이 여러개가 있지만 그러한 자료형들이 크게 '정수형''실수형'으로 나누어집니다.

- 데이터를 표현하는 방식이 정수형과 실수형 두 가지로 나누어지기 때문입니다.


정수형에서도, 실수형에서도 둘 이상의 기본 자료형이 존재합니다.

- 표현하고자 하는 값의 크기에 따라서 적절히 선택할 수 있도록 다수의 자료형이 제공되기 때문입니다.


* ex) 3 Bytes로 데이터를 표현 하고 싶은 경우가 있을 수 있습니다. 하지만 그런 경우는(현재 VC++2015 기준) 제공되는 자료형이 3 Bytes는 없기 때문에 불가능합니다.




3. 연산자 sizeof를 이용한 'Byte' 크기의 확인


sizeof 연산자의 피연산자로는 '변수', '상수''자료형의 이름' 등이 올 수 있습니다.



이처럼 sizeof 연산자를 이용하여 자료형의 이름 및 상수, 변수의 크기를 확인 할 수 있습니다.


소괄호 ( ) 는 int와 같은 자료형의 이름에만 필수 입니다. 하지만 모든 피연산자를 대상으로 소괄호를 감싸주는 것이 일반적입니다. (일관성을 가지게 되면 가독성이 좋아지고, 이해하기 쉬워지기 때문입니다.)




4. 정수의 표현 및 처리를 위한 일반적 자료형 선택


일반적으로 정수를 표현 및 처리 하기 위해서 선택되는 자료형은 int 입니다.

- CPU가 연산하기에 가장 적합한 데이터의 크기가 int형의 크기로 결정되기 때문입니다. (운영체제 32 bit / 64 bit 라는 말은 해당 운영체제가 몇 bit 단위로 데이터 처리가 되는지를 말합니다. 따라서 컴퓨팅 환경이 좋아졌기 때문에 int형으로 표현 및 처리 해도 부담이 되지 않기 때문입니다.)

- 연산이 동반이 되면 int형으로 형 변환이 되어서 연산이 진행됩니다.

- 따라서 연산을 동반하는 변수의 선언을 위해서는 int로 선언하는 것이 적합합니다.


* char형, short형 변수는 필요하지 않나? 라는 의문이 생길 수 있습니다.

  - 연산을 수반하지 않으면서(최소한의 연산만 요구가 되면서) 많은 수의 데이터를 저장해야 하고, 그 데이터의 크기가 char 또는 short로 충분히 표현 가능할 경우, char 또는 short로 데이터를 표현 및 저장하는 것이 적절합니다.


다음으로 char 또는 short의 연산을 하게 되는 경우에 대해서 알아 보겠습니다. 글의 후반부에 설명할 내용이지만 형 변환에 대해서 char형과 short형의 연산과 관련된 자료형 선택에 관한 내용이 나온 관계로 char형 과 short형의 연산을 이용해서 간단하게 알아보도록 하겠습니다.



예제에서 확인 할 수 있듯이 char형 변수 num1 = 1 과 num2 = 2의 연산 결과로 3이 되어서 3이라는 값 또한 크기가 char형에 충분히 들어 가기 때문에 sizeof 연산으로 1 Byte 라는 값이 나와야 하는데 4 Bytes로 나온 이유는 결론 부터 말씀드리면 CPU가 정수형 연산을 하기에 가장 적합한 크기가 int 형이기 때문입니다. 따라서 '연산이 되는 동안'에는 1 + 2 해서 나온 결과 값이 3이어도 4 Bytes 로 되어 있고, 3이라는 결과 값을 저장하는 char 형 변수인 result1에 4 Bytes 의 3이 1 Byte로 '자동 형 변환' 하여 저장이 됩니다.


따라서 정수의 표현 및 처리의 일반적인 자료형의 선택은 int형인 것을 알 수 있습니다.




5. 실수의 표현 및 처리를 위한 일반적 자료형 선택


실수 자료형의 선택기준은 '정밀도' 입니다.


저번 글에서 말씀 드렸던 데이터의 표현 방식에 있어서 실수를 완벽하게 표현 할 수 있는 컴퓨팅 환경은 현재로써는 존재하지 않는다는 말씀을 드렸습니다.


따라서 실수 표현 및 처리를 위한 자료형의 선택은 정수 자료형의 선택과 다르게 오차가 되도록 없는 '정밀도' 를 기준으로 실수의 자료형을 선택하게 됩니다.


- 실수의 표현범위는 float, double 둘 다 충분히 넓습니다.

- 하지만 8 Bytes 크기의 double이 float보다 더욱 정밀하게 실수를 표현합니다.

* long double은 컴퓨터가 너무 큰 Bytes 이다보니 그 크기가 부담 스럽기 때문에 double을 일반적으로 선택합니다.


- 컴퓨팅 환경의 발전으로 float 보다 정밀도가 높은 double형이 데이터의 표현 및 연산이 덜 부담스럽습니다.

- float형 데이터의 경우 정밀도가 부족한 경우가 많습니다.




위의 두 가지 예제에서 확인 할 수 있듯이 float형은 데이터 표현의 정밀도가 낮아서 발생한 오차의 누적으로 소숫점 6 번 째 자리에서 2라는 값이 출력이 되고, double 형의 경우 float 형 보다 데이터 표현의 정밀도가 높아서 소숫점 6 번 째 자리에서 0이라는 값이 출력이 되는 것을 확인 할 수 있습니다.


이러한 예제의 결과를 바탕으로 알 수 있는 사실은 'double 형''float 형' 보다 정밀도가 높다! 라는 사실을 알 수 있습니다.


다음은 실수 자료형의 소수점 이하 정밀도와 바이트수를 나타낸 표 입니다.


실수 자료형 

소수점 이하 정밀도 

바이트 수 

    float 

    6자리 

    4 

    double 

    15자리 

    8 

    long double 

    18자리 

    12 


* double형 변수의 '출력' 에 사용되는 서식문자는 %f    ㅡㅡ> printf

  double형 변수의 '입력' 에 사용되는 서식문자는 %lf   ㅡㅡ> scanf


* double 형 변수의 '출력'은 %f 인데 '입력'은 왜 %lf 를 사용하지? 라는 궁금증을 가지시는 분들이 계실 텐데 이에 대한 내용은 다음 글에서 다루게 될 printf함수와 scanf함수에 대하여 간단하게 정리하면서 알아보도록 하겠습니다.




6. 정수형의 앞에 unsigned를 붙여서 0과 양의 정수만 표현


6 번 째 제목처럼 int, char, short, long, long long의 앞에 unsigned를 붙여서 0과 양의 정수만을 표현 하는 방법입니다.


다음의 unsigned가 붙지 않은 정수 자료형의 보편적인 크기와 unsigned 선언을 포함하는 정수 자료형의 보편적인 크기를 나타내는 표를 보겠습니다.


정수 자료형 

크기 

값의 표현범위 

    char 

    1 Byte

  -128이상 +127이하

    unsigned char 

  0이상 255이하

    short 

    2 Bytes 

  -32,768이상 +32,767이하

    unsigned short 

  0이상 65535이하

    int 

    4 Bytes 

  -2,147,483,648이상 + 2,147,483,647이하

    unsigned int 

  0이상 4,294,967,295이하

    long 

    4 Bytes 

  -2,147,483,648이상 + 2,147,483,647이하

    unsigned long 

  0이상 4,294,967,295이하

    long long 

    8 Bytes 

  -9,223,372,036,854,775,808이상      +9,223,372,036,854,775,807이하

    unsigned long long 

  0이상 18,446,744,073,709,551,615이하


표를 통하여 다음과 같은 사실들을 알 수 있습니다.

- 정수 자료형의 이름 앞에는 unsigned 선언을 붙일 수 있습니다.

- unsigned가 붙으면, MSB(부호 비트)도 데이터의 크기를 표현하는데 사용이 됩니다.

- 따라서 표현하는 값의 범위가 양의 정수로 제한이 되며 양의 정수로 두 배 늘어나게 됩니다.




7. 문자의 표현을 위한 약속, 아스키(ASCII) 코드


이번 7번 째 주제에서는 영어를 기준으로 하겠습니다.(컴퓨터가의 언어 표현을 영어로 먼저 표기 했기 때문입니다. 또한 아스키 코드는 자주 사용하게 됩니다.)


아스키 코드는 미국 표준 협회(ANSI: American National Standards Instute)에 의해서 제정된 '아스키(ASCII: American Standard Code Code for Information Interchange) 코드' 입니다.

- 컴퓨터는 문자를 표현 및 저장하지 못 합니다. 따라서 문자의 표현을 목적으로 각 문자에 고유한 숫자를 지정합니다.

- 인간이 입력하는 문자는 해당 문자의 숫자로 변환이 되어 컴퓨터에 저장 및 인식이 되고, 컴퓨터에 저장된 숫자는 문자로 변환이 되어 인간의 눈에 보여지게 됩니다.


따라서 실제로 컴퓨터에게 전달이 되는 데이터는 문자가 아닌 숫자입니다.


본격적으로 문자 표현에 대해 알아보기 전, ASCII 코드 표를 보고 진행 하도록 하겠습니다.



<출처 : Google 검색>


(ASCII 코드에 대해서 검색을 하게 될 경우 굉장히 많은 자료들이 존재 합니다. ASCII 코드에 관심이 있거나 필요하신 분들은 인터넷 상에 자료들이 많으니 검색을 통해 알아 보시기 바랍니다.)


미국 표준 협회에서 지정한 1 Byte 로 표현이 가능한 128개의 문자표 입니다.


소스를 작성 후 컴파일 시 각 문자는 해당 아스키 코드 값으로 변환이 됩니다.


C 프로그램 상에서 문자는 작은 따옴표('')로 묶어서 표현 합니다.



여기서 드는 의문점이 있습니다.


문자는 왜 char형 변수에 저장을 할까? 라는 의문입니다.


이유는 char형 변수가 문자열을 저장하기 위해 디자인 된 자료형이기 때문입니다.


문자는 연산을 동반하지 않습니다.


문자는 저장하고 보기 위한 것입니다.


또한 문자는 연산 보다 '문자열' 처럼 많은 양의 데이터가 대부분이기 때문에 부담이 되지 않는 char형 (1 byte) 변수를 사용합니다.


이렇듯, 문자 저장의 측명에서 보면 char형 자료형이 의미가 있게 됩니다.


결론적으로 문자를 저장하기 위해 특화된 정수 자료형이 char형 자료형 입니다.




8. 문자의 표현


서식문자 %c : 해당 숫자의 아스키 코드 문자를 출력하라는 의미입니다.


다음은 문자를 char형 변수에 저장하는 이유 입니다.

- 모든 아스키 코드 문자는 1 Byte로 충분히 표현 가능합니다.(ASCII 코드가 1 Byte로 표현 가능하도록 만들어 졌기 때문입니다.)

- 문자는 덧셈, 뺄셈과 같은 연산을 동반하지 않습니다. 단지 '표현' 에 사용될 뿐입니다.

- 따라서 1 Byte 크기인 char형 변수가 문자를 저장하기에 최적의 장소가 됩니다.

* 문자는 int형 변수에도 저장이 가능합니다 ! 문자라는 것은 사람이 보는 것이고, 실제로 문자에 해당하는 값은 '수' 이기 때문입니다.




9. 상수에 대한 기본적인 이해


int num = 3 + 2; 라고 했을 경우 3과 2도 메모리 공간이 필요합니다. 이유는 CPU에서 연산이 되기 위해서는 변수인 num 뿐만 아니라 3과 2도 메모리 공간이 필요하기 때문입니다.


C언어는 컴파일에 있어서 기본 자료형을 근거로 합니다.


C컴파일러는 써 놓은 숫자를 int형으로 표현을 해서 메모리 공간에 저장합니다.


그렇다면 8번 째 주제에서 문자는 사람이 보기 편하게 하기 위해 '표현'을 한 것일 뿐이고, 실제로 문자에 해당하는 값은 '수'라는 말씀을 드렸습니다.


그러면 4번 째 주제에서 말씀 드렸던 변수에 저장되기 전의 문자는 몇 Bytes 일까? 라는 의문을 가질 수 있게 됩니다. 이에 대한 내용은 다음의 예제를 보고 확인 하겠습니다.



예제에서 확인한 결과 문자라고 생각했던 'A'의 크기가 sizeof 연산에 의해 4 Bytes인 int형 인 것을 알 수 있습니다. 이 또한 변수에 저장 될 경우 형 변환이 이루어지게 됩니다. ( 또한 위의 예제는 이 글의 후반부에 다루게 될 리터럴 상수와 관련된 예제입니다. 이는 뒤쪽에서 다시 설명 드리겠습니다.)




10. 이름을 지니지 않는 리터럴 상수와 리터럴 상수의 자료형


이번에 다루게 될 내용은 이름을 지니지 않는 리터럴 상수 입니다.


연산을 위해서는 30, 40과 같이 프로그램상에 표현되는 상수(숫자)도 '메모리 공간에 저장되어야 합니다.'


글의 초반부에 사용했던 예제를 통해 알아 보도록 하겠습니다.



위의 예제를 통해 알 수 있는 사실은 여러가지가 있습니다.


1) 1, 2, 300, 400 처럼 저장되는 값은 이름이 존재하지 않습니다. (num1 이라는 '이름'의 변수가 '1'이라는 값을 가지고 있는 것입니다. '1'은 이름이 없습니다. 이렇듯 이름이 존재하지 않으니 변경이 불가능한 상수(리터럴 상수) 입니다.)

2) 뜬금 없이 1, 2, 300, 400 처럼 값을 주게 되면 CPU의 연산 대상이 되지 않습니다. 그러므로 메모리 공간에 저장이 되어야 합니다.

3) 글의 최후반부에 다루게 될 형변환에 대한 것을 알 수 있습니다.


이러한 내용을 바탕으로 리터럴 상수도 메모리 공간에 저장이 되어야 한다는 사실을 이해해 보면,  5 번째 줄의 문장 내용이 '정수를 표현 하고, 그 크기는 1 Byte로 하는 변수 인 num1과 num2, result1을 선언할게, 각각의 변수 num1과 num2에 저장될 값은 1과 2야. 그리고 선언한 num1과 num2의 + 연산을 통해서 나온 결과를 result1이라는 이름을 가진 변수에 저장할게.' 라는 내용이 되는 것을 알 수 있습니다.


또한 5 번 째 줄의 연산 과정에 있어서 변수인 num1과 num2가 연산이 되는 것이 아닌, num1과 num2에 저장 되어 있는 1과 2가 연산이 되는 것이므로 1과 2는 CPU가 연산하기 편한 int형으로 변환이 된 후 연산을 하고 해당 연산의 결과 값 또한 int형이 되어서 4 Bytes가 되지만 그 결과 값을 1 Byte의 char형 변수인 result1에 저장하는 것이기 때문에 4 Bytes의 결과 값이 1 Byte 로 형변환이 되어 저장이 됩니다.


이렇듯 변수에 저장되는 값이 처음부터 변수의 자료형에 맞춰서 저장이 되는 것이 아닌 먼저 상수에 대한 값을 저장할 메모리 공간이 필요하게 됩니다. 이는 연산과정에서도 마찬가지 입니다.


따라서 변수 선언 및 연산과정에 있어서 상수는 메모리 공간에 할당이 되어진 후 연산 및 변수에 저장이 진행이 되게 됩니다.

* int num = 3 + 4; 라는 문장을 작성한 경우 3과 4가 그대로 메모리에 남아 있어서 걱정인데 어떻게 하지? 라는 궁금증이 생기실 수 있습니다. 하지만 3과 4의 연산이 진행되고, 결과 값이 나올 때까지만 메모리 공간에 할당이 되어 있고, 변수 저장 및 다음 행으로 넘어가게 될 경우 메모리 공간에서 3과 4의 값은 증발하게 됩니다. 어차피 이름이 존재하지 않아서 접근 할 수 없는 값이기 때문입니다.


이와 같은 내용들을 바탕으로 리터럴 상수의 자료형이 결정되는 것 또한 알 수 있습니다.



위쪽에서 사용했던 예제를 다시 한 번 사용했습니다.


이번 예제에서는 리터럴 상수가 변수에 저장되기 전, 단순히 상수의 값을 어떤 자료형으로 지정해서 메모리 공간에 할당하는지 알아보기에 아주 간단한 예제 입니다.


7은 정수형 리터럴 상수이므로 int형으로 할당이 된 것을 확인 할 수 있습니다.


7.14는 실수형 리터럴 상수이므로 double형으로 할당이 된 것을 확인 할 수 있습니다.


문자 'A'는 실질적으로 문자가 아닌 숫자 값입니다. 아스키 코드표의 65는 'A'라는 문자와 매칭이 됩니다. 따라서 65는 정수형 리터럴 상수이므로 int형으로 할당이 된 것을 확인 할 수 있습니다.




11. 접미사를 이용한 다양한 상수의 표현


정수를 표현 할 때는 int, 실수를 표현할 때는 double입니다. 그 이외의 자료형을 가지고 상수를 표현하고 싶을 때 사용하는 것이 '접미사'입니다.


이러한 접미사들은 대,소문자를 구분하지 않습니다.


L이 붙으면 정수 형이고, 실수형에 붙으면 double long형입니다.


접미사를 통해서 상수의 자료형을 변경할 수 있습니다.


또한 다음과 같은 경우에는 에러가 발생합니다. 이러한 경우 접미사를 붙여서 사용하게 되면 에러가 발생하지 않습니다.


ex) float num1 = 5.789;

이 문장은 경고메시지가 발생하게 됩니다.

실수의 기본 자료형은 double형인데 그보다 표현 범위가 적은 float형 자료형을 사용하게 되면 데이터의 손실이 있을 거라는 경고메시지가 출력 됩니다.


이러한 경우 다음과 같이 접미사를 통해서 상수의 자료형을 변경하면 에러가 발생하지 않습니다.


ex) float num1 = 5.789f;

     float num2 = 3.24F + 5.12F;    (소문자 f 대신 대문자 F를 써도 됩니다.)


다음은 정수형 상수의 표현을 위한 접미사와 실수형 상수의 표현을 위한 접미사를 나타낸 표입니다.


접미사 

자료형 

사용의 예 

  U 

  unsigned int 

  unsigned int n = 1025U 

  L 

  long 

  long n = 2467L 

  UL 

  unsigned long 

  unsigned long n = 3456UL 

  LL 

  long long 

  long long n = 5768LL 

  ULL 

  unsigned long long 

  unsigned long long n = 8979ULL 


[정수형 상수의 표현을 위한 접미사]





접미사 

자료형 

사용의 예 

  F 

  float 

  float f = 3.15F 

  L 

  long double 

  long double f = 5.789L 


[실수형 상수의 표현을 위한 접미사]




12. 이름을 지니는 심볼릭(Symbolic) 상수: const 상수


글의 위쪽 내용 중 리터럴 상수는 이름이 존재하지 않아서 접근이 불가능 하다는 말씀을 드렸습니다.


하지만 이름을 지니는 심볼릭 상수라는 것도 존재 합니다.


심볼릭 상수를 선언 해주려면 변수 선언 문장의 맨 앞에 const라는 선언을 붙여줘야 합니다.

ex) const int MAX=100;    ㅡㅡ>   MAX라는 이름의 변수를 상수로 선언하겠다는 의미입니다.


const라는 것은 'const를 써서 해당 변수를 상수처럼 썼으면 좋겠다' 이러한 경우에 사용하게 됩니다.


const는 컴파일러가 인지하는 상수입니다.(리터럴 상수처럼 일시적으로 메모리 공간에 할당 되었다가 이름이 존재하지 않고, 의미가 없어져서 사라져 버리는 그러한 상수가 아닌 상수입니다.)


const는 변수를 상수화 시키는 키워드입니다.


const 상수는 메모리 공간에 할당되는 상수가 아닙니다.  const int MAX=100; 에서 100이라는 값이 const int MAX라는 변수에 할당 되기 위해 메모리 공간에 일시적으로 할당이 될지는 몰라도 MAX라는 변수에 할당이 되고 난 후에는 MAX라는 변수 자체가 100이라는 상수가 되기 때문입니다.


이러한 상수화된(const상수) 변수의 값을 변경하려 할 시 에러가 발생합니다. (개인적으로 포인터로 메모리에 직접 접근을 하게 될 경우 가능 할 것 같다는생각이 듭니다. 확실한 것은 아니고, 추후 포인터를 다루면서 제대로 알아보도록 하겠습니다.)



13. 자료형의 변환


이번에 다루게 될 내용은 자료형의 변환입니다.


여기까지 이해하시면서 잘 따라와 주셨으면 자료형의 변환에 대하여 어느정도 이해 하셨을거라 생각이 됩니다.


단순하게 'int형을 double형으로 바꿔야겠다. int inum=4; 를 double형으로 4.0으로 바꿔야지.'라고 생각하셔도 틀린 것은 아닙니다.


다만 저러한 형식으로 이해를 하시게 되면 정수와 실수 사이의 형변환에 있어서 정수형의 표현방식, 실수형의 표현방식에 있어서 문제가 발생하게 됩니다.


그렇다면 형변환을 어떻게 이해하면 좋을까? 라는 생각을 해보겠습니다.


정수형으로 선언된 자료의 '비트열'을 실수형 자료의 '비트열'로 다시 구성하자 라는 식으로 이해를 하시면 정수형과 실수형의 표현방식에 있어서 발생하는 문제가 줄어든다(?) 라고 생각하시면 되겠습니다.


실수의 표현 방식은 데이터의 표현방식이라는 글에서 제대로 다루지 않았지만 4 Bytes를 기준으로 앞의 반절은 소수점 이상부분을 표현하고, 뒤의 반절은 소수점 이하부분을 2진수 0000 0000 0000 0101 . 0000 0000 0000 1010 이런식으로 표현하면 되지 않을까? 라는 생각을 하실 수 있습니다.


하지만 이러한 경우 오차도 엄청 많이나게 되고, 표현 할 수 있는 범위도 줄어들게 됩니다. 따라서 실수의 표현방식을 오차도 적고, 표현 범위도 적게 하는 가장 보편적인 기본화 되어 있는 공식을 사용하여 구성하게 되어 있습니다.(실수 표현 방식의 기본화 되어 있는 공식은 인터넷상에 많은 자료가 존재 합니다. 궁금하시거나 관심 있으신 분들은 인터넷 검색을 해보시는 것을 권장합니다.)


이렇듯 정수형과 실수형간의 형변환에 있어서 굉장히 작은 값인 1, 3 이러한 값들일 경우 표현하는데 어려움이 없겠지만 값들이 굉장히 커지게 되면 정수형과 실수형의 표현방식의 차이로 인하여 형변환 하는데에 어려움이 따르게 됩니다.


따라서 컴퓨터는 형변환을 하게 될 경우 실수형에서 정수형으로 형변환을 한다는 의미는 실수형 표현방식으로 표현이 되어 있는 값의 2진수 비트열을 정수형 표현 방식의 2진수 비트열로 재구성 하는 것을 의미 합니다.


또한 자료형의 변환 시 오차 발생, 데이터 손실이 생길 수 있습니다.

ex) 실수형 4.123을 정수형으로 형변환 하게되면 프로그래밍 환경에서 정수라는 것은 소수점을 포함하지 않은 음의 정수, 0, 양의 정수만을 의미하기 때문에 변환 시 소수점 이하 .123은 다 버려지게 되고, 4 라는 값으로 형변환이 되게 됩니다. 이때 .123이라는 데이터의 손실이 발생하게 됩니다.


자료형의 변환의 종류는 크게 2가지로 존재 합니다.

1) 자동 형 변환

2) 명시적 형 변환 : 강제로 변환 시킵니다.


자동 형 변환 중 하나인 대입연산의 전달과정에서 발생하는 자동 형 변환을 다음 예제를 통해 확인 하겠습니다.



위의 예제는 피연산자의 자료형 불일치로 발생하는 자동 형 변환을 나타내는 예제입니다.


이렇듯 앞서 설명한 오차 발생, 데이터 손실, 대입 연산시 발생하는 형변환에 대한 내용들을 확인 할 수 있습니다.


또한 다음의 자동 형 변환 규칙을 근거로 int형 데이터 245가 double형 데이터 245.000000으로 형 변환이 되어 변수에 저장 되는 것을 확인 할 수 있습니다.

int    ㅡ>    long    ㅡ>    long long    ㅡ>    float    ㅡ>    double    ㅡ>    long double


* - 산술 연산에서의 자동 형 변환 규칙

  - 바이트 크기가 큰 자료형이 우선시 됩니다. (정수형, 실수형 각각의 형에서는 바이트 크기가 큰 자료형이 우선시 됩니다.)

  - 정수형보다 실수형을 우선시 합니다.(정수 자료형을 실수 자료형으로 형 변환을 하게 되면 데이터 손실이 현저하게 줄어들기 때문입니다.)

  - 이러한 규칙은 데이터의 손실을 최소화 하기 위한 기준입니다.


또다른 자동 형 변환 중 하나인 정수의 승격에 의한 자동 형 변환이 있습니다.


다음은 정수의 승격에 의한 자동 형변환 예제 입니다.(앞서 사용한 예제를 다시 사용하겠습니다.)



위의 예제에서 확인 할 수 있듯이 정수의 승격에 의한 자동 형변환이라는 것은 일반적으로 CPU가 처리하기에 가장 적합한 크기의 정수 자료형을 int로 정의하는 것을 말합니다.



마지막으로 자료형의 형 변환의 종류 중 다른 하나인 명시적형 변환(강제로 일으키는 형 변환) 에 대하여 알아 보겠습니다.


우선 명시적형 변환을 설명하기에 앞서 예제를 먼저 본 후 설명을 진행하도록 하겠습니다.



일반적으로 사람이 생각 할 때, '3/4=0.75 가 나오겠지?' 라는 생각을 하게 됩니다. 하지만 결과를 보면 0.000000이 출력되는 것을 확인 할 수 있습니다.


앞서 작성했던 글 중, 변수와 연산자 부분에서 연산기호의 우선순위 부분이 있었습니다.


이 때, 산술연산등이 먼저 진행이 되고, 대입연산이 진행이 되었습니다. 이러한 점을 바탕으로 double형 변수 divResult에 값이 저장 되기전, num1 / num2의 자료형이 int형인 상태에서 연산이 진행이 됩니다. 그렇게 되면 프로그래밍에서 정수 3과 정수 4를 나누면 몫은 0이 됩니다. 따라서 연산의 결과 값이 int형 정수인 0이 됩니다.


int형 정수인 0을 double형 변수인 divResult에 저장을 할 때 0을 실수로 형 변환 해도 0.000000이 됩니다. 따라서 divResult에는 0.000000이라는 값이 저장이 되는 것 입니다.


이러한 것을 해결 해주는 방법이 바로 명시적 형 변환(사용자가 직접! 형 변환을 선.언 해준다!)입니다.


위의 예제사진의 소스코드를 다음과 같이 변경 해주면 됩니다.


7번째 줄의 divResult = num1 / num2;를  divResult = (double)num1/ num2; 또는 divResult = num1 / (double)num2; 라는 형식의 문장으로 변경 해주게 되면 연산자의 우선순위에 근거하여 연산이 이루어지기전 num1 또는 num2의 형변환이 이루어지게 되고, 정수의 승격에 의한 자동 형변환에 의하여 남은 정수형 변수가 double 형으로 변환이 되어서 double형 자료형간의 연산이 이루어 지게 됩니다.


그렇게 되면 3.0 / 4.0 이라는 연산을 하게 되는데 이 때 나오는 결과는 0.75로 double형 자료형의 결과가 나오게 됩니다.



이것으로 이번 글의 내용인 상수와 기본 자료형에 대하여 알아 보았습니다.


내용에 대하여 제대로 설명을 못 한 점도 있고, 내용 자체가 (저도) 이해하기 약간 난해한 점도 있어서 이해가 제대로 되지 않으신 분들도 계실 겁니다.


이러한 부분은 추후 포인터와 메모리 부분을 다루면서 보다 정확하게 설명하겠습니다.






다음에는 printf함수와 scanf함수 에 대하여 공부하고, 글을 올리도록 하겠습니다.








'프로그래밍 언어 > C' 카테고리의 다른 글

C언어 반복문 - while문(1)  (0) 2017.01.02
C언어 printf 함수 와 scanf 함수  (0) 2017.01.01
C언어 데이터 표현방식  (0) 2016.12.25
C언어 변수와 연산자  (0) 2016.12.24
C언어 공부 시작  (0) 2016.12.21

이번 글에서는 컴퓨터가 데이터를 표현하는 방식에 대하여 알아 보겠습니다.




1. 컴퓨터가 데이터를 표현하는 방식


컴퓨터는 2진수를 기반으로 데이터를 표현하고 연산도 진행합니다.


2진수 뿐만 아니라 10진수, 8진수, 16진수등 N진수 형식으로 데이터를 표현 합니다.

(물론 실제로는 2진수 (0 과 1) 로 모든 것을 처리 합니다 !)


- 2진수 : 두 개의 기호(1, 0)를 이용해서 값(데이터)을 표현하는 방식입니다.


- 10진수 : 열 개의 기호(0~9)를 이용해서 값(데이터)을 표현하는 방식입니다.


- 8진수 : 여덟 개의 기호(0~7)를 이용해서 값(데이터)을 표현하는 방식입니다.


- 16진수 : 열 여섯 개의 기호(0~9, A~F)를 이용해서 값(데이터)을 표현하는 방식입니다.


- N진수 : N개의 기호를 이용해서 값(데이터)을 표현하는 방식입니다.




2. 데이터의 표현단위인 비트(Bit)와 바이트(Byte)


1 Bit = 0 또는 1이라는 정보 '하나'를 저장 할 수 있는 저장공간을 의미합니다. 또한 컴퓨터의 데이터 처리 단위의 최소 단위 이기도 합니다.


1 Byte = 8개의 Bits ( 8 bits )로 이루어져 있는데, 1 Byte를 언급한 이유는 프로그램에서 의미 있는 데이터를 표현하는데 있어서 가장 기본이 되는 단위가 Byte이기 때문입니다.




3. 정수와 실수의 표현 방식


1) 정수의 표현 방식

    - 1 Byte를 기준으로 가장 왼쪽의 1 bit가 부호를 나타내는 비트(부호비트) 입니다.

    - ex) 1 0 0 0  0 0 0 1    ->    가장 왼쪽의 1 bit가 1일 경우 음수, 0일 경우 양수를 나타냅니다.

    - 부호비트를 제외한 나머지 비트는 크기를 나타내는데 사용됩니다.

    - 음의 정수를 표현 할 때는 2의 보수를 취합니다.

    - 음의 정수를 표현 할 경우 부호비트만 바꾸면 음수라는 실수를 할 수 있게 되는데 이는 간단 예제로 확인 해 보겠습니다.



수학으로 생각해 보겠습니다. 5 - 5 = 0 이 되어야 하는데 컴퓨터의 연산에서는 위의 예제와 같이 할 경우 0이 아니게 되므로 컴퓨터 에서의 음의 정수 표현 방식에 문제가 있다는 것을 알 수 있습니다. 따라서 컴퓨터가 인식하는 음의 정수는 2의 보수 입니다.


2의 보수를 구하는 것은 쉽게 생각하면 됩니다.

해당 값들의 비트 값을 0은 1로, 1은 0으로 반전시켜서 써주면 1의 보수가 됩니다.

이 때 1의 보수에서 +1 을 해주게 되면 2의 보수가 나오게 됩니다.


ex) 0 0 0 0  0 0 1 1     <<     3

  + 1 1 1 1  1 1 0 1     <<    2의 보수

-------------------------

    0 0 0 0  0 0 0 0     <<    결과가 0이 되므로 예제에서의 2의 보수는 -3이 되는 것을 확인 할 수 있습니다.


*  이 때 1이 가장 왼쪽에 있어야 되지 않나?? 9자리가 되지 않나?? 하는 생각을 할 수 있는데, 컴퓨터 연산의 경우 1 Byte + 1 Byte = 1 Byte가 되어야 합니다. 따라서 1 Byte를 넘어서는 값인 1은 버려지는 값이 됩니다. 따라서 남은 값들이 0이 되어서 컴퓨터가 인식하는 음의 정수는 2의 보수 인 것을 알 수 있습니다.




2) 실수의 표현 방식

    - 실수의 표현 방식은 아주 정확하고 깊게 이해 하려는 것이 아닌 컴퓨터의 실수 표현 방식은 정확히 표현을 할 수 없고, 오차가 존재 한다는 것만 알고 가도록 하겠습니다.


ex) 다음은 컴퓨터의 실수 표현의 오차로 인한 오차 누적의 결과로 발생한 실수 표현 방식을 나타낸 결과 입니다.



* 이론적으로 오차 없이 모든 실수를 완벽하게 표현할 능력이 있는 컴퓨팅 환경은 존재하지 않습니다.




4. 비트 연산자


다음으로 비트 연산자에 대하여 알아 보겠습니다.


* 비트 연산자의 경우 앞 쪽의 연산자 부분에서 조금 더 자세히 다루지 않고 데이터 표현 방식에서 다루는 이유는 데이터 표현 방식이 비트 단위 2진수 기반으로 처리가 되기 때문에 이러한 '비트'를 직접적으로 연산하는 비트 연산자를 이번 글에서 다루게 되었습니다.


다음은 비트 연산자의 종류와 기능입니다.


연산자 

연산자의 기능 

결합방향 

비트단위로 AND 연산을 한다.

ex) num1 & num2; 

-> 

비트단위로 OR 연산을 한다.

ex) num1 | num2; 

-> 

비트단위로 XOR 연산을 한다.

ex) num1 ^ num2; 

-> 

단항 연산자로서 피연산자의 모든 비트를 반전시킨다. 

ex) ~num;  // num은 변화 없음, 반전 결과만 반환

<- 

<<

피연산자의 비트 열을 왼쪽으로 이동시킨다.

ex) num << 2;  // num은 변화 없음, 두 칸 왼쪽 이동 결과만 반환

-> 

>> 

피연산자의 비트 열을 오른쪽으로 이동시킨다.

ex) num >> 2;  // num은 변화 없음, 두 칸 오른쪽 이동 결과만 반환 

-> 



1) & 연산자 : 비트단위 AND

   - & 연산은 두 개의 비트가 모두 1일 때 1을 반환하는 연산입니다.


   - 0 & 0    0을 반환

   - 0 & 1    0을 반환

   - 1 & 0    0을 반환

   - 1 & 1    1을 반환




2) | 연산자 : 비트단위 OR

   - | 연산은 두 개의 비트 중 하나라도 1이면 1을 반환하는 연산입니다.


   - 0 | 0    0을 반환

   - 0 | 1    1을 반환

   - 1 | 0    1을 반환

   - 1 | 1    1을 반환




3) ^ 연산자 : 비트단위 XOR

    - ^ 연산은 두 개의 비트가 서로 다른 경우에 1을 반환하는 연산입니다.


    - 0 ^ 0    0을 반환

    - 0 ^ 1    1을 반환

    - 1 ^ 0    1을 반환

    - 1 ^ 1    0을 반환




4) ~ 연산자 : 비트단위 NOT

    - ~연산은 비트를 0에서 1로, 1에서 0으로 반전시키기 때문에 보수연산이라고도 합니다.


    - ~0    1을 반환

    - ~1    0을 반환


    * ~ 연산자는 부호비트 조차 반전시킵니다. ~ 연산자를 사용해 2의 보수를 구하려는 경우 ~연산을 사용한 값에 + 1을 해줘야 2의 보수가 구해집니다.




5) << 연산자 : 비트의 왼쪽 이동(Shift)

    - << 연산자는 두 개의 피연산자를 요구합니다.

    - num1 << num2    num1의 비트 열을 num2칸씩 왼쪽으로 이동시킨 결과를 반환 합니다.

    - 8 << 2    8의 '비트열'을 2칸씩 왼쪽으로 이동시킨 결과를 반환 합니다.


    * 비트의 열을 왼쪽으로 1칸씩 이동시킬 때마다 정수의 값은 두 배가 됩니다. 이를 토대로 반대의 경우 정수의 값은 반절로 나누어 지는 것을 알 수 있습니다.




6) >> 연산자 : 비트의 오른쪽 이동(Shift)

    - >> 연산자와 << 연산자의 가장 큰 차이점은 비트의 열을 이동 시키는 방향에 있습니다.

    - << 연산의 경우 0을 채워넣으면 되니까 상관이 없지만, >> 연산의 경우 양수가 아닌 음수의 비트열을 이동시킬 경우에 음수를 유지 할 것인가, 그렇지 않을 것인가에 따라 나눠지게 됩니다. (이 경우 CPU에 따라 계산 방식의 차이를 보이게 됩니다.)

    - 음수를 유지하는 CPU의 경우 1을 채워 넣고, 그렇지 않은 CPU의 경우 0을 채워 넣게 됩니다.



* 음수를 유지하는 CPU에서의 연산 결과 입니다.





이것으로 데이터 표현방식을 마치도록 하겠습니다.


다음은 상수와 기본 자료형에 대하여 공부하고, 글을 올리도록 하겠습니다.






'프로그래밍 언어 > C' 카테고리의 다른 글

C언어 반복문 - while문(1)  (0) 2017.01.02
C언어 printf 함수 와 scanf 함수  (0) 2017.01.01
C언어 상수와 기본 자료형  (0) 2016.12.27
C언어 변수와 연산자  (0) 2016.12.24
C언어 공부 시작  (0) 2016.12.21

이번에는 C언어의 변수와 연산자에 대해 간단히 알아 보겠습니다.



1. 변수와 연산자


연산자 : + - x / 처럼 특정연산을 요구할 때 사용하는 약속된 기호 입니다.


변수 : 특정 연산의 결과나 특정 값을 저장하기 위해 사용되는 것이 변수 입니다.


변수를 선언한다는 것은 메모리 공간을 할당한다는 말이에요! (메모리 할당에 대해서는 추후 포인터를 다루면서 다시 설명 하도록 하겠습니다.)


변수 선언과 연산자를 사용한 결과를 출력한 간단한 예제를 보도록 하겠습니다.



int 라는 것은 조금 후에 추가적으로 설명을 드리도록 하고, 5 번째 줄의 int num1 = 3; 을 보시면 num1 = 3.

이 말은 num1 이라는 변수를 선언 해주고, num1이라는 변수에 3이라는 값을 저장 한다는 의미입니다.


11번째 줄의 printf() 함수를 사용하여 출력한 결과를 보면 num1이라는 변수에 저장 되어진 3이라는 값이 정상적으로 출력 되는 것을 확인 가능합니다.


또한 7번째 줄에서 연산자를 활용하여 num1과 num2에 저장 되어 있는 값을 연산하여 나온 결과 값을 result라는 변수에 저장 합니다.


result 값도 9번째 줄에서 출력을 해보게 되면 num1과 num2의 값이 연산이 되어진 후에 나온 결과 값이 출력되는 것을 알 수 있습니다.


* 변수 선언시 초기화를 해주지 않으면 쓰레기 값이 출력 되거나, 에러가 발생합니다 ! (초기화 해주는 것은 변수를 선언하자마자 처음 값을 넣어 주는 것을 말합니다.)




2. 변수의 이름 규칙 : 변수의 이름을 선언 할 때는 지켜야 할 규칙이 있습니다. 이것을 변수의 이름 규칙이라 합니다.

- 변수의 이름은 알파벳, 숫자, 언더바(_)로 구성됩니다.

- C언어는 대소문자를 구분합니다. ( * 변수 Num과 변수 num은 서로 다른 변수이므로 주의 하셔야 합니다 !)

- 변수의 이름은 숫자로 시작할 수 없고, 키워드도 변수의 이름으로 사용할 수 없습니다. (키워드는 미리 약속된 단어들을 얘기합니다. ex) int, else, if 등등..)

- 변수의 이름 사이에 공백이 삽입될 수 없습니다. ex) int num1 test; <<< 이러한 경우 int num_test; 공백대신 언더바(_)를 사용하시면 하나의 변수로 인식합니다.




3. 변수의 종류


1) 정수형 변수

   - 정수 값의 저장을 목적으로 선언된 변수 입니다.

   - 정수형 변수는 char형, short형, int형, long형 변수로 나누어 집니다.


2) 실수형 변수

   - 실수 값의 저장을 목적으로 선언된 변수 입니다.

   - 실수형 변수는 float형 변수와 double형 변수로 나누어 집니다.


* 정수형 변수와 실수형 변수가 나누어지는 이유는 정수를 저장하는 방식과 실수를 저장하는 방식이 다르기 때문입니다. 이는 추후에 추가적으로 설명하겠습니다.




4. 단항 연산자, 이항 연산자


단항, 이항 연산자는 피연산자의 수를 기준으로 나누어진 연산자입니다.

ex) 3 + 4 << +는 피연산자로 왼쪽과 오른쪽에 각각 3과 4를 피연산자로 가지기 때문에 이항 연산자입니다.

     ++num; << ++는 피연산자로 오른쪽에 num만을 사용하기 때문에 단항 연산자입니다.




5. 대입 연산자, 산술 연산자


대입 연산자 : 값을 저장하는 연산자입니다.

산술 연산자 : 산술 연산을 하는 연산자입니다.


연산자 

연산자의 기능 

결합방향 (연산의 실행이 어느 방향으로 진행되어지는지를 나타냅니다.)

연산자 오른쪽에 있는 값을 연산자 왼쪽에 있는 변수에 대입합니다. ex) num = 20; 

<- 

두 피연산자의 값을 더합니다. ex) num = 4 + 3; 

-> 

 -

왼쪽의 피연산자 값에서 오른쪽의 피연산자 값을 빼줍니다. ex) num = 4 - 3; 

-> 

두 피연산자의 값을 곱합니다. ex) num = 4 * 3; 

-> 

왼쪽의 피연산자 값을 오른쪽의 피연산자 값으로 나눕니다. ex) num = 4 / 3; 

-> 

왼쪽의 피연산자 값을 오른쪽의 피연산자 값으로 나눴을 때 얻게 되는 나머지를 반환합니다. ex) num = 7 % 3 

-> 




6. 복합 대입 연산자


복합 대입 연산자는 두가지의 연산자가 복합으로 만들어진 하나의 연산자를 복합 연산자라 합니다.

ex) + 와 = 연산자가 복합으로 만들어진 하나의 연산자 +=


복합 대입 연산자의 종류


a = a + b 

== 

a += b 

a = a - b 

== 

a -= b 

a = a * b

==

a *= b 

a = a / b 

== 

a /= b 

a = a % b 

== 

a %= b 


왼쪽의 연산과 오른쪽의 연산이 같은 연산입니다.


이때 a = a + b 라는 연산을 예로 들어서 a값이 a + b 값과 같다라고 생각 하실 수 있습니다.

하지만 프로그래밍 언어에서는 그러한 의미가 아닌 a에 저장되어 있는 값을 b만큼 증가시켜서 나온 값을 다시 a에 저장하라는 의미 입니다.

ex) int a = 3;     a = a + 1;   a = 3 + 1; 이 되어 a에 3이 아닌 4가 저장이 됩니다.

이러한 연산을 간편하게 해주기 위하여 복합 대입 연산자를 사용합니다.





7. 부호의 의미를 갖는 + 연산자와 - 연산자


+ 연산자와 - 연산자는 산술 연산의 연산자에 해당이 되지만, 수학시간에서 양수, 음수를 결정짓는 부호를 나타내는 부호 연산자로도 사용이 됩니다.





8. 증가, 감소 연산자


증가, 감소 연산자는 변수에 저장된 값을 1 증가 및 감소시키는 경우에 사용되는 연산자입니다.


* 단항 연산자입니다. 사용빈도가 굉장히 높으니 꼭 알아 두셔야 합니다 !


연산자

연산자의 기능

결합방향 

++num 

++num 연산을 실행 후, 문장을 실행합니다.

ex) val = ++num; 

<- 

num++ 

num++의 연산보다 문장을 먼저 실행하고, 연산을 진행 합니다. num++연산의 결과 값은 다음 행 부터 적용 됩니다. ex) val = num++;

-> 

--num 

--num 연산을 실행 후, 문장을 실행합니다.

ex) val = --num; 

<- 

num-- 

num--의 연산보다 문장을 먼저 실행하고, 연산을 진행합니다. num++연산의 결과 값은 다음 행 부터 적용 됩니다. ex) val = num--; 

-> 


위의 표가 이해가 되지 않으시면 다음 예제를 보고 확인하시면 됩니다.


* 증가, 감소 연산자 사용시 주의 사항

  - ex) ++3 혹은 --3의 경우에는 에러가 발생 합니다. ++연산자, -- 연산자는 '저장 되어 있는 값(변수)'에 대하여 연산을 실행하기 때문에 ++3과 --3처럼 상수에 직접 연산을 하게 되면 에러가 발생합니다. ++연산자와 --연산자의 피연산자는 변수만 사용 가능합니다. 반드시 ++와 -- 사용시 상수가 아닌 변수를 대상으로 사용하셔야 합니다.




9. 관계 연산자


관계 연산자는 두 개의 값을 비교하는 연산자입니다.


관계 연산자의 종류


연산자 

연산자의 기능 

결합방향 

ex) n1 < n2

n1 이 n2 보다 작은가? 

-> 

>

ex) n1 > n2

n1 이 n2 보다 큰가?

->

== 

ex) n1 == n2

n1과 n2가 같은가?

->

!=

ex) n1 != n2

n1 과 n2가 다른가? 

->

<= 

ex) n1 <= n2

n1이 n2 보다 같거나 작은가?

->

>=

ex) n1 >= n2

n1이 n2 보다 같거나 큰가?

->


관계 연산자를 사용할 때는 주로 두 개의 값을 비교해서 참(O) 또는 거짓(X)를 결정하기 위해 사용하는데 이 때 참 이면 0이 아닌 수 중 대표적인 값인 1을 사용하고, 거짓일 경우 0을 사용합니다.


다른 대부분의 프로그래밍 언어들도 비슷하겠지만 C언어는 0이 아닌 모든 값을 참으로 간주합니다. 단지 1이 참을 의미하는 대표적인 값이기 때문에 연산의 조건을 만족하면 참을 의미하는 1을 반환합니다.


추가적인  이해가 필요 하신 분들은 예제 사진을 보고 확인 하시면 되겠습니다.





10. 논리 연산자


논리 연산자는 AND(논리곱), OR(논리합), NOT(논리부정)을 표현하는 연산자입니다.


(저 같은 경우 AND는 수학의 교집합, OR는 합집합, NOT은 여집합 처럼 이해를 했습니다. 완전히 같은 건 아니지만 상당히 비슷 하더라구요. 그렇다고 제가 맞다는 말이 아니에요! 혹시라도 제 방식처럼 이해 하시는 분이 계실 수 있는데 잘 못 이해 하시면 안 됩니다. ㅠㅠ... 반드시 자신이 이해 하기 쉬운 방식으로 이해 하시는 걸 추천 드립니다 !)


논리 연산자의 종류


연산자 

연산자의 기능 

결합방향 

&& 

 ex) A && B

A와 B 모두 '참'이면 연산결과로 '참'을 반환(논리 AND)

-> 

|| 

ex) A || B

A와 B 둘 중 하나라도 '참'이면 연산결과로 '참'을 반환(논리 OR) 

-> 

ex) !A

A가 '참'이면 '거짓', A가 '거짓'이면 '참'을 반환(논리 NOT) 

<- 


논리 연산자도 헷갈리는 경우가 많은데요(저는 그랬습니다...) 추가적인 이해가 필요하신 분들은 다음의 예제를 통해 확인 하시면 되겠습니다.





11. 콤마 연산자(,)


콤마도 연산자입니다.

단지 다른 연산자들과 달리 연산의 결과가 아닌 '구분'을 목적으로 사용합니다.

둘 이상의 변수를 동시에 선언하거나 둘 이상의 문장을 한 행에 삽입하는 경우에 사용되는 연산자 입니다.


콤마 연산자의 사용 예제 입니다.



변수 선언에서도 확인 할 수 있듯이 일반적으로 int num1 =1; 처럼 변수를 선언 해주고 다음 행으로 넘어가서 선언 해주는 경우도 있지만 예제처럼 콤마(,)를 사용하여 한 행에서 변수 선언을 다 해주는 경우도 가능한 것을 확인 할 수 있습니다.




12. 연산자의 우선순위와 결합방향


연산자의 우선순위

- 연산의 순서에 대한 순위입니다.

- ex) 덧셈과 뺄셈보다는 곱셈과 나눗셈의 우선순위가 높습니다.


연산자의 결합방향

- 우선순위가 동일한 두 연산자가 하나의 수식에 존재하는 경우, 어떠한 순서대로 연산하느냐를 결정해 놓은 것입니다.

- 우선순위가 동일한 두 연산자 사이에서의 연산을 진행하는 방향을 말합니다.

- ex) 덧셈, 뺄셈, 곱셈, 나눗셈 모두 결합방향이 왼쪽에서 오른쪽으로 진행됩니다.      3 + 4 X 5 / 2 - 10  이 경우 연산자의 우선순위에 근거하여 곱셈과 나눗셈이 먼저 진행이 됩니다. 또한 결합방향에 근거하여 곱셈이 나눗셈보다 먼저 진행이 됩니다.


다음은 연산자의 우선순위와 결합방향에 대한 정보를 나타낸 표입니다.


 순위

연산기호 

연산자 

결합방향 

1위

  ()

  함수호출

->

  [] 

  인덱스 

  -> 

  간접지정 

  . 

  직접지정 

  ++(postfix)

  --(postfix)

  후위증가 및 감소 

2위

  ++(prefix)

  --(prefix)

  전위증가 및 감소 

<-

  sizeof 

  바이트 단위 크기 계산 

  ~ 

  비트 단위 NOT

  ! 

  논리 NOT 

  -, + 

  부호 연산(음수와 양수의 표현) 

  & 

  주소 연산

  * 

  간접지정 연산 

3위

  (casting) 

  자료형 변환

<-

4위 

  *, /, % 

  곱셈, 나눗셈 관련 연산 

->

5위 

  +, - 

  덧셈, 뺄셈 

->

6위 

  <<, >> 

  비트이동 

->

7위 

  <, >, <=, >= 

  대소비교 

->

8위 

  ==, != 

  동등비교 

->

9위 

  & 

  비트 AND 

->

10위 

  ^

  비트 XOR

->

11위 

  | 

  비트 OR 

->

12위 

  && 

  논리 AND 

->

13위 

  || 

  논리 OR 

->

14위 

  ?: 

  조건연산 

<-

15위 

  =, +=, -=, *=, /=, %=,

  <<=, >>=, &=, ^=, |= 

  대입연산 

<-

16위 

  , 

  콤마연산 

->




13. C언어의 표준 키워드


마지막으로 C언어의 표준 키워드에 대해 알아 보겠습니다.


C언어의 문법을 구성하는, 그 의미가 결정(약속)되어 있는 단어 키워드(keyword)라 합니다.


keyword는 약속되어 있는 단어들이기 때문에 변수의 이름으로 지정할 수 없습니다.


keyword의 종류는 다음과 같습니다.


auto 

_Bool 

break 

case 

char 

_Complex 

const 

continue 

default 

do 

double 

else 

enum 

extern 

float 

for 

goto 

if 

_Imaginary 

return 

restrict 

short 

signed 

sizeof 

static 

struct 

switch 

typedef 

union 

unsigned 

void 

volatile 

while 


표에서 확인 가능한 키워드들은 기능 및 의미가 정해져 있기 때문에 변수로 사용할 수 없습니다.




다음에는 데이터 표현방식에 대하여 공부하고, 글을 올리도록 하겠습니다.






'프로그래밍 언어 > C' 카테고리의 다른 글

C언어 반복문 - while문(1)  (0) 2017.01.02
C언어 printf 함수 와 scanf 함수  (0) 2017.01.01
C언어 상수와 기본 자료형  (0) 2016.12.27
C언어 데이터 표현방식  (0) 2016.12.25
C언어 공부 시작  (0) 2016.12.21

C언어를 얼른 끝내자는 생각이 많았었는데


시작한지 얼마 되지도 않아서 이런 저런 이유들로 포인터 들어가고 하지를 않았네요...


방학도 시작 했고, 시간 날 때 마다 틈틈이 해야겠어요

(C언어 끝까지 하는 것을 목표로!)


처음은 했었던 부분이기도 하고, 다른 프로그래밍 언어를 하고 있어서 금방 했어요!


다른 프로그래밍 언어에 대해서는 나중에 따로 올리도록 할게요


일단 오늘부터 C를 처음부터 다시 시작했어요


1. main()


C언어 에서 'main()' 함수는 호출(실행)을 명령하지 않아도 자동으로 실행이 되는 함수 입니다.



main() 함수는 C언어 에서 처음 시작 할 때 main 함수가 없으면 실행이 되지 않아요.


* 혹시라도 main 함수를 빼먹지 않도록 주의 하셔야 됩니다 !


2. 헤더파일 선언


헤더파일 선언 부분은 예전에 C언어 처음 공부 할 때 무슨 말인지 이해 못 하고 #include <불러올 헤더 파일> 이렇게 선언을 해주고 프로그래밍을 했었는데, 최근에 공부하면서 알게 된게 PHP에서 include로 파일 불러오고, Python에서 import로 모듈 불러오는 거랑 비슷(?) 하다는 걸 알게 됐어요.

(예전에는 반드시 알고가야 직성이 풀리는 저의 성격상.. C언어 에서는 프로그래밍 할 때 무조건 헤더파일 선언을 해주고 가야 되는 구나~ 라고 생각 했었다는...)


3. printf() 함수


printf() 함수는 ()안에 ""를 넣어주고, "" 안에 출력을 원하는 문자열을 넣어 주면 됩니다. (혹시라도 큰 따옴표("")가 아닌 작은 따옴표('')를 사용 하실 경우 출력이 정상적으로 되지 않습니다. 주의하세요!)

printf() 함수는 함수 선언을 해주지 않아도 사용 가능한 '함수' 입니다.

이러한 함수들을 '표준함수'라고 하는데 Python의 '내장함수'와 비슷(?) 하다고 생각하시면 될 것 같네요.

이러한 표준 함수들을 모아 놓은 것이 '표준 라이브러리' 라고 합니다.

printf() 함수는 기본적으로 헤더파일 중 'stdio.h' 안에 있어서 헤더파일 선언 시 #include <stdio.h>를 해주지 않으면 printf() 함수를 사용 할 수 없습니다.

stdio가 standard input output (표준 입, 출력)의 약자라고 생각이 되는데 한 번 찾아 봐야겠어요.


4. 주석


주석은 어떤 프로그래밍 언어든지 소스코드에 삽입된 메모를 뜻합니다.

이러한 주석은 컴파일의 대상에서 제외 되며, 주석의 有,無 여부와 상관 없이 컴파일 및 실행의 결과에 영향을 미치지 않습니다.


C언어에서 주석은 2종류가 있습니다.

1) /* */

2) //


첫 번째 주석은 블록단위 주석입니다.

주석의 시작(/*)과 끝(*/)을 명시해서 주석 처리를 합니다.


두 번째 주석은 행 단위 주석입니다.

// 표시가 있는 해당 줄의 경우 //표시 이후의 내용은 주석으로 인식 합니다.


5. 서식문자


서식문자의 종류에는 여러가지가 있겠지만 이번에는 정수형태의 출력결과를 가져오는 %d에 대해서 간단하게 사용법만 알아보겠습니다.



사진에서 나온 결과처럼 서식문자인 %d가 있는 부분을 ,로 printf() 함수에서 인자를 구분해서 %d대신 출력할 정수를 지정해준 후 출력을 해 본 결과입니다.


%d의 개수와 순서에 따른 출력 결과를 확인 하실 수 있습니다.




얼마 하지도 않고, 대단한 것을 한 것도 아닌데 굉장히 대단한 것처럼 보이네요;;


다음 글에서는 C언어의 변수와 연산자에 대하여 공부하고, 글을 올리도록 하겠습니다.






'프로그래밍 언어 > C' 카테고리의 다른 글

C언어 반복문 - while문(1)  (0) 2017.01.02
C언어 printf 함수 와 scanf 함수  (0) 2017.01.01
C언어 상수와 기본 자료형  (0) 2016.12.27
C언어 데이터 표현방식  (0) 2016.12.25
C언어 변수와 연산자  (0) 2016.12.24

+ Recent posts