06장. 자바의 입출력
06-01. 콘솔 입출력
- 콘솔 출력: 자바 프로그램 실행 후 출력, 사용자에게 문자열을 보여 주는 것
- 콘솔 입력: 출력된 질문에 사용자가 답변을 입력하는 것
- 콘솔: 사용자의 입력을 받거나 사용자에게 문자열을 출력해 주는 역할 통칭
✅ 콘솔 입력
- System.in 사용
import java.io.IOException;
import java.io.InputStream;
public class Sample {
public static void main(String[] args) throws IOException {
InputStream in = System.in; // InputStream의 객체 System.in
int a;
a = in.read(); // read 메서드: int 자료형으로 저장, 아스키코드
System.out.println(a);
}
}
✅ InputStream
- 바이트 단위의 데이터를 읽어들일 때 사용하는 내장 클래스
- 위 👆 코드에서 abc를 입력하면 97(a에 해당하는 값)만 출력됨 -> read 메서드는 1 byte만 읽기 때문
- 입력 스트림: 바이트 단위의 입력된 데이터
(❗️ 스트림이란? ❗️)
- byte의 흐름을 추상화한 개념. byte 단위의 데이터들이 운반되는 통로
- 만약 사용자가 입력한 데이터를 전부 읽고 싶다면(3byte) 어떻게 해야 할까?!
import java.io.IOException;
import java.io.InputStream;
public class Sample {
public static void main(String[] args) throws IOException {
InputStream in = System.in;
byte[] a = new byte[3]; // 길이가 3byte인 배열을 만듦
in.read(a);
System.out.println(a[0]);
System.out.println(a[1]);
System.out.println(a[2]);
}
}
✅ InputStreamReader
- 문자로 입력 스트림을 읽을 때 사용
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader; // Import문 추가
public class Sample {
public static void main(String[] args) throws IOException {
InputStream in = System.in;
InputStreamReader reader = new InputStreamReader(in); // 생성자 입력으로 객체 생성
char[] a = new char[3]; // char 배열 사용
reader.read(a);
System.out.println(a);
}
}
/* abc (입력)
abc (출력) */
✅ BufferedReader
- 길이에 사용없이 사용자가 입력한 값을 모두 받아들일 때 사용
import java.io.IOException;
import java.io.BufferedReader; // import문 추가
import java.io.InputStream;
import java.io.InputStreamReader;
public class Sample {
public static void main(String[] args) throws IOException {
InputStream in = System.in;
InputStreamReader reader = new InputStreamReader(in);
BufferedReader br = new BufferedReader(reader); // 생성자 입력으로 객체 생성
String a = br.readLine();
System.out.println(a);
}
}
/* Hello World (입력)
Hello World (출력) */
✅ Scanner
- Scanner 클래스를 사용하면 콘솔 입력을 더 쉽게 처리 가능!!
import java.util.Scanner; // import문 추가
public class Sample {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); // System.in 객체 <- InputStream 필요
System.out.println(sc.next());
}
}
- Scanner 클래스의 메서드
메서드 | 의미 |
next() | 토큰을 읽어 들임 ※ 토큰: 정보의 최소 단위, 문법적 의미가 있는 문자열(단어, 숫자, 기호...) |
nextLine() | 라인을 읽어 들임 |
nextInt() | 정수를 읽어 들임 |
✅ 콘솔 출력
- PrintStream: 콘솔에 값을 출력할 때 사용되는 클래스
- System.out: PrintStream 클래스의 객체
- System.err: 오류 메시지 출력
06-02. 파일 입출력
✅ 파일 쓰기
import java.io.FileOutputStream;
import java.io.IOException;
public class Sample {
public static void main(String[] args) throws IOException {
FileOutputStream output = new FileOutputStream("c:/out.txt"); // 생성자의 입력으로 파일명을 넘겨주어 객체 생성
output.close(); // 사용한 파일 객체 닫기 (생략 가능)
}
}// c:/ 디렉토리 밑에 out.txt 생성
✅ FileOutputStream
- 파일에 내용 입력할 때 사용
import java.io.FileOutputStream;
import java.io.IOException;
public class Sample {
public static void main(String[] args) throws IOException {
FileOutputStream output = new FileOutputStream("c:/out.txt");
for(int i=1; i<11; i++) {
String data = i+" 번째 줄입니다.\r\n";
output.write(data.getBytes()); // String을 byte 배열로 바꿔주는 getBytes() 메서드 사용
}
output.close();
}
}
✅ FileWriter
- 파일에 문자열을 입력할 때 byte 배열 대신 문자열을 사용할 수 있음
import java.io.FileWriter;
import java.io.IOException;
public class Sample {
public static void main(String[] args) throws IOException {
FileWriter fw = new FileWriter("c:/out.txt");
for(int i=1; i<11; i++) {
String data = i+" 번째 줄입니다.\r\n";
fw.write(data);
}
fw.close();
}
}
✅ PrintWriter
- println 메서드를 통해 문자열을 보다 간편하게 쓸 수 있음
import java.io.IOException;
import java.io.PrintWriter;
public class Sample {
public static void main(String[] args) throws IOException {
PrintWriter pw = new PrintWriter("c:/out.txt");
for(int i=1; i<11; i++) {
String data = i+" 번째 줄입니다.";
pw.println(data);
}
pw.close();
}
}
- System.out.println은 콘솔로 데이터를 출력했지만, PrintWriter는 콘솔 대신 파일로 출력함
✅ 파일에 내용 추가하기
- FileWriter를 이용해 이미 작성된 파일을 추가 모드로 열기
import java.io.FileWriter;
import java.io.IOException;
public class Sample {
public static void main(String[] args) throws IOException {
FileWriter fw = new FileWriter("c:/out.txt");
for(int i=1; i<11; i++) {
String data = i+" 번째 줄입니다.\r\n";
fw.write(data);
}
fw.close();
FileWriter fw2 = new FileWriter("c:/out.txt", true); // 추가 모드로 파일 열기
for(int i=11; i<21; i++) {
String data = i+" 번째 줄입니다.\r\n";
fw2.write(data);
}
fw2.close();
}
}
- 두 번째 파라미터 값이 true -> 추가 모드로 파일 열기. 파라미터 생략 시 디폴트값은 false
- 추가 모드로 열면 기존 파일에 내용을 덮어쓰는 게 아니라 이어쓰게 됨
✅ 파일 읽기
- FileInputStream 클래스 이용
import java.io.FileInputStream;
import java.io.IOException;
public class Sample {
public static void main(String[] args) throws IOException {
byte[] b = new byte[1024]; //byte배열을 이용하여 파일을 읽어야 함
FileInputStream input = new FileInputStream("c:/out.txt");
input.read(b);
System.out.println(new String(b)); // byte 배열을 문자열로 변경하여 출력
input.close();
}
}
- FileReader, BufferedReader 조합을 사용하면 한 줄 단위로 파일 읽기 가능
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class Sample {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("c:/out.txt"));
while(true) {
String line = br.readLine();
if (line==null) break; // 더 이상 읽을 라인이 없을 경우 while 문을 빠져나감
System.out.println(line); // readLine 메서드가 더 이상 읽을 라인이 없을 경우 null 리턴
}
br.close();
}
}
객관식 문제
Q1. Java에서 표준 출력에 사용되는 클래스는 무엇인가요?
A1. B) System
Q2. System.out.println()에서 println의 역할은 무엇인가요?
A2. B) 화면에 내용을 출력한다.
Q3. Java의 입출력 클래스 중 버퍼를 사용하여 효율적인 입출력을 제공하는 클래스는 무엇인가요?
A3. B) BufferedReader
Q4. 파일에 텍스트를 쓰기 위해 가장 많이 사용되는 클래스는?
A4. B) FileWriter
Q5. Java의 Scanner 클래스는 어떤 패키지에 속해 있나요?
A5. B) java.util
Q6. 다음 중 System.out.println()에서 out의 역할은 무엇인가요?
A6. B) 표준 출력 스트림
Q7. 파일에서 데이터를 읽어오는 대표적인 클래스는 무엇인가요?
A7. A) FileReader
Q8. java의 BufferedWriter 클래스는 어떤 기능을 제공하나요?
A8. D) 텍스트를 버퍼에 쓰고 출력 성능을 향상시킨다.
Q9. InputStream 클래스의 역할은 무엇인가요?
A9. B) 데이터를 입력받는다.
Q10. FileReader와 FileWriter의 차이점은 무엇인가요?
A10. B) FileReader는 파일을 읽고, FileWriter는 데이터를 파일에 쓴다.
코딩테스트 문제
1. #13241
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); // Scanner 객체 생성
long num1 = sc.nextLong(); // long 타입의 정수 입력 후 변수 저장
long num2 = sc.nextLong();
long gcd = getGCD(Math.max(num1, num2), Math.min(num1, num2)); // getGCD 메서드 호출
System.out.println((num1*num2)/gcd); // 최소공배수 출력
}
public static long getGCD(long a, long b) { //getGCD 메서드 정의
while(b > 0) {
long tmp = a;
a = b;
b = tmp%b;
}
return a; // 최대공약수 리턴
}
}
2. #25305
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt(); // 학생 수와 상 받는 사람 수 변수 저장
int k = sc.nextInt();
int[] scores = new int[N]; // 학생들 점수 저장할 배열 생성
for (int i = 0; i < N; i++) {
scores[i] = sc.nextInt(); // 점수 입력받기
}
Arrays.sort(scores); // 점수 정렬 (내림차순)
System.out.println(scores[N - k]); // k번째 큰 점수 출력
sc.close();
}
}
'WINK-(Web & App) > JAVA 스터디' 카테고리의 다른 글
[2024-2 Java 스터디] 김태일 #5주차 "자바의 입출력" (0) | 2024.11.14 |
---|---|
[2024-2 Java 스터디] 강보경 #5주차 (0) | 2024.11.14 |
[2024-2 Java 스터디] 김민서 #5주차 (1) | 2024.11.13 |
[2024-2 Java 스터디] 김재승 #5주차 (0) | 2024.11.12 |
[2024-2 Java 스터디] 김재승 #4주차 (2) | 2024.11.11 |