본문 바로가기

Computer Engineering

[C] 0x03 DataType(자료형)

오늘은 C언어를 공부하면서 여러가지 복잡한 대상을 단순화 시키는 ... 간략히 말하면 추상화라고 할 수 있겠죠?

추상화시켜서 크게 정수, 문자, 실수 이렇게 3가지 자료형( DataType ) 이 존재한다. 3가지 자료형을 살펴보면 아래와 같다. 자료형은 변수(variable)를 선언할 때에 반드시 필요한 것이므로 잘 알아두자.
간단하게 짚고 넘어가면 변수는 Data 를 저장할 공간의 이름을 말하는 것이다. 
 


= 자료형( DataType ) =

- 정수 : 1, 99, -10 ... 
// short, int, long

- 문자 : a, B, Z
// char

- 실수 : 정수 & 1.1, 99.9 => 정수와의 차이라면 소수점을 사용한다는 것이다.
// float, double

위의 자료형을 이용해서 변수를 선언해서 Memory를 가져오는 것이다. 그리고 Memory 를 가져온 뒤에 Data를 처리하는 것이다.

C 언어 소스코드를 좀 더 살펴보면 크게 4가지 과정을 확인할 수 있다. 
=> 기본설정 - 공간 할당 - 연산 - 처리



= 변환(서식) 문자 =
[변환문자.c]

#include <stdio.h>

int main()
{
  int jungsoo;
  double sosoo;
  char moonja;

  jungsoo = 12;
  sosoo = 3.4;
  moonja = 'O';

  printf("정수를 출력합니다. %d\n", jungsoo);
  printf("소수를 출력합니다. %f\n", sosoo);
  printf("문자를 출력합니다. %c\n", moonja);

  return 0;
}

jack2@Security:~/바탕화면/C/0x03$ ./변환문자 
정수를 출력합니다. 12
소수를 출력합니다. 3.400000
문자를 출력합니다. O

=> 실행한 결과를 통해 알 수 있듯이 정수(jungsoo), 소수(sosoo), 문자(moonja)를 각각 출력해준다.

정수는 변수선언을 int 로 해주었고 변환문자는 %d 를 사용했다.
소수는 변수선언을 double 로 해주었고 변환문자는 %f 를 사용했다.
문자는 변수선언을 char 로 해주었고 변환문자는 %c 를 사용했다.

변환문자를 잘못 적었을 경우에는 어떻게 나오는지 확인해 보았다.

printf("소수를 출력합니다. %d\n", sosoo);
                                          |
    위에서는 %f 를 사용했는데 정수형 변환문자인 %d 로 적어주었다.
 

jack2@Security:~/바탕화면/C/0x03$ ./변환문자 
정수를 출력합니다. 12
소수를 출력합니다. 3.400000    // %f를 사용한 정상값
문자를 출력합니다. O
소수를 출력합니다. -1717986918    // %d를 사용한 값

%d를 사용한 값을 보면 -1717986918 라는 듣보잡값이 출력된다.
이런 값이 나오는 것을 방지하기 위해서 각각의 자료형에 맞는 변환문자를 사용해야 하는 것이다.

다음으로 알아볼 부분은 소수 출력 부분!!
소수를 보면 우리는 3.4라고 선언했다.
하지만 출력값을 보면 
3.400000 이라는 값으로 동일한 값이나 소숫점 6자리까지 출력이 된 것을 확인 할 수 있다.

그 이유는 변환문자 %f  와 관련이 있다. %f 의 기본값으로 출력했을 때에 기본값으로 소수점 6자리까지 출력하는 것으로 정의되어있다.

  printf("소수를 출력합니다. %f\n", sosoo);
  printf("소수를 출력합니다. %.1f\n", sosoo); 

%f 로 변환문자를 적은 부분 바로 아래 
%.1f 로 변환문자를 적어주었다.

그 결과를 확인해보면

jack2@Security:~/바탕화면/C/0x03$ ./변환문자 
정수를 출력합니다. 88
소수를 출력합니다. 2.200000
소수를 출력합니다. 2.2
문자를 출력합니다. H
소수를 출력합니다. -1717986918 

  printf("소수를 출력합니다. %f\n", sosoo);
  => 
소수를 출력합니다. 2.200000

  printf("소수를 출력합니다. %.1f\n", sosoo); 
  => 
소수를 출력합니다. 2.2

이렇게 대응이 되는 것을 알 수 있다. 센스있으신 분들 벌써 눈치채셨는가?
'%' , 'f' 사이에  .1 을 적어주어서 출력값이 바뀐것이다.

만약 .2로 적어주었다면? 2.20 으로 출력될 것이다.

즉, %.Nf 이렇게 적었을 때에 소수점 자리수가  소수점 N자리로 출력이 되는 것이다.

%.Nf 에서 N=0 인 경우에는? 소수점 0자리... 즉 소수점부분이 표현이 안되는데 반올림을 하게 된다. 현실에서 사용하는 반올림과 다른데 어떻게 다른지 아래의 예를 보면 알 수 있을 것이다.

  sosoo = 2.4;
  printf("소수를 출력합니다. %.0f\n", sosoo);
=> 소수를 출력합니다. 2
 
  sosoo = 2.5;
  printf("소수를 출력합니다. %.0f\n", sosoo);
=> 소수를 출력합니다. 2
 
  sosoo = 2.6;
  printf("소수를 출력합니다. %.0f\n", sosoo);
=> 소수를 출력합니다. 3

이렇게 현실에서는 2.4 와 2.6을 반올림하면 각각 2, 3이 되는 것이 맞다. 하지만 문제는 2.5 현실에서는 2.5를 반올림하면 3이 되지만 C언어에서 출력시에는 2가 되는 것이다.

정리해서 이야기하면 소수점 부분이 1~5 는 버리고 6~9는 올려주는 것이다.


= C언어에서 변수선언은 어디에서? =

변수가 이미 한 번 선언되었기 때문에    // double sosoo;
위의 예처럼  sosoo=2.4; , sosoo=2.5; , sosoo=2.6; 이렇게 사용할 수 있는 것이다.

C언어의 특징이라고 할 수 있는데 int main() 바로 아래부분(이 곳을 함수선언부라고 한다)에 함수를 선언할 수 있다.

만약에  
  printf("소수를 출력합니다. %.0f\n", sosoo);
  char moonja = 'O';
  printf("문자를 출력합니다. %c\n", moonja); 
 

printf 함수를 사용했는데 위에서는 sosoo 라는 변수만 사용했고
아직 moonja 라는 변수를 출력하기 전이어서 위 처럼 변수를 선언하면 빌드가 안되는 것이다.

 JAVA 와 같은 경우에는 가능하지만 C 에서는 안되는 C언어 만의 특징이라고 할 수 있다.

= 상수( Const ) =
우리가 위에서부터 계속 변수(Variable) 이라는 말을 했다. 상수는 변수앞에 const 를 적어준 것이다.

int jungsoo = 1;    // 
변수(Variable)
const int jungsoo = 1;    // 상수(Const) 

변수와 상수의 차이점이라면
변수는 처음 한 번 선언한 다음 jung
soo=2; , jungsoo=3; , jungsoo=4; ...
이런식으로 변경할 수 있다. 

하지만 상수는  
const int jungsoo = 1; 
이렇게 한 번 선언하면 나중에 다시 변경시킬 수 없고 상수는 반드시 선언함과 동시에 초기화를 해주어야 한다. 

 

======추가사항======================================================
 %d : 10진수로 출력 정수형 
 %o : 8진수로 출력 
 %x : 16진수로 출력 

'Computer Engineering' 카테고리의 다른 글

[C] 0x06 조건문(if)  (0) 2012.01.12
[C] 0x05 연산자(Operator)  (0) 2012.01.11
[C] 0x02 컴파일러(Compiler) , 링커(Linker), 이스케이프 문자열(Escape Sequence) ...  (0) 2012.01.06
[C] 0x01  (0) 2012.01.05
Emacs 명령어  (0) 2011.11.15