일
KNK Chap.2 (2.4) 본문
2.4 Variables and Assignment
책에서 만든 pun.c 처럼 단순한 프로그램은 사실 별로 없다.
대부분의 프로그램은 출력 전에 일련의 연산 과정을 필요로 하고,
그래서 프로그램이 시행되는 동안 일시적으로 데이터를 저장해야 함.
대부분의 프로그래밍 언어처럼, C에서도 이 저장 위치를 변수variable라고 부름.
Types
모든 변수는 형type을 가져야 한다. 형은 변수가 저장할 데이터가 어떤 종류인지 구체화하는 것.
또한 형은 변수의 저장 방식, 변수가 수행 가능한 작업 종류에 영향을 미친다.
책에서는 int와float 두개의 형만 배운다.
[Q&A]
float 형은 floating-point의 줄임말이다. int 형보다 1. 더 큰 수를 저장할 수 있고 2. 느리다.
특히, float형은 정확한 값이 아니라 근삿값일 때가 많다.
ex) float형에 0.1을 저장하면, 나중에 그 값은 0.09999999999999987이 됨.
반올림rounding할 때 생기는 오차 때문이라고 함.
Declaration
변수는 무조건 선언declaration되어야 사용할 수 있다. 컴파일러의 편하라고 선언되는 것이다.
변수를 선언하기 위해서는 1. 형을 선언하고 2. 변수의 이름을 선언해줘야 함.
몇 개의 변수들이 같은 형을 가질 경우, 묶어서 선언할 수도 있다.
그렇지만 가독성이 떨어지기 때문에, 하나씩 선언해주는게 좋다.
그리고 main이 선언문을 포함한다면, 반드시 구문보다 앞에 가야 한다.
int main(void)
{
*declarations*
*statements*
}
대부분의 함수들이나, 내부에 선언문이 박혀 있는 구문(이하 블록block)은 위 구조처럼 생겼다.
스타일 상 선언과 구문은 한 칸 띄우는게 보기 좋다.
[C99]
C99에서는 구문 뒤에 선언이 와도 되긴 한다.
그렇지만 C++이나 JAVA는 변수가 처음으로 필요할 때 변수를 선언한다.
타 언어을 공부할 거라면 C99만의 허용 방식은 버릇 들이지 않는게 좋다.
Assignment
변수는 할당assignment*에 의하여 값을 받을 수 있다.
*: 몫을 갈라 나눔. 또는 그 몫.
예를 들어
height = 8;
이 구문은 height에 값을 할당하고 있다. 여기서 할당된 숫자 8은 상수constants라고 부름.
이렇게 값을 할당 받거나 사용되기 전에, 변수는 무조건 선언이 되어야 함. 아래의 예제처럼.
int height; -> 정수integer라고 선언된 변수
height = 8; -> 상수constants
그러나 이렇게는 안된다.
height = 8; /***WRONG***/
int height;
실수float 형 변수를 할당받은 상수는 보통 소수점 값을 가진다. 예를 들어 아래의 예제처럼.
float profit;
profit = 2150.48;
[Q&A]
그러나 여기에 상수에 float을 뜻하는 f 문자를 같이 적어주는게 좋다. 아래의 예제처럼.
float profit;
profit = 2150.48f;
만약 f를 빼먹으면 컴파일러가 오류라고 인식할 수도 있다.
int형 변수는 보통 int형 값을 할당 받고, float형 변수는 보통 float형 값을 할당 받는다.
int형 값을 float형 변수에 할당하는 등의 형을 섞는 행위는 가능하지만 안전하진 않다.
한 변수가 한 값을 할당 받으면, 다른 변수의 값을 계산하는 데에 쓰일 수 있다:
height = 8;
length = 12;
width = 10;
volume = height * length * width; /* volume is now 960 */
일반적으로 여러 변수를 선언한 후에 그 변수들을 이용해서 새로운 변수의 값을
할당할 때의 우변은 상수, 변수, 연산자로 이루어진 공식(C 용어로는 표현식expression)이다.
Printing the Value of a Variable
printf 를 이용하면 변수의 현재 값을 출력할 수 있다. 예를 들어,
Height: h
라고 출력을 하고 싶다 치자. 여기서 h는 height 변수의 현재 값이라고 하자.
그러면 아래와 같이 printf를 이용하면 됨.
printf("Height: %d\n", height);
여기서 %d는 출력하는 동안만 height의 값을 대신 나타내고, 오로지 int형 변수만 대신한다.
flaot형 변수를 대신하는 것은 %f이다. 기본적으로 %f는 소수점 이하 6자리까지 출력함.
만약 소수점 이하 p자리까지 %f가 출력하게 하려면, %와 f 사이에 .p를 적어주면 된다.
예를 들어, 아래의 구문을 출력한다고 해보자.
Profit: $2150.48
그럼 아래와 같이 printf를 호출하면 됨.
printf("Profit: $%.2f\n, profit");
아까도 말했지만, printf는 개수 제한 없이 변수를 출력할 수 있다.
만약 height과 length를 동시에 출력하고 싶으면, 아래와 같이 printf를 호출하면 됨.
printf("Height: %d Length: %d\n", height, length);
program: Computing the Dimensional Weight of a Box
박스의 용적 중량을 계산하는 프로그램을 만들어보자.
박스 요금은 무게가 아닌 부피로 책정되고, 미국에서는 보통 부피를 166으로 나눔.
이렇게 계산된 값을 보통 용적 중량dimensional weight(이하 weight)이라고 함.
내가 운송회사에 취직해서 박스의 용적 중량 계산 프로그램을 짜야 한다고 치자.
일단 나는 뉴비니까 간단하게 12"*10"*8" 크기의 박스의 용적 중량을 계산해보기로 함.
C에서 나눗셈의 연산자는 / 이니까, 용적 중량을 계산하는 방법은 아래와 같을 것이다.
weight = volume / 166;
여기서 weight와 volume은 박스의 무게와 부피를 나타내는 integer 변수이다.
그러나 이 공식은 문제가 있다. C에서는 한 정수가 다른 정수로 나뉘면 결과가 불완전해진다.
즉, 소수점 이하는 다 날아간다. 예를 들어 12"*10"*8" 박스의 입방 인치를 166으로 나눠 보자.
그럼 5.783이 아닌 5가 나올 것이다. 하지만 회사는 올림을 원하겠지.
해결책은 부피volume에 165를 더하고 166으로 나누는 것. 그럼 소수점이 올림이 됨.
weight = (volume + 165) / 166;
volume이 166이면 weight은 331/166 또는 1이 될 것이고,
volume이 167이면 weight은 332/166 또는 2가 될 것이다.
이런 방법으로 프로그램을 작성해보자.
program name: dweight.c
이 프로그램의 결과는 아래와 같다.
Initialization
대부분의 변수는 프로그래머가 직접 0으로 값을 초기화Initialization해줘야 한다.
기본 설정값이 없는 변수는 값을 할당하지 않으면 초기화되지 않았다uninitialized고 한다.
[!!!] 초기화되지 않은 변수에 접속하려고 시도하지 마라. 예상치 못한 결과를 산출할 수 있다.
(예를 들어 prinf 함수로 그 변수를 출력한다거나, 표현식에서 그 변수를 사용한다거나)
어떤 컴파일러에서는 심할 경우 프로그램이 고장crash날 수 있다.
변수에 초기값(initial value, initializer)을 줄 때 할당 외에 다른 방법도 있긴 있다.
아래의 예시처럼 변수의 초기값을 선언할 때 동시에 할당하는 것이다.
int height = 8;
물론 다른 변수에도 이런 식의 할당이 가능하나, 좋은 코딩 습관은 아니니 지양하자.
각 변수는 자신만의 초기값을 필요로 한다. 변수들의 초기값이 같더라도 하나씩 선언해주자.
Printing Expressions
printf 함수는 변수에 저장된 숫자 출력에 한계가 없다. 어떤 표현식expression이던 가능하다.
이 특성의 장점을 이용하면 프로그램을 더 단순화할 수 있고, 변수의 수도 줄일 수 있다.
예제를 보자.
volume = height * length * width;
printf("%d\n", volume);
이것은 아래 예제로 대신할 수 있다.
printf("%d\n", height * length * width)
즉, printf 함수의 표현식 출력 기능은 C의 일반적인 원칙을 보여준다.
어디든 특정 값이 필요한 곳에는, 그와 같은 값의 표현식이 대신 들어갈 수 있다.
'C' 카테고리의 다른 글
KNK Chap.2 (2.8~Q&A) (0) | 2022.12.06 |
---|---|
KNK Chap.2 (2.5~2.7) (0) | 2022.12.03 |
KNK Chap.2 (2.1~2.3) (0) | 2022.12.02 |
C Programming: A Modern Approach second edition a.k.a KNK (2008) Chap.1 (1) | 2022.12.02 |
C#으로 프로그래밍 입문하기: 헬로 코딩Hello Coding (1) | 2022.12.01 |