콘솔 입출력
콘솔 입력: 출력된 질문에 사용자가 답변을 입력하는 것
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;
int a;
a = in.read();
System.out.println(a);
}
}
- InputStream
자바의 내장 클래스으로 import해서 사용
InputStream의 read 메서드는 1byte만 읽는다(int 자료형으로 저장, 아스키코드값). 그래서 뭘 많이 써도 하나만 읽음
그렇담 3byte를 입력했을 때 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];
in.read(a);
System.out.println(a[0]);
System.out.println(a[1]);
System.out.println(a[2]);
}
}
길이가 3byte인 배열을 만들고 read 메서드의 입력값으로 전달하면 된다!
- InputStreamReader
아스키코드값 말고 문잣값 그대로를 보고싶음... 이럴 때엔 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); // 생성자 입력으로 InputStream 객체 필요
char[] a = new char[3]; // byte 말고 char 배열 사용
reader.read(a);
System.out.println(a);
}
}
이제 입력한 문자열이 그대로 출력된다!
- BufferedReader
흠 이제는 길이에 상관없이 입력값을 모두 받아들이고 싶음... 이때에는 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); // 생성자 입력으로 InputStreamReader 사용
String a = br.readLine(); // readLine 메서드로 문자열 전부를 읽삼!
System.out.println(a);
}
}
문자열이 전부 출력되었다~!
- Scanner
import java.util.Scanner;
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: 정수를 읽어 들일 수 있다
콘솔 출력: 사용자에게 문자열을 보여주는 것
System.out.println : 콘솔에 문자열을 출력할 때나 디버깅할 때 사용
System.err : 오류 메시지를 출력할 때 사용
파일 입출력
파일 쓰기
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 클래스를 사용해서 파일을 생성할 수 있음
이것은 객체를 생성할 때 생성자의 입력으로 파일명을 넘겨준다
- 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());
}
output.close();
}
}
이것도 byte 단위로 데이터를 처리하기 때문에 String을 byte로 바꿔주는 getBytes() 메서드를 이용했다
- FileWriter
String을 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
근데 아직도 불편함 왜냐면 줄바꿈 문자를 계속 덧붙여야하기 때문에... 그럴 때엔 PrintWriter을 사용하자
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();
}
}
println으로 해결했다!
(System.out 대신 PrintWriter 객체를 사용한 차이점만 있고 출력값은 같음)
- 파일에 내용 추가
이미 작성된 파일을 추가 모드로 열어서 추가할 내용 작성
추가 모드는 기존 파일에 내용을 덮어쓰지 않고 이어 쓰게 됨
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();
}
}
fw2 객체는 두 번째 파라미터를 추가로 전달해서 생성 -> boolean 값이 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];
FileInputStream input = new FileInputStream("c:/out.txt");
input.read(b);
System.out.println(new String(b)); // byte 배열을 문자열로 변경하여 출력
input.close();
}
}
음? 이러면 byte 배열로 파일 읽어야돼서 데이터 길이를 모를 때에는 너무 불편함...
파일을 한 줄 단위로 읽어보자!
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")); // 더 이상 읽을 라인이 없을 경우 null 리턴
while(true) {
String line = br.readLine();
if (line==null) break; // 더 이상 읽을 라인이 없을 경우 while 문을 빠져나간다.
System.out.println(line);
}
br.close();
}
}
FileReader와 BufferedReader의 조합으로 해결 완.
QUIZ
1. Java에서 표준 출력에 사용되는 클래스는 무엇인가요?
- B) System
2. System.out.println()에서 println의 역할은 무엇인가요?
- B) 화면에 내용을 출력한다.
3. Java의 입출력 클래스 중 버퍼를 사용하여 효율적인 입출력을 제공하는 클래스는 무엇인가요?
- B) BufferedReader
4. 파일에 텍스트를 쓰기 위해 가장 많이 사용되는 클래스는?
- B) FileWriter
5. Java의 Scanner 클래스는 어떤 패키지에 속해 있나요?
- B) java.util
6. 다음 중 System.out.println()에서 out의 역할은 무엇인가요?
- B) 표준 출력 스트림
7. 파일에서 데이터를 읽어오는 대표적인 클래스는 무엇인가요?
- A) FileReader
8. Java의 BufferedWriter 클래스는 어떤 기능을 제공하나요?
- D) 텍스트를 버퍼에 쓰고 출력 기능을 향상시킨다.
9. InputStream 클래스의 역할은 무엇인가요?
- B) 데이터를 입력받는다.
10. FileReader와 FileWriter의 차이점은 무엇인가요?
- B) FileReader는 파일을 읽고, FileWriter는 데이터를 파일에 쓴다.
코딩테스트
# 13241
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long A = sc.nextLong();
long B = sc.nextLong();
sc.close();
System.out.println(lcm(A, B));
}
// 최소공배수 계산
public static long lcm(long a, long b) {
return a * (b / gcd(a, b));
}
// 최대공약수 계산
public static long gcd(long a, long b) {
while (b != 0) {
long temp = b;
b = a % b;
a = temp;
}
return a;
}
}
# 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();
}
sc.close();
Arrays.sort(scores);
System.out.println(scores[N - k]);
}
}
'WINK-(Web & App) > JAVA 스터디' 카테고리의 다른 글
[2024-2 Java 스터디] 김지수 #5주차 (0) | 2024.11.14 |
---|---|
[2024-2 Java 스터디] 김태일 #5주차 "자바의 입출력" (0) | 2024.11.14 |
[2024-2 Java 스터디] 김지나 #5주차 "6장" (0) | 2024.11.14 |
[2024-2 Java 스터디] 김민서 #5주차 (1) | 2024.11.13 |
[2024-2 Java 스터디] 김재승 #5주차 (0) | 2024.11.12 |