이번 포스팅에선 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를 통해 사용자로부터 간단한 형태의 데이터를 입력받는 부분을 포스팅해 보았습니다. 다음 포스팅에선 타입 간의 변환 방법에 대해 알아보도록 하겠습니다.
======================================================================
해당 포스팅에 대해 내용 추가가 필요하다고 생각되면 기존 포스팅 내용에 다른 내용이 추가될 수 있습니다.
개인적으로 공부하며 정리한 내용이기에 오타나 틀린 부분이 있을 수 있습니다.
이에 대해 지적해 주시면 감사하겠습니다.
'백엔드(Back-End) > Java' 카테고리의 다른 글
[Java] - 조건문(if, if-else, else-if, switch 문), Math.random() 메서드 (0) | 2023.01.10 |
---|---|
[Java] - 연산자(Operator), 반복문(for, while, do-while) (0) | 2023.01.10 |
[Java] - 여러 가지 기본형 타입의 변환 (0) | 2022.09.03 |
[Java] - 문자형, 문자열 자료형의 정의와 여러 가지 특징 (0) | 2022.09.03 |
[Java] - 상수(Constant)와 리터럴(Literal), 리터럴의 접미사(Suffix) (0) | 2022.08.29 |
댓글