SHUSTORY

15-2 표준 입출력 본문

프로그래밍/JAVA

15-2 표준 입출력

어서오시우 2023. 3. 21. 11:36
728x90

표준 입출력

자바에서는 화면에 출력하고 입력받는 표준 입출력 클래스를 미리 정의해 두었다.

이 클래스는 프로그램이 시작될 때 생성되므로 따로 만들 필요가 없다.

우리가 지금까지 화면 출력을 위해 사용한 System.out은 표준 출력을 위한 객체이다.

 

표준 입출력은 콘솔 화면에 입출력되기 때문에 콘솔 입출력이라고도 한다.

표준 입출력을 위한 System 클래스는 다음과 같이 세 개의 변수를 가지고 있다.

자료형 변수 이름 설명
static PrintStream out 표준 출력 스트림
static InputStream in 표준 입력 스트림
static OutputStream err 표준 오류 출력 스트림

* 자료형에 사용한 PrintStream은 OutputStream의 하위 클래스이다.

 

System.out은 표준 출력용, System.in은 표준 입력용 스트림이다.

빨간색으로 오류 메시지를 출력할 때는 System.err를 사용한다.

out, in, err 모두 정적( static ) 변수이기 때문에 지금까지 우리가 System 클래스를 생성하지 않고도 System.out을 사용할 수 있었다.

 

 

System.in으로 화면에서 문자 입력받기

System.in을 사용하여 문자를 입력받는 프로그램을 구현해보자.

입출력에 관련한 코드를 구현하면 예외 처리를 해야 한다.

 

예제01_문자 하나를 입력받기

 

i는 4바이트지만 System.in은 바이트 단위로 읽어 들이는 InputStream이므로 1바이트만 읽는다.

읽어 들인 1바이트를 출력하면 문자에 대한 숫자 값, 즉 아스키 값을 출력한다.

14행과 같이 문자로 변환하여 출력하면 입력한 A가 출력된다.

읽어 들일 때 사용한 InputStream의 read( ) 메서드는 한 바이트만을 읽어 들인다.

 

알파벳 여러 개를 쓰고 엔터( \n )를 눌러 입력받는 예제를 살펴보자.

 

예제02_문자 여러 개를 입력받기

 

while문에서 read( ) 메서드를 이용해 한 바이트씩 읽어 들인다.

Enter에 해당하는 '\n' 값이 입력될 때까지 반복 수행되며, 해당 값이 입력되면 읽어 들인 내용을 화면에 출력한다.

 

 

그 외 입력 클래스

Scanner 클래스

Scanner 클래스는 java.util 패키지에 있는 입력 클래스로, 문자뿐 아니라 정수, 실수 등 다른 자료형도 읽을 수 있다.

또한 콘솔 화면뿐 아니라 파일이나 문자열을 생성자의 매개변수로 받아 자료를 읽어 올 수 있다.

생성자 설명
Scanner( File source ) 파일을 매개변수로 받아 Scanner를 생성한다.
Scanner( InputStream source ) 바이트 스트림을 매개변수로 받아 Scanner를 생성한다.
Scanner( String source ) String을 매개변수로 받아 Scanner를 생성한다.

Scanner scanner = new Scanner( System.in )처럼 사용하면 표준 입력으로부터 자료를 읽어 들이는 기능을 사용할 수 있다. Scanner 클래스는 System.in으로 입력받는 것보다 다양한 메서드를 활용할 수 있기 때문에 자주 사용하는 클래스이다.

메서드 설명
boolean nextBoolean( ) boolean 자료를 읽는다.
byte nextByte( ) 한 바이트 자료를 읽는다.
short nextShort( ) short 자료형을 읽는다.
int nextInt( ) int 자료형을 읽는다.
long nextLong( ) long 자료형을 읽는다.
float nextFloat( ) float 자료형을 읽는다.
double nextDouble( ) double 자료형을 읽는다.
String nextLine( ) 문자열 String을 읽는다.

Scanner 클래스를 활용하여 표준 입력에서 다양한 자료를 읽어 온 후 출력하는 예제를 살펴보자.

 

예제03_Scanner 테스트하기

 

7행에서 표준 입력을 매개변수로 Scanner 클래스를 생성하였다.

이름과 직업은 문자열이므로 nextLine( ) 메서드로 입력받고, 사번은 정수이므로 nextInt( ) 메서드를 사용한다.

표준 입력 System.in을 사용하면 바이트 단위 자료만 처리할 수 있어 한글 같은 경우 보조 스트림을 추가로 사용해야 하는데, Scanner는 다양한 자료형을 입력할 수 있어 많이 활용한다.

 

Console 클래스

System.in을 사용하지 않고 간단히 콘솔 내용을 읽을 수 있는 Console 클래스도 있다.

직접 콘솔 창에서 자료를 입력받을 때 이 클래스를 사용하는데, 이클립스와는 연동되지 않는다.

사용하는 메서드는 다음과 같다.

메서드 설명
String readLine( ) 문자열을 읽는다.
char[ ] readPassword( ) 사용자에게 문자열을 보여 주지 않고 읽는다.
Reader reader( ) Reader 클래스를 반환한다.
PrintWriter writer( ) PrintWriter 클래스를 반환한다.

Console 클래스를 활용하여 직접 명령 프롬프트 창에서 자료를 입력받는 실습을 해보자.

 

예제04_Console 테스트하기

 

이 예제를 실행하기 위해 명령 프롬프트 창을 띄우고 프로젝트 폴더로 이동한다.

 

그런데 문제가 발생했다.

PATH 변수값을 변경해주어야 한다고 한다..

제어판 - 시스템 - 고급 시스템 설정 - 환경변수 - PATH - 새로 만들기 - JAVA JDK 설치 경로 복사하기

- 환경 변수에 경로 붙여넣고 확인 - 환경 변수 확인 - cmd 재실행 후 명령어 실행

 

ㅠㅠ위와 같이 했는데도 안 된다..

cmd를 관리자 권한으로 실행해도 왜 안 되는거지.. 남들은 잘만 되는데..

어떻게든 해내보겠음..

 

대박!! 드디어 성공했다.. 이게 뭐라고 이렇게 뿌듯한지 ㅋㅋ

짜잔~~~

jdk 경로 복사 후 아까 환경 변수에 들어가서 시스템 변수의 새로 만들기를 클릭 -

변수 이름을 JAVA_HOME 입력 - 시스템 변수의 Path - 편집 - 새로 만들기 - %JAVA_HOME%\bin 입력 -

위로 이동 클릭해 가장 위로 올리기

 

이렇게 하면 드디어 정상적으로 작동된다 ㅎㅎ

그럼 프로젝트를 실행해보겠다! ( 행복.. )

 

아제발..왜 또 프로젝트 실행이 안되는건데...

일단 약속이 있어서.. 빨리 준비하고 돌아오겠음..ㅠ

 

cmd 실행

우와 ㅠㅠㅠ진짜..진짜진짜...cmd 에러로만 한시간은 쓴 것 같다..

해냈어요!!! ㅎㅎ

분명 위와 같이 작성했는데도 아까는 Error: Could not find or load main class가 뜨는거임 그래서 어케했냐면

일단 참고로 한글 깨짐 현상이 있어서 뒤에 -encoding UTF-8도 써주고

 

다시 한번 환경 변수 들어가 준다.. 그리고 아까는 PATH 변수만 손봤었다.

근데 이제 CLASSPATH 변수도 손봐줍니다.

그리고 참고로 JAVA_HOME 변수에 jdk 위치도 넣어줬었음

그래서 CLASSPATH 변수에는 %JAVA_HOME%\lib;.를 적어준다.

뒤에 ;.를 붙여주는거 필수!! 처음에 들어가보면 뒤에 ;.가 붙어있지 않아 있는데 그렇기 때문에

디렉토리 자체 내에서 해당 클래스를 찾으려고 하기 때문에 오류( 메인 클래스를 찾을 수 없다는 )가 발생한 것이다.

수정 후 기존에 설정해준 디렉토리 뿐만 아니라 현재 디렉토리에서도 해당 클래스를 찾기 때문에 오류가 해결된다.

 

비록 오래 걸리긴 했지만 결국 해결해서 기분이 너므 좋으네요 ^ㅡㅡㅡ^

 

그래서 본론으로 돌아가자면.. readLine( ) 메서드를 사용해 이름과 직업을 문자열로 입력받고 readPassword( ) 메서드를 사용해 비밀번호를 char[ ] 배열로 입력받는다. 

Console 클래스에서는 Scanner와 마찬가지로 한글도 읽을 수 있다.

다만 이클립스 같은 통합 개발 환경에서는 Console 클래스가 연동되지 않는 경우가 있어 Scanner 클래스를 더 많이 사용한다.

'프로그래밍 > JAVA' 카테고리의 다른 글

15-4 문자 단위 스트림  (0) 2023.04.04
15-3 바이트 단위 스트림  (0) 2023.03.21
15-1 자바 입출력과 스트림  (0) 2023.03.21
14-4 사용자 정의 예외  (0) 2023.03.17
14-3 예외 처리 미루기  (0) 2023.03.17