혼자 연구하는 C/C++ 3장 정리(변수)

2015. 2. 26. 22:00창고

728x90
728x90

1. 변수의 정의

말뜻 그대로 풀어보면 변할 수 있는 수.

보존과 관리를 위해 사용한다. 메모리 관리를 효율적으로 하기위해 사용한다.


이름은 변수이지만 반드시 수만 들어가는 것이 아닌 문자열이나 포인터 같은 자료형도 저장.


컴퓨터가 하는 주된 일은 메모리에 기록된 값을 처리해 입출력 하는 것.

4GB의 메모리는 40억 개나 되는 이런 기억 소자들에 이름을 붙여줄 수 없음.

연산 대상 메모리의 위치를 구분하기 위해 숫자로 된 번지(Address)를 사용.


0x183c7eda에 값을 저장해라! 그런데 이걸 어떻게 외워?!


이런 값이 10개만 있어도 사람 머리는 산산조각 남.

그래서 변수를 사용하면 실제 번지 값을 읽거나 쓰는 코드를 대신 작성할 수 있다!




int Num;

이렇게 변수를 사용하면 실제 코드를 작성할때 Num = 1과 같은 방식으로

실제 번지 값을 읽거나 쓰는 일이 사라진다.

변수를 하나 만들어 놓으면 여기 값을 저장하거나 다시 꺼낼 수 있다.


변수 작성법

- 의미를 잘 설명할 수 있는 이름으로 주는 것이 좋다.

- 변수명의 길이에는 제약이 없지만 3~10자 정도 작성하는 것이 좋다.

- 대소문자 구성을 일관되게 하는 것이 좋다.

- 변수명은 보통 짧은 영어 단어를 활용한다.


2. 변수의 종류

Num = 56이라는 명령은 Num이 가리키는 번지에 들어 있는 값을 56으로 바꾸라는 뜻.

변수는 저장된 메모리의 위치와 함께 길이와 형태에 대한 정보를 가진다.

이런 변수의 특성을 타입! 이라고 한다. C에서 지원하는 타입은 크게 기본형과 유도형으로 나뉘는데. 아래와 같다.


3. 변수의 선언



ex) 

int Num;

int Num = 12;

int angle, radius;

double ratio;


4. 입출력 - 출력

printf 함수 사용방법



서식 종류와 출력방법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <stdio.h>
/*
서식문자    출력 형태
c    문자
d,i    부호 있는 십진법으로 나타난 수
e    지수 표기법(Scientific notation) 으로 출력하되, e 문자를 이용한다.
E    지수 표기법(Scientific notation) 으로 출력하되, E 문자를 이용한다.
f    십진법으로 나타낸 부동 소수점 수
g    %e나 %f 보다 간략하게 출력
G    %E나 %f 보다 간략하게 출력
o    부호 있는 팔진수
s    문자열
u    부호없는 십진법으로 나타낸 정수
x    부호없는 16 진법으로 나타낸 정수 (소문자 사용)
X    부호없는 16 진법으로 나타낸 정수 (대문자 사용)
p    포인터 주소
#p     0x포인터주소
*/
 
void main()
{
    char c = 'a';
    char str[5] = "cscs";
    int nVal = 1000;
    double fVal = 1232.12323;
    unsigned int unVal = 4240000000;
 
    printf("%%c = %c\n", c);
    printf("%%d = %d\n", nVal);
    printf("%%i = %i \n", nVal);
    printf("%%e = %e\n", nVal);
    printf("%%E = %E\n", nVal);
    printf("%%f = %f\n", fVal);
    printf("%%g = %g\n", fVal);
    printf("%%G = %G\n", fVal);
    printf("%%o = %o\n", nVal);
    printf("%%s = %s\n", str);
    printf("%%d = %d\n", unVal);
    printf("%%u = %u\n", unVal);
    printf("%%x = %x\n", nVal);
    printf("%%X = %X\n", nVal);
    printf("%%p = %p\n", &nVal);
    printf("%%#p = %#p\n", &nVal);
}
cs


http://hmjo.tistory.com/entry/printf-서식-종류와-출력


%n - 출력된 문자 개수를 포인터 변수에 대입한다.


서식의 완전한 형태.




서식 정렬

http://hmjo.tistory.com/entry/printf-서식


5. 입출력 - 입력

scanf 함수 사용방법.

(티스토리 서식 입력기에 ampersand가 안써질줄이야...........)


scanf("서식문자열", &변수 [,&변수, ...]);


특히 scanf의 변수 부분에 &를 붙이는 이유가 중요!

scanf 함수는 뒤의 변수 부분에 변수의 주소값을 보내기때문에 참조 연산자인 &를 사용한다.

ex)

1
2
3
4
5
int a, b, sum;
scanf("%d", &a);s
canf("%d", &b);
sum = a+b;
printf("Sum = %d", sum);
cs


6. 그외 입출력 함수들

puts("문자열") - 서식이 없어 속도가 빠르다. 문자열 출력후 개행을 해준다.

gets(변수) - 문장을 입력 받을 떄 사용한다. scanf는 공백 단위로 받기 때문에 긴 문장을 넣을 때는 gets로 받는다.

putch(c) - 문자 하나만 출력하는 함수이다.

getch(c) - 문자 하나만 입력받는 함수이다.


7. 정수형

정수(Integer)란 부호는 있지만 소수점 이하를 표현하지 못하는 수이다.


int a;

운영체제로부터 정수형 int 4바이트만큼 메모리 공간을 할당하고 

그 주소위에 a라는 이름을 붙여주고 이 안에는 쓰레기 값이 들어있다.


int 타입의 범위


int는 왜 4바이트인가?

C언어의 타입 정의에 int형은 CPU의 레지스터와 동일한 크기를 가지는 타입으로 정의되어있다.

int형은 CPU가 가장 효율적으로 다룰 수 있는 정수형으로 정의되어 있으며 

int형의 실제 크기는 플랫폼에 따라 달라진다.

ex) 16비트 운영체제의 int는 2바이트, 32비트 운영체제의 int는 4바이트


int도 4바이트 long도 4바이트?

어떤 운영체제든 long형은 4바이트로 크기가 고정되어 있다.

int는 플랫폼에 따라 크기가 변하므로 고정적으로 4바이트를 사용하고 싶다면 long을 선언하여 사용하면 된다.


8. 정수형 상수

123, 8909090, -86400

그 크기와 형태를 보고 적당한 타입으로 메모리에 저장된다.


크기를 강제로 지정하는 방법

L(Long), U(Unsigned)를 숫자 뒤에 붙이면 된다. 대소문자 관계 없이.

ex) 28L, 1010ul (4바이트 long형으로 정의)


2진 표기법은 제공하지 않으므로 16진수로 바꾸어 표기한다.

(표준 위원회에서 2진 표기법 제안이 여러 차례 있었지만..

익숙해지면 16진수로 암산이 가능하다는 이유로 표준에서 제외됐다.)

이게 무슨 개똥같은 소린지...파워 암산왕들..


9. 실수형

소수점 이하를 가지는 수이며 정수보다는 한 단계 더 확장된 범위를 포괄한다.


타입별 범위


수학에서의 실수와는 달리 무한대의 정밀도를 보장하지 않는다.

그래서 정밀도를 표현해주는 것이고 사용에 주의해야 한다.

만약 float형이 바이트 단위에 정수부와 소수부로 나눈다면 표현할 수 있는 범위가 굉장히 좁아진다.

그래서 컴퓨터는 이를 해결하기 위해 부동 소수점이라는 특이한 방식을 사용한다.


가수부는 값의 모양을 표현하고 지수부는 10의 거듭제곱승으로 값의 크기를 결정한다.


10. 실수형 상수

-0.314, 123.456, 5.0

일반적인 실수의 표현법인 고정 소수점 표기법이다.

실수형 상수 표기에 부동 소수점 표기법도 있다.

3.14e-1, 1.23456e2


실수형 상수 뒤에도 정확한 크기를 명시하는 F 접미사를 사용할 수 있다. (대소문자 가능)


11. 문자

문자형은 문자 하나를 표현하는 자료형이다.

컴퓨터는 숫자밖에 모르기때문에 어떤 문자를 숫자에 대응시켜 인코딩하는 방식을 택했다.

아스키(ASCII) 코드 방식을 이용해 0~255 사이의 숫자에 문자를 대응하여 표현한다.



문자상수는 'A'와 같은 형태로 사용하고, 표준입출력시 %c를 이용한다.


12. 확장열

Enter나 ' 구두점, ; 구두점, " 구두점 등등.

컴파일러가 문자인지 코드의 구두점인지 구분할 수 없다.

그래서 이것을 특수한 방법으로 표현하는데 이를 확장열(Escape Sequence)라고 한다.

13. 문자열

일련의 문자가 연속되어 있는 것이며 문자의 집합이 곧 문자열!

문자 상수와는 달리 겹따옴표로 감싸서 표현한다.

"Kore"


char str[5] = "Kore"


선언하는 방법이고, 기본적으로 문자열 끝은 \0(널 문자)가 들어간다.

널 문자는 문자의 끝을 알려주는 역할을 하며 메모리의 연속적인 공간에서 끝을 명확히 표시해준다.



다음과 같이 메모리 공간에 문자열이 들어간다.


3중문자

세 개 연속된 문자를 하나의 문자로 대체하는 표현이다.

나라마다 키보드가 다르기때문에 ASCII 표에 없는 9개의 문자들이 없을 수 있다.



14. 열거형

열거형(Enumeration)이란 변수가 가질 수 있는 가능한 값들을 나열해 놓은 타입이다.


enum{멤버, 멤버, ... } 변수;


ex)

1
enum{EAST, WEST, SOUTH, NORTH} mark;
cs


mark라는 변수는 방향값을 기억하는 동서남북의 넷 중 하나이다.


1
enum{EAST = 5, WEST = 10, SOUTH, NORTH} mark;
cs


WEST가 10인 것을 기준으로 SOUTH 11, NORTH 12가 된다.


왜 열거형을 쓰는가?

- 기억이 용이하다.

- 소스의 가독성이 높아진다.

- 열거형은 정수형보다 안전하다.


15. 태그

열거형은 내부적으로 정수형으로만 처리되지만 값의 범위가 엄격하게 정해지는 별도의 타입이다.

열거형 타입을 먼저 정의하고 이 타입으로 변수를 선언하는 방법이 더 많이 사용된다!

태그를 붙여 int, double 처럼 타입의 자격을 가진다.


enum 태그명 {멤버, 멤버, ...};


ex)

1
2
enum origin{EAST, WEST, SOUTH, NORTH};
origin mark;
cs


16. 유도형 - 배열

가장 흔한 자료 구조이면서 실용적이다.


타입 배열명[크기][크기]...;


타입 - 배열의 요소가 어떤 값을 담는지 지정한다.

배열명 - 배열도 변수이므로 이름이 있어야 한다.

크기 - 요소의 개수가 몇 개인가를 []괄호를 통해 정수 상수로 지정한다. 크기가 지정이 여러개가 되면 다차원 배열이 된다.


17. 구조체

동일한 타입의 집합인 배열과 달리 구조체는 서로 다른 타입의 집합이다.


struct{

멤버 목록

} 변수명;


ex)

1
2
3
4
5
6
struct{
    char name[10];
    int age;
    double height;
}Friend;
 
cs


선언된 순서로 메모리가 할당

name 10/ age 4/ height 8


.(점) 연산자를 사용하여 구조체.멤버로 접근이 가능하다.

ex) Friend.age = 28;


18. 포인터

일반 변수들은 수치값을 저장한다. 이에 비해 포인터형은 번지를 기억한다는 면에서

일반적인 변수와는 조금 다르다. 

포인터가 가르키는 메모리를 함수가 직접 조작할 수 있다.


타입* 변수명;


ex)

int* pi;


선언 이후에 값을 참조하는 방법은 *를 붙이면 된다.(역참조 연산)

*pi = 3;

선언에서의 *와 값을 접근할때 *는 다른 것!


* - 포인터가 가르키는 변수의 값을 읽는 연산자. 역참조 연산자.

& - 변수의 주소가 나오게 한 차원 승격시켜주는 연산자. 참조 연산자.


19. 사용자 정의형


언어가 지원하는 타입이 아무리 풍부해도 프로그램의 특수한 요구에 모두 수용할 수 없다.

그래서 사용자가 새로운 타입을 정의하는 방법을 제공한다.


typedef 타입정의 타입이름;


ex)

1
2
3
 
typedef int jungsoo;
typedef enum {TRUE, FALSE} Bool;
cs


20. 논리형

참 또는 거짓 둘 중의 하나의 값을 가지는 타입이다.

1
2
3
typedef int BOOL;
#define TRUE 1
#define FALSE 0
cs

 

C++에서는 bool형 변수가 따로 있다.

진위형 bool은 1바이트이기때문에 C에서 int로 선언한 4바이트보다 메모리 공간을 절약할 수 있다.

하지만 속도차이는 거의 나지 않는다.

태시에 혼자 타나 4명이 타나 똑같은 비용이 드는 것과 같은 이치.

728x90
반응형