본문 바로가기
백엔드(Back-End)/Java

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

by TwoJun 2022. 10. 5.

[Programming Language] - Java

이번 포스팅에선 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를 통해 사용자로부터 간단한 형태의 데이터를 입력받는 부분을 포스팅해 보았습니다. 다음 포스팅에선 타입 간의 변환 방법에 대해 알아보도록 하겠습니다.

 

 

======================================================================

해당 포스팅에 대해 내용 추가가 필요하다고 생각되면 기존 포스팅 내용에 다른 내용이 추가될 수 있습니다.

개인적으로 공부하며 정리한 내용이기에 오타나 틀린 부분이 있을 수 있습니다.

이에 대해 지적해 주시면 감사하겠습니다.

댓글