입력과 출력

|

################## 스트림 ##################

stream : 강, 물이 흐르는 길

자바에서의 스트림 역시 데이터가 흐르는 길을 의미, 프로그램에 입출력되는 데이터의 흐름.

입력 스트림과 출력 스트림이 있음.

문자 스트림(Reader/Writer)과 바이트 스트림(InputStream/OutStream)이 있음.

 

<스트림 사용법>

1. import.java.io.* 를 프로그램 코드의 가장 위에 적는다.

2. 스트림을 연다(스트림 객체를 생성한다)

3. 스트림을 통해 데이터를 흘려보낸다

4. 스트림을 닫는다

 

################## 파일 쓰고 읽기 ##################

자바프로그램에서는 파일을 읽고 쓸 때는 우선 파일을 열고, 파일에 내용을 적거나 읽고, 마지막으로 파일을 닫는 과정을 거친다. 

파일의 내용이 문자열로 되어있으면 '텍스트 파일'

바이트(0,1)로 되어있으면 '바이너리 파일' ex)사진파일, 동영상파일

 

파일쓰기

자바에서는 텍스트 파일을 쓸때 FileWriter 라는 스트림 클래스의 객체를 만들어 사용함. 해당 객체는 파일에 내용을 쓸 때 사용하는 writer() 메소드와 파일을 닫을 때 사용하는 close() 메소드를 가지고 있다.

 

<예시>

FileWriter fw = new FileWriter("a.txt");

  // 문자열로 된 파일(텍스트 파일)을 쓰는 스트림 클래스의 객체를 담는 fw(객체명)라는 변수에 "a.txt"란 파일을 쓰는 FileWriter 클래스의 객체를 새로 생성하여 저장한다

  // "파일명"에 경로없이 이름만 쓰면 이클립스 실행시 저장하는 workspace 폴더에 해당 파일이 저장됨.

  // "파일명"에 이름과 경로를 함께 쓰면 그 경로에 해당 파일이 저장됨.

fw.write("Hello!\n")

  // fw 안의 write() 메소드를 호출하여 내용을 쓴다 Hello! 줄바꿈

fw.close();

  // fw 안의 close() 메소드를 호출하여 파일을 닫는다

파일읽기

자바에서는 텍스트 파일을 읽을때 FileReader 라는 스트림 클래스의 객체를 만들어 사용함. 해당 객체는 파일에 읽을때 사용하는 read() 메소드와 파일을 닫을 때 사용하는 close() 메소드를 가지고 있다.

 

<예시>

FileReader fr = new FileReader("a.txt");

  // 문자열로 된 파일(텍스트 파일)을 쓰는 스트림 클래스의 객체를 담는 fr(객체명)라는 변수에 "a.txt"란 파일을 쓰는 FileReader 클래스의 객체를 새로 생성하여 저장한다

int i;

  // 정수 값을 담는 i라는 변수를 선언한다

while((i=fr.read())!=-1){

  // fr 안의 read() 메소드를 호출하여 파일을 읽고, 그 값을 변수 i에 저장하고 변수 i가 -1이 아닌 동안 {} 안을 반복해라

  // read() 메소드는 읽어 온 문자를 int 형으로 변환하고, 읽어 온 데이터가 없으면 -1을 리턴한다.

  char c = (char)i; 

  // 문자 값을 담는 c라는 변수를 선언하고 변수 i를 문자형으로 변환하여 저장한다.

}

fr.close();

  // fr 안의 close() 메소드를 호출하여 파일을 닫는다

 

################## 키보드로 입력하기 ##################

자바프로그램(앱)이 실행중일 때 키보드로 직접 데이터를 입력받고 싶을 때가 있다. 이때는 Scanner클래스의 객체를 만들어 사용자가 입력한 값을 받도록 사용한다. 해당 객체는 읽어 올 데이터의 타입에 다른 메소드를 따로 사용함. 

 

<Scanner 클래스가 제공하는 메소드>

next()   -> space키로 띄어쓰기하기 전까지 입력된 문자들을 읽어온다.

nextInt()   -> space키로 띄어쓰기하기 전까지 입력된 정수들을 읽어온다.

nextDouble()   -> space키로 띄어쓰기하기 전까지 입력된 실수들을 읽어온다.

nextLine()   -> Enter키로 줄바꿈하기 전까지 입력된 문자들을 읽어온다.

 

<예시>

import java.util.Scanner;

  //java.util.Scanner 패키지의 클래스들을 여기서 사용한다.

Scanner sc = new Scanner(System.in);     

  //입력 클래스의 객체를 담는 sc라는 변수에, 키보드에서 입력받는 Scanner 클래스의 객체를 새로 생성하여 저장한다.

  //System.in -> 사용자가 입력한 값

String s = sc.next();

  //문자열 값을 담는 s라는 변수에 sc 안의 next() 메소드를 호출하여 문자열로 다음 값을 읽어 와서 저장한다.

 

Scanner 클래스를 사용할때 주의점은 java.util.Scanner를 임포트 해야 한다!!(java.io.* -> X)
각 데이터타입에 적합한 메소드를 scan에서 호출한다.
Scanner 클래스 중 숫자를 반환하는 메소드들은 중요한 버그가 있는데
숫자만 읽어오기 때문에 우리의 키보드 입력이 임시적으로 저장되는 버퍼 메모리에서
enter 키를 빼놓고 숫자만 메모리에서 가져오게 된다.
그렇게 되면 enter키가 버퍼 메모리에 남아있고 그 후에 나오는 string에 값을 넣기 위해 nextLine()을 입력하면
버퍼 메모리에 있는 enter키를 보고 입력이 끝났다고 생각해서
우리가 입력을 할수 없게 된다.
이러한 버그를 막으려면 
String 변수명 = scan.nextLine() 을 사용하기 전
어떤 값을 입력하라고 알려주는 출력문 전줄에
scan.nextLine()을 사용해서 
buffer 메모리를 비어준다.


string과 + 가 나오면 2개를 하나의 string으로 이어준다.

 

.hasNextInt()는 입력값이 생기기 전까지 실행을 유보시키는 역할을 한다. 만약 입력한 값이 int 형이 아닐 경우는 false를 리턴하고, int로 표현할 수 있는 형식의 숫자형인 경우는 true를 리턴한다. 

 

################## Scanner vs. BufferedReader ##################

BufferedReaderjava.io 패키지 내에 위치

1. 단순한 구조. BufferedReader의 사용 메소드는 read(int형)와 readLine(String) 두 개가 전부다. 

2. BufferedReader는 String으로 출력하여 원하는 숫자나 문자로 parsing을 해줘야한다.(받아서 일일히 쪼개야 함)

3. BufferedReader는 space bar 혹은 특수문자를 모두 문자열로 입력받아 출력.

 

Scanner java.util 패키지 내에 위치

1. 만능. Scanner는 단순히 읽어들이기만 하는 것이 아니라 parsing과 tokenizing을 할 수가 있다. 그렇기 때문에 지원하는 메소드가 상당히 많다.

2. Scanner는 메소드에 nextInt(), nextDouble(), nextLine()등 각자의 자료형에 따라서 선택해서 할 수 있다.

예들 들어 nexInt() - int형, nextDouble() - double형, next() - String()형 등을 사용하면 된다.

3. Scanner는 토큰을 제어할 수 있다. Scanner는 구분자로 구분지어서 따로 입력받을 수 있다.

 

* 파싱(parsing)이란?

컴퓨터 과학에서 파싱((syntactic) parsing)은 일련의 문자열을 의미있는 토큰(token)으로 분해하고 이들로 이루어진 파스 트리(parse tree)를 만드는 과정을 말한다.

로직을 짜다보면 문자열을 다뤄야 하거나 문자열을 잘라내어 일부만 쓰려는 경우가 많은데 구분자로 문자열을 쪼개는 작업을 파싱(Parsing)이라한다. 

토큰은 전체 문자열을 구분자로 쪼갠 단위이고, 이때 구분되는 문자열 or 문자를 구분자라한다.

 

 

* 토크나이징(tokenizing)이란?

 메소드

설명 

 String nextToken() 

 파싱해서 구한 토큰을 반환 

 String nextToken(String delim) 

 새로운 구분자 delim을 써서 구한 토큰을 반환

 boolean hasMoreTokens() 

 파싱된 문자열이 nextToken()메소드를 실행한 후에 아직 넘겨주지 않은 토큰이 있는지 여부를 반환 

 int countTokens() 

 파싱한 결과로 구한 토큰이 모두 몇 개인지 반환 


################## printf vs. println vs. print ##################

printf : 형식화된 출력.

println : 줄 출력 후 단락바꿈.

print : 단순 출력 후 가만히 있음.

 

################## 형식화된 출력 printf ##################

%bboolean형식으로 출력

%d :  10진 정수의 형식으로 출력. (cf. %5d : 5자리 10진 정수의 형식으로 출력) cf. %x(16진법) 
%f : 부동소수점의 형식으로 출력. (cf. %5.4f : 5자리 중 소수점 4자리의 형식으로 출력)
%c : 문자(character)로 출력.
%s : 문자열(String)로 출력.
공백 표시하기: 줄바꿈 -> \n, 탭 -> \t


printf(" ") 의 " " 안에 필요한 %문자를 넣고
%문자의 data type이 부합하는 변수를 "" 뒤에 , 을 적고 변수명을 적어주면 된다.

 

################## GUI ##################

Graphic User Interface :  시각적으로 어플리케이션을 제어할수 있는 환경.

 

################## 이클립스에서 입력 값 사용하기 ##################

파일을 선택하고 Run Configuration을 선택한다.

Arguments 탭에서 Program Arguments에 입력 값을 작성하면 콘솔에서 입력 값을 전달하는 것처럼 할 수 있다.

'Java' 카테고리의 다른 글

별찍기  (0) 2019.05.17
조건문  (0) 2019.05.17
명명규칙  (0) 2019.05.16
연산자  (0) 2019.05.16
형변환  (0) 2019.05.16
And