1. printf() - 다른 형식으로 출력하기
지금까지 화면에 출력할 때 'println()'을 써왔는데, 'println()'은 사용하기엔 편하지만, 값을 변환하지 않고는 다른 형식으로 출력할 수 없다.
같은 값이라도 다른 형식으로 출력하고 싶을 때, 'printf()'를 사용하면 된다.
int age = 14;
System.out.printf("age:%d", age);
System.out.printf("age:%d", 14);
System.out.printf("age:14"); // "age:14"가 화면에 출력된다.
만일 출력하는 값이 2개라면, 지시자도 2개를 사용해야 하며 출력될 값과 지시자의 순서는 일치해야 한다. 3개 이상의 값도 출력할 수 있으며 개수의 제한은 없다.
System.out.printf("age:%d year:%d", age, year)
System.out.printf("age:%d year:%d", 14, 2017) // "age:14 year:2017"이 화면에 출력된다.
println()과 달리 printf()는 출력 후 줄 바꿈을 하지 않는다. 줄바꿈을 하려면 지시자 '%n'을 따로 넣어줘야 한다.
System.out.printf("age:%d", age); // 출력 후 줄바꿈을 하지 않는다.
System.out.printf("age:%d%n", age); // 출력 후 줄바꿈을 한다.
printf()의 지시자 중 자주 사용하는 지시자는 아래와 같다.
지시자 | 설명 |
%b | 불리언(boolean) 형식으로 출력 |
%d | 10진(decinmal) 정수의 형식으로 출력 |
%o | 8진(octal) 정수의 형식으로 출력 |
%x, %X | 16진(hexa-decimal) 정수의 형식으로 출력 |
%f | 부동 소수점(floating-point)의 형식으로 출력 |
%e, %E | 지수(exponent) 표현식의 형식으로 출력 |
%c | 문자(character)로 출력 |
%s | 문자열(string)로 출력 |
출력 값 지정하기
값을 출력할 때 출력될 값이 차지할 공간을 숫자로 지정할 수 있다.
int finger = 10;
System.out.printf("finger = [%5d]%n", finger); // finger = [ 10]
System.out.printf("finger = [%-5d]%n", finger); // finger = [10 ]
System.out.printf("finger = [%05d]%n", finger); // finger = [00010]
String url = "yermi.works"; // 지시자 '%s'에도 활용 가능
System.out.printf("[%s]%n", url); // 문자열의 길이만큼 출력공간을 확보
System.out.printf("[%20s]%n", url); // 최소 20글자 출력공간 확보(우측정렬)
System.out.printf("[%-20s]%n", url); // 최소 20글자 출력공간 확보(좌측정렬)
System.out.printf("[%.8s]%n", url); // 왼쪽에서 8글자만 출력
지시자 '%x'와 '%o'에 #을 사용하면 접두사 '0x'와 '0'이 각각 붙는다.
* '%X'는 16진수에 사용되는 접두사와 영문자를 대문자로 출력한다.
long hex = 0xFFFF_FFFF_FFFF_FFFFL;
System.out.printf("hex = %x%n", hex); // hex = ffffffffffffffff
System.out.printf("hex = %#x%n", hex); // hex = 0xffffffffffffffff
System.out.printf("hex = %#X%n", hex); // hex = 0XFFFFFFFFFFFFFFFF
10진수를 2진수로 출력해주는 지시자는 없기 때문에 정수를 2진 문자열로 변환해주는 'Ingegier.toBinaryString(int i)'를 사용해야 한다. 이 메서드는 정수를 2진수로 변환해서 문자열로 반환하므로 지시자 '%s'를 사용한다.
int binNum - 0b10;
System.out.printf("binNum=%s%n", Integer.toBinaryString(binNum)); // binNum = 10
char 타입은 int 타입으로 형변환해야만 '%d'로 출력할 수 있다.
char c = 'A';
System.out.printf("c=%c, %d %n", c, (int)c); // c = 'A', 65 << 형변환이 꼭 필요하다.
소수점 출력하기
실수형 값의 출력에 사용되는 지시자는 '%f', '%e', '%g'가 있는데 주로 사용되는 건 '%f'이다. '%f'는 기본적으로 소수점 아래 6자리까지 출력하기에 소수점 아래 7자리에서 반올림한다.
전체 자리수와 소수점 아래의 자릿수도 지정할 수 있다.
* 소수점도 한 자리를 차지하며, 소수점 아래의 빈자리는 0으로 채우고 정수의 빈자리는 공백으로 채워서 전체 자릿수를 맞춘다.
% 전체 자리 . 소수점 아래 자리 f
System.out.printf("d=%14.10f%n", d); // 전체 14자리 중 소수점 아래 10자리
- 예제 PrintEx1.java
public class PrintEx1 {
public static void main(String[] args) {
byte b = 1;
short s = 2;
char c = 'A';
int finger = 10;
long big = 100_000_000_000L; // long big = 100000000000L;
long hex = 0xFFFF_FFFF_FFFF_FFFFL ;
int octNum = 010; // 8진수 10, 10진수로는 8
int hexNum = 0x10; // 16진수 10, 10진수로는 16
int binNum = 0b10; // 2진수 10, 10진수로는 2
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);
System.out.printf("big=%d%n", big);
System.out.printf("hex=%#x%n", hex);
System.out.printf("octNum=%o, %d%n", octNum, octNum);
System.out.printf("hexNum=%x, %d%n", hexNum, hexNum);
System.out.printf("binNum=%s, %d%n", Integer.toBinaryString(binNum), binNum);
String str = "12345678901234567890";
System.out.printf("[%s]%n", str);
System.out.printf("[%30s]%n", str);
System.out.printf("[%-30s]%n", str);
System.out.printf("[%.5s]%n", str);
}
}
참고문헌 : 남궁성(2016), Java의 정석, 도우출판