콘솔 입출력(Console I/O)란 지금까지 사용했던 콘솔화면에서 입출력을 하는 것을 말한다.
console output
이란 우리가 기존에 주로 사용했던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진수로 표현을 할 수 없다는 제약사항이 있다.
이러한 제약사항을 보완하기 위해서는 System.oput.printf()
을 사용하는 방법이 있다.
이때, System.out.printf()
는 다음과 같은 형식으로 사용한다.
System.out.printf("문자열, 지시자", 값);
형식으로 작성하며,
System.out.printf("value: %d", value);
와 같이 사용한다.
지시자란 표현할 데이터의 형식을 지정하는 것으로 다음과 같은 지시자가 있다.
이를 기반으로 위의 코드를 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
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
지금까지 배운 내용들을 바탕으로 간단한 게임을 만들어보자.
만들어볼 게임은 다음과 같다.
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
게임의 플로우는 다음과 같다.
Scanner
를 선언한다.down
을 출력한다.up
을 출력한다.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