[CodeEater와 제로부터 시작하는 C언어] 4.2장 - 서식 지정자

아래의 내용은 현재 배운 개념만으로는 아직 다 이해 못할 수 있다.
어자피 중요한 것은 앞으로도 계속 추가적인 언급이 있을것이므로 이 장을 띄어 넘어도 좋다.
다만 추후에 다시 서식지정자에 대해 조금 알고 싶다면
다시 이 포스팅으로 돌아와서 확인하도록 하자.

뭔가에 대해서 출력할 때는 서식지정자라는걸 사용한다고했고
몇가지 서식지정자를 보았다. 대표적인게 %d와 %f일 것이다.
그런데 서식지정자가 그것밖에 없나?
아니다 많다. 애당초 서식지정자는 간단하지만은 않다.
다만 이를 모두 외울 필요는 없는데 그이유는 사실 90%이상의 서식지정자는
몰라도 어떻게 의쌰의쌰?하면 해결할 수 있기 때문이다.
이는 나중에 배우게될 조건문과, 분기문을 조합해서 몰라도 구현할 수 있다.
그래서 현업에서도 보면 이 서식 지정자를 다 모르고 사용하는 사람도 많다.
그런데 별 문제없이 사용한다.
그래서 사실 이걸 할까 말까 고민하다가 결국 사이드로빼서 하게 되었다.
여기서는 아직 배우지 못한 문자와 문자열이라는 개념도 존재한다.
그래서 자세히 설명하지는 않겠다.

자세히 설명하려면 길어지기 때문이다.
선생님이 수업 5분남기고 중요한거 있으니까 조금만 더한다고
한다음에 쉬는시간 다써버리는 경우 있잖아.
난 그런 경우를 만들고 싶지는 않다.

일단 정수를 출력하는건 좀 많이 써봤다.
%d, %i, %f는 써봤는데 더 있을까?
불행하게도... 더있다. 생각보다는 많이 있다 심지어.
종류는 아래와 같다.

이러한 것을 변환 지정자(Conversion Specifier)라고 한다.
우리가 써봤던 것들도 있고 안써봤던것도 있다.
디버깅용으로 자주 쓰는건 8진수, 16진수, 주소 출력을 주로 쓴다.
또한 옵션도 존재한다.

위는 한번도 사용한적 없겠지만 서식지정자 옵션이다.
서식 지정자 옵션을 이용해서 여러가지 상황을 만들 수 있다.
이렇게 보면 이해가 잘 안될 수 있다.
그런데 예시로 풀려면 너무 양이 많아지므로 자주 쓰는것을 위주로 이야기를 하려고한다.
#include <stdio.h>
int main() {
char c = 65;
printf("%d\n", c);
printf("%c\n", c);
return 0;
}
이 때까지 %d만 막 썼는데 %c는 문자를 출력한다고 했다.
한번 결과를 보자.

일단 두가지 문제점이 있다.
1. 왜 char인데 %hhd가 아니라 %d이냐?
2. 같은 값인데 왜 출력이 다르냐?
하나하나 답변을 해드리겠다.
char인데 %d를 출력해도 상관없다.
그 이유는 정수형의 경우 작은 크기의 단위는 큰 크기의 단위로 항상 출력할 수 있다.
즉 %d뿐만 아니라 %ld, %lld모두 사용 가능하다.
그리고 부작용도 없다.
그렇기 때문에 사실은 %hhd는 거의 쓸 필요가 없다.
그냥 정수를 출력할때는 %d라고 생각하면 된다.
그리고 같은 값인데 출력이 다른 이유는 컴퓨터는 어짜피 값을 모르기 때문이다.
이는 4장 1편 포스팅인 변수의 표현에서 재확인할 수 있다.

이제 진수표현법을 알려드리도록 하겠다.
C언어에서 표현가능한 진수는 총 4가지이다.
표현 할때는 앞에 접두사(Prefix)를 사용하게 된다.
2진수는 0b, 8진수는 0, 10진수는 없고 16진수는 0x를 붙힌다.
진수 표현을 알아줬으니 과연 결과가 같을지 코드로 보자.
#include <stdio.h>
int main() {
int num_bin = 0b01000001;
int num_dec = 65;
int num_oct = 0101;
int num_hex = 0x41;
printf("%d\n",num_bin);
printf("%d\n", num_dec);
printf("%d\n", num_oct);
printf("%d\n", num_hex);
return 0;
}
계산해보면 저 넷은 같아야한다.
그러면 과연 넷은 같을까??

보면 알겠지만 값이 같다.
사실 진수를 적는건 내부적으로는 별로 중요하지않다.
2, 8, 10, 16진수는 사람이 보는거고 내부는 어짜피 2진수로 저장된다.
그래서 출력할때는 포맷형식만 정해주면 그 포맷형식에 맞게 출력된다.
하지만 가끔은 출력자체를 진수에 맞게 하고싶을 때가 있다.
과연 방법이 없을까??? 라고 생각했을때 위의 서식지정자를 보면 있다는걸 알 수 있다!
#include <stdio.h>
int main() {
int num = 65;
printf("%d\n", num);
printf("%o\n", num);
printf("%x\n", num);
return 0;
}
위의 코드를 보면 65를 저장한 num을 여러가지 포맷으로 출력하는걸 확인할 수 있다.

그리고 각각 진수에 맞게 출력된는걸 확인할 수 있다.
그런데 2진수는 없어서 이상할 것이다...
그렇다 사실 2진수는 출력 포맷이 지원되지 않는다.
그래서 여러분이 만들어서 써야한다.
근데 이거 출력하는게 꽤 난이도가 있는데 나중에 이야기하도록 하겠다.

아직 변환 지정자가 더 있지만 다 하기에는 양도 많고
새로 배워야할것도 많으니 빨리 빨리 옵션으로 넘어가자.
사실 위에 배운것만으로도 충분히 잘 활용할 수 있다고 생각한다.

위에서 봤지만 까먹었을테니 다시 보도록하자.
저게 뭘 의미하는지는 예시를 보면 알 수 있다.
자주쓰는것만 보여드릴테니 나머지는 직접 해보길 바란다.
#include <stdio.h>
int main() {
int num = 65;
printf("%5d\n", num);
return 0;
}
서식 지정자 앞에 숫자를 붙힐 수 있다.
이걸 서식 필드(Format Field)라고 부르는데 기본적으로 서식 필드의 크기는 0이다.
다만 출력 값이 서식 필드의 크기를 넘어설 경우 출력값이 우선시된다.
정리하자면 서식 필드가 더 크면 서식 필드의 크기를, 작으면 값의 크기가 출력 크기가 된다.
위의 경우 서식 필드를 5로 명시적으로 지정했으므로 필드는 5개의 공간을 가지게된다.

65는 2개의 필드를 차지하는데 우리는 5개를 지정했으므로 출력 필드는 5가 된다.
이 경우 나머지 3개의 칸은 공백으로 채워지게된다.
그리고 숫자는 우측정렬이 된다.
#include <stdio.h>
int main() {
int num = 65;
printf("%-5d!!\n", num);
return 0;
}
이 때 -옵션을 붙혀주면 좌측 정렬이 된다.

보면 필드의 좌측으로 정렬된걸 볼 수 있다.
#include <stdio.h>
int main() {
int num1 = 65;
int num2 = -65;
printf("%+5d\n", num1);
printf("%+5d\n", num2);
return 0;
}
여기서 +옵션을 붙히면 양수도 기호를 표현하게된다.
원래는 음수만 기호를 표현했는데 양수도 표현된다.
중요한 것은 0도 양수로 취급해서 기호를 붙힌다는 점이다.

결과를 봤을때 기호도 필드를 한칸 차지한다는걸 알 수 있다.
그리고 일반적으로 회계쪽이 아니라면 양수에는 기호를 붙히지 않는다.
그런데 이는 가끔가다 자리를 맞춰서 출력하는 상황에서 문제가 생길 수 있다.
그래서 이를 위한 또다른 옵션이 있다.
#include <stdio.h>
int main() {
int num1 = 65;
int num2 = -65;
printf("% d\n", num1);
printf("% d\n", num2);
return 0;
}
옵션에 공백옵션이 있는데 이를 넣으면 부호가 양수일 경우 공백을 넣게된다.

결과를 보면 알겠지만 양수도 한자릴 비워둔걸 확인할 수 있다.
나머지는 자주 사용을 안하거나 보기만 해도 이해가 될것이므로 여기까지 알아보도록하자.
'제로부터 시작하는 프로그래밍 > C' 카테고리의 다른 글
[CodeEater와 제로부터 시작하는 C언어] 5.1장 - scanf (0) | 2019.12.03 |
---|---|
[CodeEater와 제로부터 시작하는 C언어] 5장 - 입력과 출력 (0) | 2019.12.01 |
[CodeEater와 제로부터 시작하는 C언어] 4.1장 - 변수는 어떻게 표현되는가 (0) | 2019.11.23 |
[CodeEater와 제로부터 시작하는 C언어] 4장 - 변수와 자료형과 포맷 (0) | 2019.11.20 |
[CodeEater와 제로부터 시작하는 C언어] 3장 - 프로젝트 만들기/첫프로그램 (0) | 2019.11.12 |