본문 바로가기

WINK-(Web & App)/JAVA 스터디

[2024-2 Java 스터디] 강보경 #5주차

반응형

콘솔 입출력

콘솔 입력: 출력된 질문에 사용자가 답변을 입력하는 것

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]);
    }
}
반응형