출력 메서드, 스캐너 (23.04.18)

·2023년 4월 18일
0

Java

목록 보기
4/35
post-thumbnail

📝 출력 메서드


오늘은 출력 메서드에 대해 알아보자.

💡 출력 메서드 (1)

System.out.print()

: 단순 출력 (출력 후 줄바꿈 X)

System.out.println()

: 한 줄 출력 (출력 후 줄바꿈 수행)

System.out.print()와 System.out.println()의 차이점

		System.out.println("테스트1");
		System.out.println("테스트2");
		
		System.out.print("테스트3");
		System.out.print("테스트4");

위와 같이 코드를 작성할 경우 결과는 이러하다.

System.out.print 메서드를 사용한 테스트3, 테스트4는 줄바꿈이 되어 있지 않은 모습을 확인할 수 있다.

💡 출력 메서드 (2)

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 / 얍 / 배고파요
		

💡 Escape 문자

: 일반 문자가 아닌 특수 문자 표현

		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)

프로그램 실행 중 키보드 입력을 받을 수 있게 하는 역할

✏️ 스캐너 생성

: 프로그램 안에 스캐너라는 기계를 만드는 것

	Scanner sc = new Scanner(System.in);

이렇게만 코드를 작성한다면 오류가 난다. 그 이유는 만들고 싶은 설계도(class)가 없어서 스캐너를 못 만들고 있기 때문이다.
이럴 때는 import 구문을 작성하면 오류가 해결된다.

  • 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의 값을 입력받은 뒤 더한 값을 나타내는 프로그램을 만들 수 있다.

  • [예시 1] 사칙 연산 계산기 만들기
    : 두 실수를 입력받아 사칙 연삭 결과를 모두 출력함
	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번 입력받아 한 줄로 출력하기

  1. (방법 1) 변수 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);
  1. (방법 2) 변수 1개 사용하기 → 누적 효과(변수의 재사용성)
		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);
  • 결과

    방법 1과 2 모두 결과는 같지만 변수의 재사용성으로 인해 방법 2를 사용하는 것을 권장한다.

💡 next()

한 단어 (띄어쓰기, 엔터를 만나면 입력 종료)

💡 nextLine()

한 문장 (엔터를 만나면 입력 종료)

		System.out.print("입력 : "); // hello world
		String str = sc.next();
		String str = sc.nextLine();
		
		System.out.print(str); // next() : hello
							   // nextLine() : hello world

✏️ 스캐너 입력 버퍼와 nextXXX()의 의미

입력 → 입력 버퍼에 저장 → 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() 구문을 한 번 작성하면 (엔터)가 제거됨
	}
}

profile
풀스택 개발자 기록집 📁

0개의 댓글