1. printf() 함수가 필요한 이유
println() 함수는 변수의 값을 "있는그대로" 출력한다.
원하는 상황에 따라서, 변수의 값의 "형식"을 다르게 출력하고 싶을 때가 있을 수 있는데, 이 때 printf() 함수를 사용한다.
printf() 함수는 "지시자"를 통해 값을 출력하는 형식을 지정할 수 있으며, 함수가 호출될 때 값을 지시자에 맞게 변환하고 출력하는 기능을 가지고 있다.
public class Printf {
public static void main(String[] args) {
System.out.printf("age: %d",29); //age: 29
}
}
2. printf() 함수의 구조
public PrintStream printf(String format, Object ... args) {
return format(format, args);
}
- 인자는 지시자를 포함한 출력 문자열과 변환시킬 값의 가변인자로 구성
- 지시자를 포함한 출력형식을 주고, 변환할 값을 주면된다.
- 지시자와 변환할 값의 순서는 반드시 일치해야한다.
3. 지시자
지시자 규칙은 동일하므로, log-back.xml 등의 설정에서 %-5p 같은 지시자는 지시자 사이에 음수가 있으므로 로그 레벨을 포함한 우항 공백 5칸을 의미한다.
public static void main(String[] args) {
System.out.printf("age: %d",29);//age: 29
// 지시자의 순서대로 값이 변환 된다.
System.out.printf("age: %d, year: %d",29,2021);//age: 29age: 29, year: 2021
byte b = 1;
short s = 2;
char c = 'A';
int finger = 10;
long big = 100_000_000_000L;
long hex = 0xFFFF_FFFF_FFFF_FFFFL;
int octNum = 010;
int hexNum = 0x10;
int binNum = 0b10;
System.out.printf("b=%d%n",b);
System.out.printf("s=%d%n",s);
System.out.printf("c=%c, %d %n",c,(int)c);
System.out.printf("finger=[%5d]%n",finger);// 지시자 사이의 양수는 값을 포함한 좌항 공백
System.out.printf("finger=[%-5d]%n", finger);// 지시자 사이의 음수는 값을 포함한 우항 공백
System.out.printf("finger=[%05d]%n",finger);// 지시자 사이의 0으로 시작하는 숫자는 값을 포함한 0추가
System.out.printf("big=%d%n",big);
System.out.printf("hex=%x%n",hex);// long 값이 16진수로 출력
System.out.printf("octNum=%o, %d%n",octNum,octNum);// int 값이 8진수 , 10진수로 출력
System.out.printf("hexNum=%x, %d%n",hexNum,hexNum);// int 값이 16진수 , 10진수로 출력
System.out.printf("binNum=%s, %d%n",Integer.toBinaryString(binNum),binNum);// int 값이 문자열, 10진수로 출력
/**
* b=1
* s=2
* c=A, 65
* finger=[ 10]
* finger=[10 ]
* finger=[00010]
* big=100000000000
* hex=ffffffffffffffff
* octNum=10, 8
* hexNum=10, 16
* binNum=10, 2
*/
}
- 지시자 사이의 실수는 전체자리수.소수점 을 의미한다.
- 정수자리 중 비어 있는 공간은 공백으로 처리되며, 014.10 의 경우 0으로 처리된다.
- 소수점 자리 중 비어있는 공간은 0으로 처리된다.
public static void main(String[] args) {
String url = "www.codechobo.com";
float f1 = .10f;//0.10
float f2 = 1e1f;//1 * 10의 1승 10.0
float f3 = 3.1434f;
double d = 1.23456789;
System.out.printf("f1=%f, %e, %g%n", f1,f1,f1);
System.out.printf("f2=%f, %e, %g%n",f2,f2,f2);
System.out.printf("f3=%f, %e, %g%n",f3,f3,f3);
System.out.printf("d=%f%n",d);
System.out.printf("d=%14.10f%n", d);// 지시자 사이에 있는 소수점은 전체자리.소수점을 의미한다.
System.out.printf("[12345678901234567890]%n");
System.out.printf("[%s]%n",url);
System.out.printf("[%20s]%n",url);// 지시자 사이에 있는 양수는 값을 포함한 좌항공백을 의미한다.
System.out.printf("[%-20s]%n",url);// 지시자 사이에 있는 음수는 값을 포함한 우항공백을 의미한다.
System.out.printf("[%.8s]%n",url);// 지시자 사이에있는 .숫자는 좌항으로부터 8자리를 의미한다.
/*
f1=0.100000, 1.000000e-01, 0.100000
f2=10.000000, 1.000000e+01, 10.0000
f3=3.143400, 3.143400e+00, 3.14340
d=1.234568
d= 1.2345678900
[12345678901234567890]
[www.codechobo.com]
[ www.codechobo.com]
[www.codechobo.com ]
[www.code]
*/
}