[Java 필수 문법] 6. 입출력

2025. 2. 17. 22:49·Java

1️⃣ 입력

1. Scanner 클래스

📌 특징

  • java.util.Scanner를 사용하여 편리하게 입력을 받을 수 있음
  • 공백과 개행을 기준으로 값을 쉽게 분리 가능
  • System.in을 사용하므로 입력 속도가 느림 (큰 입력에는 비효율적)

📌 장단점

장점

  • 사용법이 간단함
  • 정수, 실수, 문자열 등 다양한 타입 지원

단점

  • 입력 속도가 느림
  • nextLine() 사용 시 개행 문제 발생 가능

📌 주요 메서드

메서드 설명
nextInt() 정수 입력
nextLong() long 입력
nextDouble() 실수 입력
next() 공백 기준으로 문자열 입력
nextLine() 한 줄 입력
hasNext() 입력이 남아 있는지 확인

📌 예제

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int a = sc.nextInt();
        double b = sc.nextDouble();
        sc.nextLine(); // 개행 문자 제거
        String s = sc.nextLine();

        System.out.println("입력: " + a + ", " + b + ", " + s);
    }
}

⚠️ 주의할 점

  • nextInt(), nextDouble() 등을 사용한 후 nextLine()을 호출할 경우, 개행 문자 문제가 발생할 수 있음 → sc.nextLine()을 한 번 호출하여 개행 문자 제거
  • Scanner는 내부적으로 System.in을 닫으므로 명시적으로 close()를 호출하지 않아도 동작 가능
  • 하지만 File을 읽을 때는 close()를 호출해야 자원 해제됨.

 

2. BufferedReader + InputStreamReader

📌 특징

  • System.in을 버퍼를 통해 읽어들여 속도가 매우 빠름
  • readLine()을 사용해 한 줄 단위로 입력을 받음
  • 기본적으로 문자열(String) 로 입력받기 때문에, 숫자로 변환이 필요함

📌 장단점

장점

  • 입력 속도가 빠름
  • 대량의 입력 처리에 유리

단점

  • 입력값을 직접 파싱해야 함
  • readLine()은 문자열만 반환

📌 주요 메서드

메서드 설명
readLine() 한 줄 입력
close() 스트림 종료

📌 예제

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int num = Integer.parseInt(br.readLine()); // 정수 입력
        System.out.println("입력된 숫자: " + num);

        br.close();
    }
}

⚠️ 주의할 점

  • 숫자 입력 시 Integer.parseInt()를 사용해야 함
  • br.close()로 스트림을 닫아야 함
    • 필수는 아니지만, 권장됨 (자원 해제 목적)
    • BufferedReader는 파일을 읽거나 네트워크에서 데이터를 받을 때 자원을 점유하므로, 사용 후 close()를 호출하는 것이 좋음.
    • 하지만 단순 콘솔 입력(System.in)에서는 close()를 생략해도 문제 없음.

 

3. StringTokenizer

📌 특징

  • StringTokenizer는 문자열을 공백(또는 특정 구분자) 기준으로 나누는 도구이기 때문에, 단독으로 입력을 받을 수 없고 반드시 문자열을 입력받은 후 사용해야 함 → BufferedReader + StringTokenizer 조합으로 보통 많이 사용
  • 공백으로 구분된 여러 개의 입력을 쉽게 처리할 수 있음
  • BufferedReader와 함께 사용하여 빠른 입력 가능

📌 장단점

장점

  • nextToken()으로 간편하게 값 분리
  • BufferedReader와 함께 사용하면 매우 빠름

단점

  • 직접 문자열을 넘겨줘야 함
  • 특정 구분자 이외의 처리는 어려움

📌 주요 메서드

메서드 설명
nextToken() 다음 토큰 반환
hasMoreTokens() 남은 토큰이 있는지 확인

📌 예제

import java.io.*;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int a = Integer.parseInt(st.nextToken());
        int b = Integer.parseInt(st.nextToken());

        System.out.println("입력된 값: " + a + ", " + b);
        br.close();
    }
}

⚠️ 주의할 점

  • BufferedReader.readLine()으로 먼저 한 줄을 입력받아야 함
  • StringTokenizer는 단독으로 사용할 수 없음
  • Scanner와 함께 사용 가능하지만 비효율적
    • Scanner는 공백 단위로 자동으로 입력을 처리할 수 있기 때문에, 굳이 StringTokenizer를 사용할 필요가 없다. → 차라리 sc.nextInt() 등을 쓰는 게 더 직관적
import java.util.Scanner;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        StringTokenizer st = new StringTokenizer(sc.nextLine()); // 한 줄 입력 후 사용

        int a = Integer.parseInt(st.nextToken());
        int b = Integer.parseInt(st.nextToken());

        System.out.println("입력된 값: " + a + ", " + b);
        sc.close();
    }
}

 

2️⃣ 출력

1. System.out

📌 특징

  • print(), println(), printf() 등을 사용하여 출력
  • 가장 간단한 출력 방법이지만, 속도는 느린 편

📌 장단점

장점

  • 사용이 간편함
  • 다양한 포맷 지원 (printf())

단점

  • 출력 속도가 상대적으로 느림
  • 많은 데이터 출력 시 비효율적

📌 주요 메서드

메서드 설명
print() 개행 없이 출력
println() 출력 후 개행
printf() 형식 지정 출력

📌 예제

System.out.print("Hello ");
System.out.println("World!");
System.out.printf("정수: %d, 실수: %.2f\\n", 10, 3.14);

 

2. BufferedWriter + OutputStreamWriter

📌 특징

  • BufferedWriter는 System.out보다 출력 속도가 빠름
  • flush()를 호출해야 출력됨

📌 장단점

장점

  • 출력 속도가 빠름

단점

  • flush()를 명시적으로 호출해야 함

📌 주요 메서드

메서드 설명
write(String s) 문자열 출력
newLine() 개행 추가
flush() 버퍼 비우기

📌 예제

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        bw.write("Hello, World!");
        bw.newLine();
        bw.flush();
        bw.close();
    }
}

⚠️ 주의할 점

  • flush()를 명시적으로 호출해야 함
    • BufferedWriter는 버퍼를 이용해 출력 데이터를 한 번에 처리하므로, 즉시 반영되지 않음.
    • 따라서 출력 전에 반드시 flush()를 호출해야 함.
    • 출력 후 바로 프로그램이 종료되면 자동으로 flush() 되지만, 명시적으로 호출하는 것이 안전함.

 

3️⃣ 상황별 추천 입출력 방식

입력

  • 간단한 입력 → Scanner
  • 대량의 입력 처리 → BufferedReader + StringTokenizer
  • 숫자 여러 개 입력 → BufferedReader + StringTokenizer
  • 문자열 여러 줄 입력 → BufferedReader

출력

  • 간단한 출력 → System.out.println()
  • 다량 출력 → BufferedWriter
저작자표시 (새창열림)
'Java' 카테고리의 다른 글
  • [Java 필수 문법] 5. 문자열
  • [Java 필수 문법] 4. 배열(Array)과 리스트(List)
  • [Java 필수 문법] 3. Java에서 데이터 비교 (== vs equals())
  • [Java 필수 문법] 2. Primitive Type vs. Reference Type
김행만
김행만
이모저모 다 적기
  • 김행만
    hyeinisfree
    김행만
  • 전체
    오늘
    어제
    • 분류 전체보기 (41)
      • AWS (0)
      • Network (6)
      • CICD (1)
      • Spring (0)
      • Ruby on Rails (0)
      • Java (12)
      • Python (1)
      • Computer Science (6)
        • Algorithm (2)
        • Data Structure (3)
        • Database (0)
        • Design Pattern (1)
      • Solving Algorithm Problem (12)
        • LeetCode (12)
        • Programmers (0)
      • 자격증 (1)
      • Tip (1)
      • Etc (1)
        • 도서, 강의 (1)
        • Talk (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    cisco packet tracer
    Network
    Packet Tracer
    CISCO
    java 필수 문법
    java
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
김행만
[Java 필수 문법] 6. 입출력
상단으로

티스토리툴바