
실행 중인 프로그램이 로드되어 있는 메모리를 기준으로
데이터가 들어가면 input 나가면 output
이 때 데이터가 input 및 output으로 지나가는 길을 stream이라 함.
표준 입력장치 : 키보드
표준 출력장치 : 모니터(Console)
자바에는 System이라는 클래스가 존재
java API 확인

static은 클래스가 메모리에 load될 때 바로 사용이 가능한 멤버
위에 보이는 err, in, out은 System클래스가 메모리에 load될 때 생성되는 객체이며
위에서 언급한 표준 출력장지(out,err)와 표준 입력장치(in)에 각각 바인딩된다.
그리고 각 객체는 PrintStream과 InputStream으로 참조되는데
PrintStream클래스는 지정된 스트림으로 출력하는 기능을 가진 클래스이며
InputStream은 지정된 스트림으로부터 입력 받는 기능을 가진 클래스의 최상위 인터페이스이다.
여기서 인터페이스는 후에 클래스 파트를 학습해야 이해할 수 있으니 여기서는 넘기도록 한다.
중요한 것은 위 두 개의 클래스로 만들어진 객체가 System클래스 안에 존재한다는 것이다.
앞서 사용하던 println()메서드는 PrintStream클래스에 존재하는 기능이다.
PrintStream클래스의 멤버 API확인(자료형 별로 println()메서드 존재. 다형성)

예제를 하나 실행해 보고 계속하도록 한다.

코드 설명
import java.io.IOException :
IOException을 코드에서 사용하기 위해 import
throws IOException : 자바의 System.in.read()메서드는 사용 시 입출력 예외 처리를 요구한다.
원래 Exception처리는 try~catch 등으로 처리하는데 throws는 예외를 다음에 처리하도록 전가한다.
System.err.println("표준 에러 출력 스트림")
에러의 의미로 표준 출력 장치에 출력하는 기능(이클립스 콘솔에서는 빨갛게 표현 됨.)
int x = System.in.read()
표준 입력장치로부터 1byte를 입력 받아 int자료형으로 반환하는 기능의 메서드
반환된 값을 x변수에 저장하고 있다.(1byte데이터 하나만 입력 받는다.여러 문자 입력 불가)
이 기능이 동작되면 키보드로 입력을 해야 다음으로 진행됨.(입력 받는 기능이니 당연히..)
System.out.println("x = " + x)
키보드로 입력 받아 저장된 x변수의 값을 출력
System.out.println("표준 출력 스트림")
표준 출력 스트림으로 문자열 출력.
실행결과
PrintStream은 출력의 편의를 위해 많은 기능이 추가된 클래스이다.(print(), println(), printf() )
자바는 1byte를 기반으로 입출력이 동작 되며 PrintStream은 2바이트 기반(문자기반) 스트림 클래스이다.
따라서 기본 입출력은 다음 두 메서드를 이용하여 테스트한다.
read() - 1byte 입력
write() - 1byte 출력
1. 기본 출력 - write()
예제)
실행하면 출력내용이 없다.
버퍼에 저장되어 있어 버퍼가 넘치거나 직접 flush()필요
실행결과
배열을 이용하는 write()메서드는 autoflush()동작
실행결과
write메서드는 1바이트 단위로 출력하므로 사용에 불편
Console출력을 편리하게 하기 위해 print(), println()메서드 제공
print()메서드는 인자로 전달받은 데이터를 출력하는 기능이며
println()메서드는 print()와 동일한 동작을 하고 줄을 바꾼다.
그리고 자바 1.5버전부터 C언어에서 사용하던 printf()메서드 제공
printf() 사용 예
print(), println()사용 예
두 예제 모두 실행결과는 다음과 같다.
위의 예제에서 +연산의 특이점을 하나 설명한다.
일반적으로 + 연산자는 덧셈을 수행한다.
단 문자열과 덧셈을 하면 append가 된다.(이어 붙음)
자바에서는 + 연산자를 문자열의 나열 시 사용 할 수 있음.
String s1 = “Hello";
String s2 = “Java”;
System.out.println(s1 + ” “ + s2);
출력결과 : Hello Java
일반 변수에서는 +(덧셈) 연산
int a = 1;
int b = 2;
System.out.println(a + b);
출력결과 : 3
문자열과 일반 값이 +연산되면 아래의 결과를 갖는다.
int a = 1;
int b = 2;
System.out.println(““ + a + b); => 12
System.out.println(““ + a + b * 2); => 14
System.out.println(““ + a + b - 1); => error
문자열은 그 어떤 것과 연산이 되어도 문자열이 된다.
2. 기본 입력 - read()
예제)
System.in.read() 메서드 사용 시 main메서드에 throws IOException 추가(예외 전가)
System클래스의 in객체가 가진 read()메서드는 표준 입력 스트림으로부터 1바이트를 읽어
4바이트의 int형으로 반환하는 기능이다.
즉 1바이트 형태의 문자 하나만 입력이 가능하므로 입력 기능의 제약이 있다.
한 개의 문자를 입력 받는 예제
System.in.read()는 1바이트를 입력 받아 4바이트로 반환하는데
만약 아스키 문자로 받고 싶다면 형 변환 해서 사용하면 된다.
한 개의 숫자를 입력 받고 싶다면 -48을 해주면 된다.(48은 '0'문자의 아스키 코드 값)
'1' 입력하면 49아스키코드 입력. 여기서 48(또는 문자 '0')을 빼면 숫자로 1이 된다.
즉 한 개의 숫자로 아스키 값을 활용하는 것
여러 문자를 입력 받는 예제
실행 결과(실행 후 키보드로 'A' 입력)
키보드로 입력하는 값은 Enter를 입력하면 read()가 읽어 가게 된다.
이 때 Enter역시 아스키 문자 값을 갖고 있어 위 결과가 나오게 된다.
엔터의 아스키 코드 값(두 개의 문자로 엔터가 동작됨)
'\r'(13) : carriage return
'\n'(10) : line feed
따라서 한 문자씩 연속으로 입력 받으려면 다음과 같은 개념이 필요할 수 있다.
엔터 문자('\r', '\n')를 read()메서드가 읽어서 버리도록 한다.(저장 안 함)
그림으로 표현하면 다음과 같다.
A입력 후 엔터를 누르면 입력 버퍼에 남아있던 '\r' '\n' 문자를 두 번 읽어서 버렸으므로
다음 read()메서드가 새로운 문자를 입력 받을 수 있게 된다.
실행결과
위의 read()메서드를 이용하는 방법은 한 개의 문자만 입력 받을 수 있으므로 키보드 입력으로 사용하기에는 부족함이 있다. 예를 들이 123같은 여러 자리의 정수나 실수 및 여러 문자들을 입력 받기에는 부적절하다.
자바는 콘솔 프로그래밍이 주 목적인 언어가 아니다.
그래서 C언어 같은 scanf()메서드는 지원하지 않으며 입력관련 기능을 직접 생성해야 한다.
여러 자리의 숫자나 문자열을 입력 받기 위해서 두 가지 방법을 이용할 수 있겠다.
첫 번째로 java.util.Scanner 클래스를 이용하는 방법(자바 1.5버전에서 추가)
두 번째는 System.in 표준 입력 스트림 객체에 다른 입력 스트림 객체를 조립하여 이용하는 방법
여기서는 두 번째 방법을 이용해 보도록 한다.
다음과 같이 예제를 작성한다.
먼저 import할 클래스
BufferedReader클래스는 입력 스트림에 버퍼기능을 추가하는 클래스이다.
InputStreamReader클래스는 2바이트 기반의 입력 기능의 클래스이다.
작성할 코드
실행 결과
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
설명
System.in 표준 입력 객체를 전달하여 InputStreamReader객체 생성(2byte기반 입력 스트림)
위에서 만든 InputStreamReader를 전달하여 BufferedReader객체 생성(버퍼기능 추가)
BufferedReader 클래스에는 readLine()메서드가 있는데
이 메서드가 \r\n 문자까지를 읽어 String객체 참조를 반환한다.
그냥 문자열만 입력 받는다면 위 예제를 이용하면 되고
만약 여러 자리를 갖는 정수나 실수를 입력 받아야 한다면
위 방법으로 문자열 형태를 입력 받은 후 정수 또는 실수로 변환 해서 사용해야 한다.
예제를 먼저 확인한다.
1. 정수를 입력 받는 예제
실행결과
2. 실수를 입력 받는 예제
실행결과
Wrapper class 라고 하는 기본 자료형을 관리할 수 있는 클래스가 있다.
Integer.parseInt()메서드는 숫자로 이루어진 문자열을 숫자로 변환해 주는 기능을 한다.
Float.parseFloat()메서드 역시 실수형태로 이루어진 문자열을 실수로 변환해주는 기능이다.
위와 같은 방법으로 키보드 입력을 받아 데이터를 사용할 수 있다.
API문서에서 다음 클래스들의 메서드를 한번 읽어보도록 한다.
java.lang 패키지
System -> in, out
nteger -> parseint()
Floar -> parseFloat()
Long -> parseLong()
Double -> parseDouble()
java.io 패키지
InputStream -> read()
PrintStream -> write(), print(), println(), printf()
BufferedReader -> readLine()
'교육자료 > Java' 카테고리의 다른 글
Java 제어문 if와 else (0) | 2017.06.13 |
---|---|
Java 연산자(Operator) (0) | 2017.06.11 |
Java 자료형(Data Type) (0) | 2017.06.07 |
Java 변수와 상수 (0) | 2017.06.07 |
프로그래밍 공부에 필요한 개념1(CPU, Memory, HDD) (0) | 2017.06.02 |