9. 콘솔 입출력

Isaiah IM·2023년 2월 13일
0

java basic

목록 보기
10/38
post-thumbnail

콘솔 입출력(Console I/O)란 지금까지 사용했던 콘솔화면에서 입출력을 하는 것을 말한다.

1. Console Output

console output이란 우리가 기존에 주로 사용했던 System.out.println()과 같은 출력을 하는 기능이다.

1.1 System.out.println() 제약사항

기존까지는 System.out.println()System.out.print()만을 사용해서 출력을 했을 것이다. 그러나, 이 함수들은 값을 특정한 형식으로 변환해서 출력할 수 없다는 제약사항이 있었다.
예를 들어 보자.

다음은 앞에서 학습했던 3. 상수와 형 변환 의 내용 중 일부 코드이다.

public class literal {
	public static void main(String[] args) {
		long num=1_234_567_890L;// 1,234,567,890
		int bin=0B0101;// 2진수
		int octa=023;// 8진수
		int hex=0xf2;// 16진수
		
		/*값 출력*/
		System.out.println(num);
		System.out.println(bin);
		System.out.println(octa);
		System.out.println(hex);
	}
	
}

output

1234567890
5
19
242

위와 같이 System.out.println()을 사용할 경우 별도의 변환 없이는 값을 2진수, 8진수, 16진수로 표현을 할 수 없다는 제약사항이 있다.

1.2 System.out.printf()

이러한 제약사항을 보완하기 위해서는 System.oput.printf()을 사용하는 방법이 있다.

이때, System.out.printf()는 다음과 같은 형식으로 사용한다.

System.out.printf("문자열, 지시자", 값); 형식으로 작성하며,
System.out.printf("value: %d", value);와 같이 사용한다.

1.3 지시사

지시자란 표현할 데이터의 형식을 지정하는 것으로 다음과 같은 지시자가 있다.

이를 기반으로 위의 코드를 System.out.printf()를 이용해 각 진법에 맞게 출력하면 다음과 같다.

public class literal {
	public static void main(String[] args) {
		long num=1_234_567_890L;// 1,234,567,890
		int bin=0B0101;// 2진수
		int octa=023;// 8진수
		int hex=0xf2;// 16진수
		
		/*값 출력*/
		System.out.printf("decimal: %d\n", num);
		System.out.printf("binary: %s\n", Integer.toBinaryString(bin) );
		System.out.printf("octa: %o\n", octa);
		System.out.printf("hexa: %x\n", hex);
	}
	
}

output

decimal: 1234567890
binary: 101
octa: 23
hexa: f2

이때, 2진수로 출력하는 지시자는 없기 때문에 Integer.toBinaryString(bin)을 이용해 2진수 문자열로 변환해서 출력할 수 있다.

또한, 다음 코드와 같이 지시사 앞에 숫자를 붙여 출력값의 자릿수 및 차지하는 공간을 조절할 수 있다.

public class literal {
	public static void main(String[] args) {
		int num=100;
		
		/*값 출력*/
		System.out.printf("value: [%5d]\n", num);
		System.out.printf("value: [%05d]\n", num);
		System.out.printf("value: [%-5d]\n", num);
	}
}

output:

value: [  100]
value: [00100]
value: [100  ]

다만, 아래와 같이 변수의 값이 자릿수 보다 큰 경우에는 적용되지 않는다.

public class literal {
	public static void main(String[] args) {
		int num=1234567;
		
		/*값 출력*/
		System.out.printf("value: [%5d]\n", num);
		System.out.printf("value: [%05d]\n", num);
		System.out.printf("value: [%-5d]\n", num);
	}
}

output

value: [1234567]
value: [1234567]
value: [1234567]

또한, 출력에서 0xff와 같이 진수 역시 표현하고자 할 경우 아래와 같이 %#x처럼 #을 붙이면 된다.

public class literal {
	public static void main(String[] args) {
		long num=1_234_567_890L;// 1,234,567,890
		int octa=023;// 8진수
		int hex=0xf2;// 16진수
		
		/*값 출력*/
		System.out.printf("decimal: %d\n", num);
		System.out.printf("octa: %#o\n", octa);
		System.out.printf("hexa: %#x\n", hex);
	
	}
}

output

decimal: 1234567890
octa: 023
hexa: 0xf2

또한, 실수의 경우 아래와 같이 %전체자리.소숫점자리f와 같은 형태로 나타낼 수 있다.

public class Q1 {
	public static void main(String[] args) {
		double num=12345.123456789;
		
		/*값 출력*/
		System.out.printf("%5.2f\n", num);
		System.out.printf("%5.3f\n", num);
		System.out.printf("%5.5f\n", num);
		System.out.printf("%5.10f\n", num);
		System.out.printf("%5.15f\n", num);
	}
}

output

12345.12
12345.123
12345.12346
12345.1234567890
12345.123456789000000

2. Console Input

Console Input이란 기존의 출력 뿐 아닌, 사용자가 직접 console에 값을 입력하는 것을 의미하며, Scanner()를 사용한다.

Console 화면에서 입력을 받기 위해서는 Scanner class를 사용해야 한다. 이에 대해서는 추후에 조금 더 자세히 다룰 예정이므로, 지금은 이해보다는 "이런 것이 있다" 정도로 알고 사용하도록 하자.

먼저, console에 입력을 받기 위한 Scanner class를 사용하기 위해서는 코드의 가장 상단부분에 import java.util.*;을 작성해야 한다.

그 다음으로 아래와 같이 Scanner 클래스의 객체를 생성해야 한다.

Scanner 이름 = new Scanner(System.in);

그 다음으로 아래와 같이 이름.nextLine();을 사용하면 엔터를 입력하기 전 까지의 값을 문자열 형태로 반환을 한다.

String str=이름.nextLine();

만약, 입력받은 수가 정수라면 Integer.parseInt(str);형태를, 입력받은 수가 실수라면 Float.parseFloat(str);형태로 변환을 한다.

지금까지의 내용을 코드로 작성하면 다음과 같다.

import java.util.*;

public class scanner {
	public static void main(String[] args) {
		String str;
		float data;
		
		Scanner input = new Scanner(System.in);
		
		System.out.print("input> ");		
		str=input.nextLine();
		
		data=Float.parseFloat(str);
		
		System.out.println("original: "+ str);
		System.out.println("float: "+ data);
	}
}

output

input> 123.45
original: 123.45
float: 123.45

그러나, parseInt()parseFloat()를 사용하지 않고 입력을 받을때 아래와 같이 input.nextInt() 혹은 input.nextFloat() 를 사용하면 별도의 변환을 하지 않아도 자동으로 변환이 되기 때문에 편리하나, 연속적인 값을 입력 받을 경우 사용하기 복잡하다는 단점이 있다.

import java.util.*;

public class scanner {
	public static void main(String[] args) {
		float data;
		
		Scanner input = new Scanner(System.in);
		
		System.out.print("input> ");		
		data=input.nextFloat();
		
		System.out.println("float: "+ data);
	}
}

output

input> 123.45
float: 123.45

3. Mini Project

지금까지 배운 내용들을 바탕으로 간단한 게임을 만들어보자.
만들어볼 게임은 다음과 같다.

  • up & down 게임

up & down 게임은 사용자가 컴퓨터가 생성한 임의의 숫자를 맞추는 간단한 게임이다.
게임의 규칙은 다음과 같다.
1. 게임이 실행되면 컴퓨터는 0부터 100 사이의 랜덤한 정수값을 생성한다. 이때, 랜덤값 생성은 (int)(Math.random()*100)을 이용해 생성한다.
2. 사용자가 입력할 차례에는 input> 을 출력한다.
3. 만약 컴퓨터가 생성한 숫자가 사용자가 입력한 수 보다 큰 경우 up을 출력한다.
4. 만약 컴퓨터가 생성한 숫자가 사용자가 입력한 수 보다 작은 경우 down을 출력한다.
5. 만약 컴퓨터가 생성한 숫자와 사용자가 입력한 수와 일치할 경우 correct!을 출력하고, 다음줄에 사용자가 총 입력한 숫자의 횟수를 출력한다.

예제 입력

50
25
12
17
20
22
24

예제 출력

input>
down
input>
down
input>
up
input>
up
input>
up
input>
up
input>
correct!
count: 7

게임 실행 모습(전체 입출력)

input> 50
down
input> 25
down
input> 12
up
input> 17
up
input> 20
up
input> 22
up
input> 24
correct!
count: 7

A. up & down 게임

게임의 플로우는 다음과 같다.

  1. 사용자 입력을 받을 수 있도록 Scanner를 선언한다.
  2. 1부터 100 사이의 숫자를 랜덤으로 생성한다.
  3. 사용자의 입력을 받는다.
  4. 입력받은 횟수를 1 증가시킨다.
  5. 만약 입력받은 숫자가 랜덤으로 생성된 숫자보다 크다면 down을 출력한다.
  6. 만약 입력받은 숫자가 랜덤으로 생성된 숫자보다 작다면 up을 출력한다.
  7. 순서 3부터 6까지를 입력받은 숫자와 랜덤으로 생성된 숫자가 같을 때 까지 반복한다.
  8. 만약 입력받은 숫자와 랜덤으로 생성된 숫자가 같을 경우 correct를 출력하고 입력받은 횟수를 출력하고 종료한다.

이때, while반복문을 사용해 3번부터 6번까지 반복할 수 있도록 하고, 만약 입력받은 숫자와 랜덤으로 생성된 숫자가 같을경우 break;를 사용해 루프를 탈출하는 형식으로 작성할 수 있다.

이를 기반으로 코드를 작성하면 다음과 같다.

code

package upDown1;

import java.util.*;

public class UpDown1 {
	public static void main(String[] args) {
		final int randomNum;
		int userNum;
		int inputCnt=0;
		
        /*순서 1번*/
		Scanner input = new Scanner(System.in);
		
		/*random number generate(순서 2번)*/
		randomNum=(int)(Math.random()*100);
		
		while(true) {// 순서 7번
			/*input user number(순서 3번)*/
			System.out.print("input> ");
			userNum=input.nextInt();
			inputCnt++;// 순서 4번
			
			if(userNum<randomNum)// random number is bigger than user number(순서 5번)
				System.out.println("up");
			else if(userNum>randomNum)// random number is lower than user number(순서 6번)
				System.out.println("down");
			else{ // random number and user number is equal(순서 8번)
				System.out.println("correct!");
				break;
			}
		}
		
		System.out.println("count: "+ inputCnt);
	}
}

위 주소에서 code를 다운로드 받아 eclipse로 직접 정답 확인이 가능하다.
https://github.com/isaiahIM/java_basic/tree/main/console%20IO

profile
나는 생각한다. 고로 나는 코딩한다.

0개의 댓글