printf를 이용한 출력
형식화된 출력
- println()의 단점 - 출력 형식 지정 불가
1. 실수의 자리수 조절 불가 - 소수점 n자리만 출력하려면?
System.out.println(10.0/3); # 3.3333333...
소수점 셋째자리나 넷째자리까지만 출력하고 싶지만, println메서드는 아쉽게도 그러한 기능이 없다.
2. 10진수로만 출력된다. - 8진수, 16진수로 출력하려면?
System.out.println(0x1A); // 26
- printf() 로 출력형식 지정 가능
System.out.printf("%.2f", 10.0/3); // 3.33
"%.2f"는 소수점 둘째자리까지 출력하라는 뜻이다.
System.out.printf("%d", 0x1A); // 26
"%d"는 정수를 10진수로 출력하라는 뜻이다.
System.out.printf("%X", 0x1A); // 1A
"%X"는 16진수로 출력하라는 뜻이다.
출력형식을 정해주는 이 문자열 안에 들어간 %.f나 %d, %X와 같은 것들은 지시자 라고 하는데, 값을 어떻게 출력할지 printf메소드에게 지시해준다는 의미에서 붙은 이름이다.
이외에도 여러가지 지시자가 있어서 다양한 형식으로 값을 출력할 수 있다. 이제부터 하나하나 자세히 알아보자.
Printf()의 지시자 (1/4)
지시자 | 설명 |
%b | 불리언(boolean) 형식으로 출력 |
%d | 10진(decimal) 정수의 형식으로 출력 |
%o | 8진(octal) 정수의 형식으로 출력 |
%x, %X | 16진(hexa-decimal) 정수의 형식으로 출력 |
%f | 부동 소수점(floating-point)의 형식으로 출력 |
%e, %E | 지수(exponent) 표현식의 형식으로 출력 |
%c | 문자(character)로 출력 |
%s | 문자열(string)로 출력 |
자주 사용되는 것 위주로 정리한 표이다. 그외에 다른 지시자는 어떤것이 있는지 확인하고 싶으면, Java api에 Fomatter라는 클래스를 찾아보면 된다.
System.out.printf("age:%d year:%d\n", 14, 2017);
이 문장을 보면, 출력형식을 지정해주는 문자열 안에 지시자가 2개나 들어있다.
이처럼 여러개의 지시자를 한번에 같이 사용할 수 있다. 대신에 값의 개수도 지시자의 개수만큼 적어주어야 한다.
그래서 위의 문장에 2개의 지시자를 사용했기 때문에, 14, 2017 2개를 적어준 것이고, 첫번째 값은, 첫번째 지시자에 들어가고, 두번째 값은 두번째 지시자에 들어간다.
결국,
"age:14 year:2017\n" 이 화면에 출력된다.
이때 \n은 개행문자인데, println()메서드는 항상 줄바꿈을 하지만, printf()메서드는 줄바꿈을 하지 않는다.
그래서 줄바꿈이 필요한 경우에는, printf()메서드의 형식 문자열 안에 \n 개행문자를 넣어주어야 한다.
System.out.printf("age:%d", age); // 출력 후 줄바꿈을 하지 않는다.
System.out.printf("age:%d%n", age); // 출력 후 줄바꿈을 한다.
// 보통, \n이 개행문자인데 os마다 약간의 차이가 있을 수 있다.
%n도 개행문자인데, os에 관계없이 개행문자를 출력하기 때문에,
가능하면 %n을 사용하자.
보통, \n이 개행문자인데 os마다 약간의 차이가 있을 수 있다.
%n도 개행문자인데, os에 관계없이 개행문자를 출력하기 때문에, 가능하면 %n을 사용하자.
Printf()의 지시자 (2/3)
1. 정수를 10진수, 8진수, 16진수로 출력
System.out.printf("%d", 15); // 15 10진수
System.out.printf("%o", 15); // 17 8진수
System.out.printf("%x", 15); // f 16진수
10진수 15는 8진수 17이다. 8진수 17에서 1이 8이기 때문이다.
그리고 10진수 15는 16진수로 f이다.
정수를 10진수로 출력하는 지시자 %d이고, 10진수가 영어로 dicimal이라서 앞글자 d를 사용하는 것이다.
8진수는 영어로 octal이라서 o를 지시자로 사용하고,
16진수는 영어로 hexadecimal이라서 x를 사용한다.
8진수와 16진수는 있는데, 아쉽게도 2진수로 출력하는 지시자는 없다.
System.out.printf("%s", Integer.toBinaryString(15)); // 1111 2진수
그래서, toBinaryString이라는 메서드를 사용해야 한다.
이 메서드는 정수를 2진문자열로 변환해준다. 자주사용하는 메서드는 아니다. 이런게 있다정도로 알아두고, 필요할 때 사용하자.
이 메서드를 사용하는 방법은, 이 메서드 안에 변환하고자 하는 숫자를 넣기만 하면 된다.
10진수 15가 이진수 1111이므로 "1111"인데 문자열로 변환해주므로 문자열을 출력할 때 사용하는 지시자 %s를 사용해야 하며 화면에는 1111이라고 출력된다.
2. 8진수와 16진수에 접두사 붙이기
8진수에는 접두사 0이 붙고, 16진수에는 0x가 붙는다.
근데, 출력될 때는, 접두사는 출력되지 않는다.
만약, 값을 출력할 때, 접두사가 출력되게 하려면, 지시자 앞에 #을 붙히면 된다.
System.out.printf("%#o", 15); //017
System.out.printf("%#x", 15); // 0xf
System.out.printf("%#X", 15); // 0XF
#한줄에 한문장씩 출력
System.out.printf("%#o%n", 15); //017
System.out.printf("%#x%n", 15); // 0xf
System.out.printf("%#X%n", 15); // 0XF
만약 지시자 X를 대문자로 사용하면 출력되는 접두사,값이 모두 대문자로 출력된다.
3. 실수 출력을 위한 지시자 - %f , 지수형식(%e), 간략한 형식 (%g)
실수를 출력할 때는 주로 지시자 f를 쓰고, 지수형식으로 출력할 때는 지시자 e를 사용한다.
실수를 간략하게 출력해주는 지시자 g도 있는데, g는 지시자 f와 지시자 e중에서 더 간략하게 표현할 수 있는 쪽을 선택해서 출력한다.
float f = 123.4567890f;
System.out.printf("%f", f); // 123.456787 소수점아래 6자리
System.out.printf("%e", f); // 1.234568e+02 지수형식
%f 지시자는 기본적으로 소수점 아래 6자리로 출력된다. 후에 지시자에 숫자를 붙히면 원하는 자리에서 잘라서 출력할 수 있다.
근데, 두번째 줄의 출력 결과를 보면, 123.456789가 아니라 123.456787로 출력되었다. 마지막숫자가 비뀌었는데 왜그럴까?
그건 바로, "정밀도" 때문이다. float type의 경우 정밀도가 7자리이다. 그래서 앞에 7자리까지만 값이 정확하고, 나머지 두자리는 정확하지 않다. (이때 자리의 경우 소수점자리수가 아닌 전체 값의 자리수)
즉, 마지막 두자리는 정확하지 않다.(의미없는 숫자들이다.) 어쩌다가 8자리 9자리까지 값이 정확하기 맞는 경우도 있긴하지만, 항상 그런 것은 아니다.
그래서 사실, 변수 f의 타입은 float를 사용하는 것 보다 더 정밀도가 높은 double을 사용하는 것이 더 적합하다.
위의 f는 10자리고, double의 정밀도는 15자리이기 때문이다.
지시자 %e는, 값을 지수형식으로 출력한다.
e+02는 10^2을 의미한다.
f지시자를 이용해서 출력한 f 는 123.456"7"87이고, e지시자를 이용해서 출력한 f는 1.23456"8"e+02로
일곱번째 자리값이 다르다. 그 이유는, 실제 저장된 값은 같은데, e지시자를 이용한 1.234568e+02에서 일곱번째자리의 경우 마지막 자리이기때문에 반올림해서 보여주기 때문이다.
실제 저장된 값이 반올림되는 것은 아니고, 그냥 반올림 해서 보여주는 것이다.
System.out.printf("%g", 123.456789); // 123.457
System.out.printf("%g", 0.00000001 // 1.00000e-8
지시자 %g는 실수를 소수점(.) 포함해서 7자리로 간략히 보여준다.
첫번째 줄이 123.457로 출력된 것도, 원래 마지막자리가 6인데, 반올림해서 7로 출력되었다.
지시자 g는 기본적으로 지시자 f처럼 출력해서 보여주고, 지수형태로 표현하는게 더 간략하다고 판단되면, 지시자 e와 같은 형식으로 출력한다.
실수를 출력할 떄는 기본적으로 지시자 %f를 쓰고,
숫자에 0이 많이 들어가는 경우에는 지시자 %e를 사용해서 지수형태로 출력하면 된다.
Printf()의 지시자 (3/3)
System.out.printf("[%5d]%n", 10); // [ 10]
System.out.printf("[%-5d]%n", 10); // [10 ]
System.out.printf("[%05d]%n", 10); // [00010]
첫번쨰 문장에서는 지시자 앞에 숫자 5가 붙어있으므로 다섯자리가 출력된다. 지정한 자리수는 5자리인데 출력할 값이 2자리 뿐이라 나머지는 공백이 출력된 것이다.
만일, 왼쪽 정렬로 바꿀려면 두번째 줄처럼 지시자앞에 -를 붙이면 된다.
그리고 지시자 앞에 0을 붙이면, 빈 공백 대신에 0으로 채워진다.
System.out.printf("d=%14.10f%n", d); // 전체 14자리 중 소수점 아래 10자리
실수형 지시자 f의 경우에는 전체 자리수 뿐만 아니라, 소수점 아래도 몇자리까지 출력할 것인지 지정할 수 있다.
예를들어 f앞에 14.10이라고 적으면 전체 출력될 자리수는 14자리, 이 14자리에는 소수점도 포함해서 14자리이다.
그리고 소수점아래는 10자리이다.
만일 지정된자리수보다 출력할 값의 자리수가 적으면, 소수점 아래는 빈자리를 0으로 채우고, 정수 앞쪽은 공백으로 채운다.
// [12345678901234567890]
System.out.printf("[%s]%n", url); // [www.codechobo.com]
System.out.printf("[%20s]%n", url); // [ www.codechobo.com]
System.out.printf("[%-20s]%n", url); // [www.codechobo.com ]
System.out.printf("[%.8s]%n", url); // [www.code]
문자열의 경우에는, 지시자 s를 사용하는데, 사용법은 지시자 d와 거의 같다.
지정된 공간보다 출력할 값의 문자수가 적으면 공백으로 채운다. 왼쪽정렬을 하려면 -를 붙인다.
지시자 앞에 문자와 점을 붙이면, 문자열의 일부만 출력할 수 있다.
그래서 네번째 문장이 실행되면, 8자리만출력된다.
'JAVA' 카테고리의 다른 글
정수형의 오버플로 (0) | 2022.03.14 |
---|---|
화면으로부터 입력받기 (0) | 2022.03.13 |
기본형의 종류와 범위 (0) | 2022.03.11 |
기본형과 참조형 (0) | 2022.03.11 |
두 변수 바꾸기 (0) | 2022.03.11 |
댓글
이 글 공유하기
다른 글
-
정수형의 오버플로
정수형의 오버플로
2022.03.14 -
화면으로부터 입력받기
화면으로부터 입력받기
2022.03.13 -
기본형의 종류와 범위
기본형의 종류와 범위
2022.03.11 -
기본형과 참조형
기본형과 참조형
2022.03.11