형식화된 출력 - printf()
println()의 단점 - 출력형식 지정불가
지금까지는 화면에 값을 출력할 때 println 메서드를 사용해왔다. 이 메서드에는 한가지 단점이 있다. 그것은 값을 출력할 때 출력형식을 지정할 수 없다는 것이다.
① 실수의 자리수 조절불가 - 소수점 n자리만 출력하려면?
System.out.println(10.0/3); // 3.333333333...
예를 들어서 10.0 나누기 3을 했을 때, 계산 결과가 이처럼 실수 일 때 println() 메서드는 결과를 3.333333333...과 같이 길게 출력한다. 소숫점 셋째 자리나 넷째 자리까지만 출력하면 좋겠는데 println() 메서드는 아쉽게도 그런 기능이 없다.
② 10진수로만 출력된다. - 8진수, 16진수로 출력하려면?
Sytem.out.println(0x1A); // 26
println() 메소드의 또다른 단점은 모든 정수를 10진수로만 출력한다는 것이다. 만약 16진수 값인 1A를 println() 메서드로 출력하면 1A가 출력되는 것이 아니라 10진수로 변환되어 26이 출력된다.
▶ printf()로 출력형식 지정가능
System.out.printf("%.2f", 10.0/3); // 3.33
앞으로 배우게 될 printf() 메서드는 위에서처럼 값이 출력되는 형식을 지정할 수 있다. 위 형식의 의미는 실수를 소수점 둘째자리까지만 출력하라는 뜻이다.
System.out.printf("%d", 0x1A); // 26
System.out.printf("%x", 0x1A); //1A
%d는 정수를 10진수로 %x는 16진수로 출력하라는 뜻이다. 출력형식을 적어주는 이 문자열 안에 들어간 %f, %d, %x와 같은 것들은 지시자라고한다. 값을 어떻게 출력할지 printf() 메서드에게 지시해준다라는 의미에서 붙은 이름이다. 이 외에도 다양한 지시자가 있어 다양한 값으로 출력할 수 있다.
printf()의 지시자(1/3)
지시자 | 설명 |
%b | 불리언(boolean) 형식으로 출력 |
%d | 10진(decimal) 정수의 형식으로 출력 |
%o | 8진(octal)정수의 형식으로 출력 |
%x, %X | 16진(hexa-decimal) 정수의 형식으로 출력 |
%f | 부동 소수점(floating-point)의 형식으로 출력 |
%e, %E | 지수(exponent) 표현식의 형식으로 출력 |
%c | 문자(character)로 출력 |
%s | 문자열(string)로 출력 |
이 표는 printf() 메소드에 사용할 수 있는 지시자 목록이다. 이 외에도 더 많은 지시자가 있지만 일단은 자주 사용되는 것부터 보도록 한다. %d, %o, %x는 정수로 출력할 때 사용하고 %f, %e는 실수를 출력할 때 사용한다. %c는 문자를 %s는 문자열을 출력할 때 사용한다.
이 외 지시자를 확인하려면 Java API 문서에 가서 Formatter라는 클래스를 찾아보면 된다. printf() 메서드에 사용할 수 있는 모든 지시자들이 나오는데 꽤 많다.
System.out.printf("age:%d year:%d\n", 14, 2017);
위 문장을 보면 출력 형식을 지정해주는 문자열 안에 지시자가 두개 있다. 이처럼 여러개의 지시자를 한번에 같이 사용할 수 있다. 대신 값의 갯수도 지시자의 갯수만큼 잡아줘야한다. 그래서 위 문장에서 두개의 값을 잡아준 것이다. 첫번째 값은 첫번째 지시자에 들어가고 두번째 값은 두번째 지시자에 들어간다. 결국 아래와 같은 문자열이 출력된다.
"age:14 year:2017\n"
\n은 개행문자라고한다. 이 문자의 역할은 줄바꿈을 해주는 것이다. println() 메서드는 출력한 다음 항상 줄바꿈을 하지만 printf 메서드는 줄바꿈을 하지 않는다. 그래서 줄바꿈이 필요한 경우에는 printf() 메서드의 형식 문자열 안에 개행문자를 넣어주어야 한다.
System.out.printf("age:%d", age); // 출력 후 줄바꿈을 하지 않는다.
System.out.printf("age:%d%n", age); // 출력 후 줄바꿈을 한다.
대부분의 경우 \n이 개행문자이긴 한데 OS마다 개행문자가 다를 수 있다. 그래서 \n이나 %n은 같은 개행문자이다. %n은 OS에 관계없이 개행문자를 출력할 수 있기 때문에 이 둘중에 어느 것을 사용해도 좋지만 가능하면 \n 대신에 %n을 사용하는것이 좋다.
printf()의 지시자(2/3)
① 정수를 10진수, 8진수, 16진수로 출력
System.out.printf("%d", 15); // 15 10진수
System.out.printf("%o", 15); // 17 8진수
System.out.printf("%x", 15); // f 16진수
System.out.printf("%s", Integer.toBinaryString(15)); // 1111 2진수
println() 메서드와 달리 printf()메서드를 사용하면 10진수 뿐만 아니라 8진수와 16진수로 출력할 수 있다. 위 문장들을 보면 10진수 15를 8진수와 15진수로 출력한다. 10진수 15가 8진수로는 17(일칠)이다. 십칠이 아니라 일칠이라고 읽는 이유는 8진수에서는 이 1(일)이 10(십)이 아니라 8이기 때문이다. 그리고 10진수 15는 16진수로 f다. 정수를 10진수로 출력하는 지시자는 d이고 10진수가 영어로 decimal number이기 때문에 앞글자 d를 사용한다. 8진수는 영어로 octical number라서 o를 쓰고 16진수는 영어로 hexa decimal이라서 x를 사용한다. 8진수와 16진수는 있지만 아쉽게도 2진수로 표현하는 지시자는 없다. 그래서 정수를 2진수로 변환해주는 toBinaryString() 이라는 메서드를 사용해주어야한다. 이 메서드는 정수를 2진 문자열로 변환해준다. 자주 쓰는 메서드는 아니므로 그냥 이런 메서드가 있다는 것만 알고 있다가 필요할때 쓰면 된다. 이 메서드를 사용하는 방법은 이 메서드 괄호 안에 변환하고자 하는 숫자를 넣기만 하면 된다. 숫자 15를 넣으면 문자열 1111을 결과로 얻는다. 10진수 15가 2진수로 1111이다. 그래서 문자열을 출력할 때 사용하는 지시자 s를 사용해야하는 것이고 s는 String의 앞글자를 딴 것이다.
② 8진수와 16진수에 접두사 붙이기
System.out.printf("%#o", 15); // 017
System.out.printf("%#x", 15); // 0xf
System.out.printf("%#X", 15); // 0XF
8진수와 16진수에는 접두사가 붙는데 8진수의 접두사는 0이고 16진수의 접두사는 0x이다. 값이 출력될때는 접두사가 출력되지 않는다. System.out.printf("%x", 15); 를 실행하면 f가 출력되는데 원래는 접두사 0x가 붙어야 한다. 값을 출력할 때 접두사도 같이 출력되게 하려면 지시자 앞에 #d을 붙이면 된다. 그러면 위와 같이 접두사가 붙어서 출력된다. 지시자 X를 대문자로 쓰면 접두사와 F 모두 대문자로 출력된다.
③ 실수 출력을 위한 지시자 %f - 지수형식(%e), 간략한 형식(%g)
float f = 123.4567890f;
System.out.printf("%f", f); // 123.456787 소수점 아래 6자리
System.out.printf("%e", f); // 1.234568e+02 지수형식
System.out.printf("%g", 123.456789); // 123.457
System.out.printf("%g". 0.00000001); // 1.00000e-8
실수를 출력할 때는 주로 지시자 f를 쓰고 지수형식으로 출력할때는 지시자e를 쓴다. 실수를 간략하게 출력해주는 지시자 g도 있는데 이 지시자는 지시자 f와 지시자 e 중에서 더 간략하게 표현할 수 있는 쪽을 선택해서 출력한다. 예를 들어서 변수 f에 123.4567890이라는 값을 저장한 다음에 지시자 f를 출력하면 소수점 아래 6자리까지 출력된다. 기본적으로는 소수점 아래 6자리까지만 출력되지만 지시자에 숫자를 붙히면 원하는 자리에서 잘라서 출력할 수 있다. 출력결과를 잘 보면 마지막 자리에 9가 아닌 7이 출력되었다. 그 이유는 정밀도 때문이다. float 타입인 경우에는 정밀도가 7자리이다. 그래서 앞에 7자리까지만 값이 정확하고 나머지 두자리는 정확하지 않다. 즉 의미없는 숫자들이다. 8자리나 9자리까지 맞는 경우도 있는데 항상 그렇지는 않다. 사실 변수 f의 타입은 float보다 더 정밀도가 높은 double을 사용하는 것이 더 적합하다. 위 숫자는 10자리이고 double의 정밀도는 15자리이기 때문이다.
지시자 e는 값을 지수형식으로 출력한다. e+02는 10의 제곱을 의미한다. 지시자 f로 출력했을때와 지시자 e로 출력했을때 값이 다르다. 지시자 f로 출력했을때는 소수점 4자리가 7이고 지시자 e로 출력했을때는 8이다. 값이 달라지는 이유는 실제로 저장된 값을 같은데 마지막 값이 반올림 되어서 보여주기 때문이다. 실제 저장된 값이 반올림되는 것은 아니고 그냥 반올림해서 보여주는 것이다.
지시자 g는 실수를 소수점 포함해서 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자리가 출력된다.(공백 3자리)
만일 왼쪽 정렬로 바꾸려면 지시자 앞에 -를 붙혀주면 된다.
지시자 앞에 0을 붙히면 빈자리 공백 대신에 0으로 채운다.
실수형 지시자 f의 경우에는 전체자리수 뿐만 아니라 소수점 아래 몇번째 자리까지 출력할 것인지 지정할 수 있다.
%전체자리.소수점아래자리f
System.out.printf("d=%14.10f%n", d); // 전체 14자리 중 소수점 아래 10자리
전체 출력수는 14자리가 되고 이 14자리에는 소수점도 포함이다. 그리고 소수점 아래는 10자리가 된다. 만약 지정된 자리수보다 출력할 값의 자리수가 적으면 소수점 아래는 빈자리는 0을 채우고 정수 앞쪽은 공백으로 채운다. 문자열의 경우 지시자 s를 사용하는데 사용법은 지시자 d와 같다.
// [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] // 전체 8글자만 출력하라는 뜻
문자열의 경우에는 지시자 s를 사용한다. 사용법은 지시자 d와 같다. 지정된 공간보다 출력할 값의 문자수가 적으면 공백으로 채운다. 왼쪽정렬로 바꿀때는 마이너스(-)를 붙힌다. 지시자 앞에 숫자와 점(.)을 붙히면 문자열의 일부만 출력할 수 있다. 예를 들어 .8이면 8자리만 출력하라는 뜻이다.
출처 :
'Language > Java' 카테고리의 다른 글
[Java] 정수형의 오버플로우 (0) | 2023.01.25 |
---|---|
[Java] 화면에서 입력받기 - Scanner (0) | 2023.01.24 |
[Java] 변수 기본형의 종류와 범위 (0) | 2023.01.19 |
[Java] 기본형과 참조형 (0) | 2023.01.17 |
[Java] 두 변수의 값 바꾸기 (0) | 2023.01.11 |
댓글