[Java] - printf() 메서드를 이용한 출력, Scanner를 통해 사용자로부터 입력 받기

이번 포스팅에선 Java의 printf() 메서드를 이용하여 형식화된 출력, Scanner 클래스를 이용해 사용자로부터 값을 입력받는 부분에 대해 포스팅해 보도록 하겠습니다.
1. 형식화된 출력, printf() 메서드
1-1. 정의와 여러 가지 특징
- 앞서 사용된 println() 메서드와 달리, 사용자가 지정한 데이터의 출력 형식을 지정하여 좀 더 정교하게 데이터를 출력하고자 할 때 사용되는 출력 메서드입니다.
- println() 메서드는 사용하기 편리하나 아래와 같이 출력 형식을 지정할 수 없다는 문제가 있습니다.
(1) 실수의 경우 소수점 자릿수 표현이 불가능하다.
(2) 수의 경우 10진수 체계로만 표현 가능하다.
위의 문제들은, printf() 메서드를 이용해 데이터의 출력 형식을 지정함으로써 해결할 수 있습니다.
- printf() 메서드에서 데이터의 출력 형식을 지정해주는 큰 따옴표("") 내부에 존재하는 기호들을 지시자(Directive)라고 합니다.
1-2. printf() 메서드의 지시자
- 자주 사용되는 printf() 메서드의 지시자는 아래와 같습니다.
| 지시자 | 설명 |
| %b | Boolean 형식으로 출력 |
| %d | 10진(Decimal) 정수의 형식으로 출력 |
| %o | 8진(Octal) 정수의 형식으로 출력 |
| %x | 16진(Hexadecimal) 정수의 형식으로 출력 |
| %f | 부동 소수점(Floating-point) 실수의 형식으로 출력 |
| %c | 문자(Character) 출력 |
| %s | 문자열(String) 출력 |
(1) 지시자의 여러 가지 특징
- 8진수, 16진수에 접두사(0x, 0X)를 붙이는 방법 : 지시지 앞에 #을 포함시켜 작성합니다.
// 10진수 8진수, 16진수 각각 출력
System.out.printf("%d%n", 15); // 15
System.out.printf("%#o%n", 15); // 017
System.out.printf("%#x%n", 15); // 0xf
- 지시자를 대문자의 형태로 작성하는 경우, 데이터의 출력 형태가 대문자로 변합니다.
// 16진수의 경우 지시자가 대문자인 경우 출력도 대문자의 형태를 가집니다.
System.out.printf("%#X%n", 15); // 0XF
- 정수를 2진(Binary) 코드의 문자열 형태로 변환하고 싶은 경우 : Integer.toBinaryString(); 메서드를 사용합니다.
- 문법 : Integer.toBinaryString("2진 데이터로 변환할 정수");
// 10진수를 Binary code로 변환하는 메서드
System.out.printf("%s%n", Integer.toBinaryString(15)); // 1111
- 여러 타입의 지시자를 한 번에 사용할 수 있으며 지시자에 따른 데이터의 개수도 동일해야 합니다.
// 지시자를 여러 개 사용할 경우, 데이터의 개수도 지시자의 개수와 동일해야 한다.
System.out.printf("java is %s %d %c%n", "fun!", 10, 'c'); // java is fun! 10 c
- Java의 경우 줄 바꿈을 해 주는 개행 문자(Escape code)를 "\n" 대신 "%n"을 사용하는 편입니다.
운영체제에 관계없이 개행 문자를 인식하도록 하기 위함입니다.
1-3. printf() 메서드의 정렬 지시자(Sorting directive)
(1) 정의와 여러 가지 특징
- 특정 지시자에 양수를 붙여주면 자리수를 확보하고 오른쪽 정렬, 음수를 붙이면 자리수를 확보하고 왼쪽 정렬이 진행됩니다.
- 만약 지정된 자릿수보다 출력할 값이 더 길다면, 지정된 자릿수는 정렬하고 나머지는 그대로 출력됩니다.
- 자릿수를 지정하는 수에 0을 붙인다면, 정렬로 인해 발생하는 공백자리는 0으로 채웁니다.
- 문법 : %n(지시자의 타입), %-n(지시자의 타입) (단, n은 자연수)
- 10진수 정수를 출력하는 %d 지시자를 예로 들어보겠습니다.
- %nd : n자리를 확보하고 오른쪽 정렬을 시행합니다.
- %-nd : n자리를 확보하고 왼쪽 정렬을 시행합니다.
- %0nd : n자리를 확보하고 오른쪽 정렬 시행, 발생한 공백 자리는 0으로 채웁니다.
// 정수에 정렬 지시자 사용
System.out.printf("[%5d]%n", 100); // [ 100]
System.out.printf("[%-5d]%n", 100); // [100 ]
System.out.printf("[%05d]%n", 100); // [00100]
1-4. printf() 메서드의 실수형 지시자
(1) 정의와 여러 가지 특징
- %f 지시자의 경우 부동 소수점(Floating-point) 형식으로 실수를 출력할 수 있는 지시자입니다.
- 실수형 지시자 %f의 경우 전체 자릿수 뿐만이 아닌 소숫점 특정 자릿수까지 출력하도록 설정 가능합니다.
- 문법 : %n.mf : 전체 n자리를 확보하고(소수점 포함) m자리는 소수점 이하의 수를 출력
- 만약 출력할 데이터보다 표현할 데이터의 범위가 적다면 정수 부분의 공백은 그대로 공백으로 채우고 소수 부분 공백 자리는 0으로 채웁니다.
double f2 = 1.23456789;
System.out.printf("%13.10f%n", f2); // 1.2345678900
- 문법 : %.nf : 소수점 n자리까지만 출력합니다.
(2) float, double 자료형의 정밀도
- float 자료형의 정밀도는 7자리이므로 정수 부분까지 포함한 7자리까지만 정상적으로 출력되고 이후 자리수부터는 의미없는 값이 출력됩니다.
- double 자료형의 정밀도는 정수 부분 포함 15자리까지입니다.
1-5. printf() 메서드의 문자열 지시자
- 정수의 형식을 지정하는 %d 지시자와 동일한 성격을 가집니다.
- %.ns : 전체 문자열에서 n개까지의 문자열만 출력
// 특정 문자열에서도 형식화된 출력이 가능하다.
String str1 = "abcd.defghi";
System.out.printf("[%s]%n", str1); // [abcd.defghi]
System.out.printf("[%20s]%n", str1); // [ abcd.defghi]
System.out.printf("[%.5s]%n", str1); // [abcd.]
2. Scanner를 이용하여 사용자로부터 값 입력 받기
2-1. Scanner의 정의
- 사용자로부터 값을 입력받을 수 있는 기능을 제공하는 클래스를 의미합니다.
2-2. Scanner 사용 방법
(1) import 문으로 Scanner 클래스를 불러옵니다.
- import 문 사용 방법에 대해선 추후 포스팅하도록 하겠습니다.
import java.util.Scanner;
(2) Scanner의 객체를 생성합니다.
- Scanner 클래스로부터 객체를 생성하는 코드입니다.
- System.in은 사용자나 파일로부터 데이터를 입력받는 코드입니다.
- 클래스로부터 객체를 생성하는 방법은 객체지향 파트에서 자세히 포스팅하도록 하겠습니다.
Scanner inputScanner = new Scanner(System.in);
(3) Scanner 객체를 사용합니다.
// 사용자로부터 입력받은 정수를 number1에 저장
int number1 = inputScanner.nextInt();
// 사용자로부터 입력받은 값 출력
System.out.println(number1);
(4) 사용자로부터 한 행 단위로 입력받은 내용을 input 변수에 저장합니다.
- 라인 단위로 입력받는 경우나, 데이터를 여러 개 받을 때, 문자열, 실수 등 다양한 데이터가 섞여있을 때 일부를 나누어 처리를 하는 경우에 사용됩니다.
String input = scanner.nextLine();
이번 포스팅에선 형식화된 출력 기능을 제공하는 printf() 메서드, 메서드의 지시자, Scanner를 통해 사용자로부터 간단한 형태의 데이터를 입력받는 부분을 포스팅해 보았습니다. 다음 포스팅에선 타입 간의 변환 방법에 대해 알아보도록 하겠습니다.
======================================================================
해당 포스팅에 대해 내용 추가가 필요하다고 생각되면 기존 포스팅 내용에 다른 내용이 추가될 수 있습니다.
개인적으로 공부하며 정리한 내용이기에 오타나 틀린 부분이 있을 수 있습니다.
이에 대해 지적해 주시면 감사하겠습니다.