오늘은 출력 메서드에 대해 알아보자.
System.out.print()
: 단순 출력 (출력 후 줄바꿈 X)
System.out.println()
: 한 줄 출력 (출력 후 줄바꿈 수행)
System.out.println("테스트1");
System.out.println("테스트2");
System.out.print("테스트3");
System.out.print("테스트4");
위와 같이 코드를 작성할 경우 결과는 이러하다.
System.out.print 메서드를 사용한 테스트3, 테스트4는 줄바꿈이 되어 있지 않은 모습을 확인할 수 있다.
System.out.printf()
: 출력된 문자열 형식을 패턴으로 지정하는 출력 구문
%d : 정수형, %o : 8진수, %x : 16진수
%c : 문자, %s : 문자열
%f : 실수(소수점 아래 6자리), %e : 지수형태표현, %g : 대입 값 그대로
%A : 16진수 실수
%b : 논리형
%5d : 5칸을 확보하고 오른쪽 정렬
%-5d : 5칸을 확보하고 왼쪽 정렬
%.2f : 소수점 아래 2자리까지만 표시
int iNum1 = 10;
int iNum2 = 5;
System.out.println(iNum1 + " + " + iNum2 + " = " + (iNum1 + iNum2));
// 10 + 5 = 15
// System.out.printf("패턴", 패턴에 들어갈 값);
System.out.printf("%d + %d = %d\n", iNum1, iNum2, iNum1 + iNum2);
// 10 + 10 * 5 / 2 = 35
System.out.println(iNum1 + " + " + iNum1 + " * " + iNum2 + " / 2 = " + (iNum1 + iNum1 * iNum2 / 2));
System.out.printf("%d + %d * %d / 2 = %d\n", iNum1, iNum1, iNum2, (iNum1 + iNum1 * iNum2 / 2));
// 패턴 연습
int iNum3 = 3;
System.out.printf("%d\n", iNum3);
// 3
System.out.printf("%7d\n", iNum3); // 7칸 공간 확보 후 오른쪽 정렬
// 3
System.out.printf("%-7d\n", iNum3); // 7칸 공간 확보 후 왼쪽 정렬
// 3
// 소수점 자리 제어 (반올림 처리)
System.out.printf("%f\n", 10 / 4.0); // 2.500000
System.out.printf("%.2f\n", 10 / 4.0); // 2.50 -> 소수점 둘째자리까지 표기
System.out.printf("%.0f\n", 10 / 4.0); // 3 -> 반올림 처리
// 문자, 문자열, boolean
boolean isTrue = false;
char ch = '얍';
String str = "배고파요"; // String은 참조형(기본 자료형을 뺀 나머지)
// '' : char 리터럴 표기법
// "" : string 리터럴 표기법
System.out.printf("%b / %c / %s\n", isTrue, ch, str);
// false / 얍 / 배고파요
: 일반 문자가 아닌 특수 문자 표현
System.out.println("\\o/"); // 백슬래시 출력 방법
// \o/
System.out.println("a\tb\tc\td"); // tab 출력
// a b c d
System.out.println(" \" "); // 쌍따옴표 단순 문자 출력
// "
System.out.println(" \' "); // 홑따옴표 단순 문자 출력
// '
System.out.println("\u0041"); // 유니코드(16진수) 번호로 출력
// A
프로그램 실행 중 키보드 입력을 받을 수 있게 하는 역할
: 프로그램 안에 스캐너라는 기계를 만드는 것
Scanner sc = new Scanner(System.in);
이렇게만 코드를 작성한다면 오류가 난다. 그 이유는 만들고 싶은 설계도(class)가 없어서 스캐너를 못 만들고 있기 때문이다.
이럴 때는 import 구문을 작성하면 오류가 해결된다.
import java.util.Scanner; // 패키지명 아래에 작성
import 구문을 작성하였으면 스캐너를 다시 만들어 보자.
System.out.print("정수 1 입력 : ");
int input1 = sc.nextInt(); // 입력받은 정수를 input1에 대입
// nextInt() : 다음 입력된 정수를 읽어 옴 (키보드로 입력된 정수를 읽어 옴)
System.out.print("정수 2 입력 : ");
int input2 = sc.nextInt();
System.out.printf("%d + %d = %d", input1, input2, (input1 + input2));
이렇게 하면 아래 사진처럼 정수 1과 2의 값을 입력받은 뒤 더한 값을 나타내는 프로그램을 만들 수 있다.
Scanner sc = new Scanner(System.in);
// 사칙연산 계산기 만들기
// -> 두 실수를 입력받아 사칙연산 결과를 모두 출력
System.out.print("실수 1 입력 : ");
double input1 = sc.nextDouble();
// nextDouble() : 입력받은 다음 실수를 읽어 옴
System.out.print("실수 2 입력 : ");
double input2 = sc.nextDouble();
// Ctrl + alt + 방향키 위 또는 아래 : 라인 복사
System.out.printf("%.2f + %.2f = %.2f\n", input1, input2, input1 + input2);
System.out.printf("%.2f - %.2f = %.2f\n", input1, input2, input1 - input2);
System.out.printf("%.2f * %.2f = %.2f\n", input1, input2, input1 * input2);
System.out.printf("%.2f / %.2f = %.2f\n", input1, input2, input1 / input2);
결과
[예시 2] 문자열을 3번 입력받아 한 줄로 출력하기
Scanner sc = new Scanner(System.in);
System.out.print("입력 1 : ");
String input1 = sc.next();
// next() : 다음 입력된 한 단어를 읽어 옴
System.out.print("입력 2 : ");
String input2 = sc.next();
System.out.print("입력 3 : ");
String input3 = sc.next();
System.out.printf("%s %s %s\n", input1, input2, input3);
Scanner sc = new Scanner(System.in);
System.out.print("입력 1 : ");
String input = sc.next() + " "; // 띄어쓰기 추가
// 안녕_
System.out.println(input);
System.out.print("입력 2 : ");
input = input + sc.next() + " ";
// 안녕_ 반가워_
// 대입 연산자(=) : 오른쪽에 작성된 값을 왼쪽 변수에 대입
System.out.println(input);
System.out.print("입력 3 : ");
input = input + sc.next() + " ";
System.out.println(input);
한 단어 (띄어쓰기, 엔터를 만나면 입력 종료)
한 문장 (엔터를 만나면 입력 종료)
System.out.print("입력 : "); // hello world
String str = sc.next();
String str = sc.nextLine();
System.out.print(str); // next() : hello
// nextLine() : hello world
입력 → 입력 버퍼에 저장 → nextXXX() 통해 버퍼 내용을 읽어 옴
// 입력 버퍼 nextXXX() 후처리
// nextLine() : hello world(엔터) -> hello world(엔터) -> 엔터 제거
// nextInt() : 100(엔터) -> 100
// ** next(), nextDouble(), nextInt() 등
// 모두 입력 버퍼에서 (엔터)를 제외하고 내용만 읽어 옴
System.out.println("----------------------");
System.out.print("nextInt() : "); // 입력 버퍼 : [ 100 (엔터) ]
int a = sc.nextInt();
// 100 // 입력 버퍼 : [ (엔터) ]
// !문제 해결!
sc.nextLine(); // 입력 버퍼 : [ ]
System.out.print("nextLine() : "); // 입력 버퍼 : [ a b c (엔터) ]
String s = sc.nextLine();
System.out.println("종료");
// [문제점]
// nextInt() 이후 입력 버퍼에 남아 있는 (엔터) 때문에
// 다음 nextLine() 수행 시 버퍼에 남아 있는 (엔터)를 읽어 버리기 때문에
// 추가적인 입력을 시도하지 못하고 다음 코드로 넘어가는 문제 발생
// [해결방법]
// 입력을 위한 nextLine() 수행 전
// 입력 버퍼에서 (엔터)를 제거
// -> 빈 공간에 sc.nextLine() 구문을 한 번 작성하면 (엔터)가 제거됨
}
}