입력은 물론이고 출력에 대한 자세한 부분을 알아보자.
콘솔입력은 키보드입력을 받는것을 말한다.
콘솔 출력
콘솔 출력은 우리가 자주 쓰는데 3가지 정도가 있다.
System.out.println(); - 출력 + 엔터(공백)
System.out.print(); - 출력
System.out.printf(); - 서식문자를 통한 출력이 가능(포맷을 지정한 출력)
System.out.print(String.format());도 System.out.printf()와 같다.
printf는 C언어로 입문한 사람들이라면 익숙할만한 그런 것이다. 여기서 서식문자는 %d, %o 등등을 말한다. 자주 쓰이는 서식문자는
서식문자 | 뜻 | |
정수 | %d | 10진수 |
%o | 8진수 | |
%x | 16진수 | |
실수 | %f | 실수(f를 붙이면 float, 아니면 double) |
문자 | %c | 문자 |
%s | 문자열(String) | |
기타 | %% | % 출력 |
정도가 있다. 여기서 서식문자를 이용하는데 사용되는 줄맞춤과 공백맞춤을 알아보면
오른쪽 정렬 - %5d면 다섯 개의 공간을 확보하고 오른쪽 정렬로 출력한다.
왼쪽 정렬 - %-5d면 다섯 개의 공간을 확보하고 왼쪽 정렬로 출력한다.
(%05d와 같이 중간에 0을 넣으면 다섯 개의 공간 중 채워지지 않은 부분이 공백이 아닌 0으로 채워진다.)
소숫점 자릿수 - %.2f하면 두 번째 자리까지 나온다. (뒤에껄 반올림해서 결과가 출력된다.)
** 실수는 소수점까지 자릿수로 치기 때문에 08.24를 출력하고 싶으면 0과 .을 포함하여 5자리가 필요하므로 %05.2f라고 해줘야한다. **
** System.err : System.out과 유사하지만 Error 메시지를 출력할 때 사용한다. **
콘솔 입력(System.in)
여러가지 방법이 가능하지만 주로 Scanner를 사용한 방법이 쓰인다. 나머지는 어떤 형태인지 알아만 두자.
1. System.in.read() -
character값 하나를 받아올 수 있다. 입력후 엔터키를 누를 경우 엔터키까지 포함되서 데이터를 읽어오는데 System.in.read()는 입력스트림에서 하나만 가져올 수 있기 때문에 엔터값이 입력스트림에 남는다. 그래서 그 부분을 소진해서 없애줘야한다. System.in.read(new byte[System.in.available()]);을 위에서 read를 한번 사용한 후에 이걸 써주면 입력스트림에 남아있는 개수만큼 바이트형태로 읽어서 데이터를 소진시켜준다. 입력스트림 비워준다는 뜻)
2. InputStreamReader -
InputStreamReader는 객체를 만들어줄 때 System.in을 매개변수로 넣어줘야한다. 이 방법은 여러개의 데이터를 받아올 수 있는데 그걸 받아오기 위한 배열이 필요하다. 그리고 이걸 reader.read(배열)로 데이터를 읽어온다. 그럼 배열에 데이터가 들어가고 그걸 출력해주면 된다. 받고싶은 데이터 길이는 배열을 통해 조절해주면 된다.
3. BufferedReader -
이 방법은 원하는 개수만큼 데이터를 읽어들일 수 있다. 매개변수로 new InputStreamReader(System.in)이 들어간다. 그리고 데이터를 읽을때는 String에 readLine()해주면 된다.
4. Scanner -
주로 Scanner를 사용한다. Scanner도 마찬가지로 매개변수에 System.in을 넣어줘야한다. Scanner는 엔터가 입력되기 전까지의 내용을 읽어온다.
Scanner sc = new Scanner(System.in)같이 사용한다.
sc.next()하면 데이터를 하나 받아올 수 있고, 그 뒤에 sc.nextLine() 입력된 엔터키가 사라진다.
sc.nextInt()하면 숫자값이 아닌 것이 받아지면 에러가 발생한다.
sc.nextLine()를 처음부터 쓰면 한줄을 죄다 받아온다.(가장 자주 쓰이는 방법인 듯)
Scanner의 next로는 char 하나를 받아올 수 없기에 charAt()을 이용해서 받아온다.
char c1 = new Scanner(System.in).next().charAt(0);같이 쓴다. 0은 몇번째 인덱스의 문자를 가져올건지를 뜻한다.
예를 들어, "qwerty"를 입력하고 charAt(3)이라면 c1에는 'r'이 들어간다.
** 정수와 문자열의 변환 **
정수와 문자열간의 변환을 빈번하게 사용하는데
int num = Integer.parseInt("123");이면 문자열을 정수로 변환해준다.
int num = Integer.parseInt("1101", 2); 이면 이진 문자열을 정수로 변환해준다.(2가 radix)
String str = Integer.toString(12345); 이면 정수를 문자열로 변환해준다.
파일 출력
파일출력은 FileOutputStream, FileWriter, PrintWriter의 방법이 있다.
1. FileWriter -
FileWriter 객체를 만들어주고 안에는 어떤 파일을 쓸건지를 써준다.(위 경우 현재 폴더의 memo.txt를 만들라는 뜻이다. 원래 해당 이름의 파일이 있는 경우 덮어쓰기한다). 파일열기 이후에는 항상 fw.close()가 들어가줘야한다.
파일 덮어쓰기나 새로 만들기가 아닌 원래 있던것에서 이어쓰기를 하고싶은 경우
FileWriter pw = new FileWriter("./memo.txt", true)를 쓰면 된다.
2. PrintWriter -
객체는 FileWriter와 마찬가지의 방식으로 만들어준다. close도 동일한데, write이 아닌 println으로 파일에 쓴다. 그래서 Filewriter처럼 별도로 엔터키를 위한 \n을 쓰지 않아도 된다.
이어쓰기 하고싶은 경우 매개변수 안에 FileWriter를 넣어주면 된다.
PrintWriter pw = new PrintWriter(new FileWriter("./memo.txt", true));같이 사용한다.
파일 입력
파일입력은 FileInputStream, BufferedReader의 방법이 있다.
BufferedReader(주로쓰임, 콘솔입력도 가능한 방법) -
콘솔(키보드)로 데이터를 입력받을 때도 썼던 건데 그때는 매개변수로 System.in을 넣어줬지만 이번에는 파일로 받는것이기 때문에 new FileReader("./memo.txt")같이 어떤 파일로부터 데이터를 읽어들일지 써주면 된다.
파일로부터 데이터를 한줄씩 읽어들일 때는 br.readLine()해주면 된다. 여러줄은 반복문을 이용해주면 된다.
없는 파일을 열러고 할 경우 에러가 발생한다.