본문 바로가기
프로그래밍/자바[JAVA]

7장. 자바 입출력 완전 정복: Scanner부터 System.out까지

by 사업가 Jay 2025. 5. 6.

자바 입출력 완전 정복: Scanner부터 System.out까지

"System.out.println"만 쓰고 계신가요? 자바 입출력의 세계는 그보다 훨씬 넓고 깊답니다.

안녕하세요! 저처럼 자바를 배우는 많은 분들이 처음 만나게 되는 게 바로 "입출력"이죠. 처음엔 `System.out.println()`만 쓰다가, 어느 순간부터 `Scanner`가 등장하고, 나중에는 파일 입력까지 건드리게 됩니다. 저도 처음엔 출력만 줄줄 외웠는데, 입력 받는 코드에서 늘 멈칫하곤 했어요. 오늘은 그런 여러분을 위해 자바의 입출력 개념을 완전 정리해드리려 해요. 실전 예제와 함께 이해하면 의외로 쉬워요!

 

입출력이란 무엇인가?

자바의 입출력, 흔히 I/O(Input/Output)라고 부르죠. 한마디로 말하면 프로그램 외부와 정보를 주고받는 과정이에요. 입력(Input)은 사용자 키보드나 파일, 네트워크에서 데이터를 읽어오는 것이고, 출력(Output)은 데이터를 화면이나 파일에 보여주는 것을 말합니다. 우리가 흔히 사용하는 System.out.println()이 바로 출력의 대표적인 예죠.

입출력은 자바 프로그램의 시작이자 끝이라고도 할 수 있어요. 사용자에게 질문하고 그에 대한 답을 받아 처리하는 건 모든 프로그램의 기본이니까요.

Scanner로 사용자 입력 받기

사용자 입력을 받는 가장 기본적인 방법은 바로 Scanner 클래스를 사용하는 거예요. 이 클래스는 java.util 패키지에 포함되어 있어서, 사용하려면 반드시 import 해줘야 해요. 다음은 기본적인 사용 예시입니다:


import java.util.Scanner;

public class InputExample {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("이름을 입력하세요: ");
        String name = sc.nextLine();
        System.out.println("안녕하세요, " + name + "님!");
    }
}
코드 요소 설명
import java.util.Scanner; Scanner 클래스 사용을 위해 필요한 선언
Scanner sc = new Scanner(System.in); System.in을 통해 키보드 입력 받기

자바에서 출력을 담당하는 건 바로 System.out이에요. 이건 자바 표준 출력 스트림이죠. 여기서 가장 자주 쓰는 메서드가 `println`, `print`, `printf`입니다.

  1. println(): 출력 후 줄바꿈까지 자동으로 처리
  2. print(): 줄바꿈 없이 출력
  3. printf(): 형식을 지정해서 출력

`print()`와 `println()`은 초보자용으로, `printf()`는 조금 더 고급 방식이에요. 나중에 문자열 포맷이 필요해질 때 `printf()`를 꼭 배우세요. 쓸 일이 정말 많습니다.

 

Scanner로 입력 가능한 데이터 타입

`Scanner` 클래스의 강력한 점 중 하나는 다양한 타입의 데이터를 쉽게 읽을 수 있다는 점이에요. 문자열뿐 아니라 숫자, 실수, 불리언까지 입력받을 수 있죠. 아래는 Scanner에서 자주 사용하는 메서드들입니다.

  • nextLine() – 한 줄 전체 읽기 (공백 포함)
  • next() – 공백 전까지만 읽음
  • nextInt(), nextDouble(), nextBoolean() – 각각 정수, 실수, 불리언 값 입력

형식을 지정한 출력: printf의 세계

출력을 조금 더 예쁘게, 보기 좋게 만들고 싶다면 printf()를 써보세요. 마치 엑셀처럼 자리수, 소수점 등을 제어할 수 있거든요. 아래는 자주 사용하는 포맷 문자와 그 설명입니다.

포맷 코드 의미 예시 출력
%d 정수 10
%f 소수점 포함 실수 3.141593
%.2f 소수점 둘째자리까지 3.14
%s 문자열 Hello

입출력 관련 자주 하는 실수 모음

처음 Scanner를 쓸 때 이런 실수 한 번쯤 다 해봤어요. 아래 항목 체크해보세요.

  • nextLine() 전에 nextInt()나 next() 사용 → 줄바꿈 문제 발생
  • Scanner 객체를 여러 개 생성 → 자원 낭비
  • System.out.print 대신 println으로 입력 전 줄바꿈 생김
  • 입력값 타입 불일치 시 예외 발생

 

Q Scanner는 꼭 닫아야 하나요?

네, 프로그램 마지막에 `sc.close()`로 리소스를 정리해주는 게 좋습니다. 특히 파일 입력 등에서는 꼭 닫아야 해요.

A 안 닫으면 메모리 낭비!

작은 앱에서는 크게 티 안 나지만, 서버나 반복 실행 환경에선 꼭 닫아줘야 해요.

Q nextLine()이 바로 안 먹힐 때가 있어요.

앞에 nextInt(), next() 등을 쓰면 줄바꿈 문자 때문에 nextLine()이 건너뛰는 문제가 생깁니다.

A nextLine 전에 sc.nextLine(); 한 번 더!

버퍼에 남아있는 줄바꿈을 처리하려면 중간에 dummy `sc.nextLine()`을 추가해주는 게 좋아요.

Q 입력 오류를 어떻게 처리하죠?

숫자를 입력받을 때 문자나 공백이 들어오면 예외가 발생합니다. try-catch 문을 사용하면 안전해요.

A try-catch로 막자!

예: try { int n = sc.nextInt(); } catch (InputMismatchException e) { ... }

Q printf는 문자열만 출력 가능한가요?

아니요. 정수, 실수, 문자, 문자열 모두 가능합니다. 다양한 포맷 코드만 익히면 끝!

A 숫자든 문자든 OK!

%d, %f, %c, %s 등 다양한 출력 형식을 조합해보세요.

Q 콘솔이 아닌 파일에서 입력받고 싶어요.

Scanner의 생성자에 File 객체를 넘기면 파일도 입력 소스로 사용할 수 있어요.

A new Scanner(new File("data.txt"))

파일에서 한 줄씩 읽거나 숫자를 파싱하는 것도 Scanner로 충분히 가능해요.

Q System.in과 BufferedReader는 뭐가 다른가요?

BufferedReader는 Scanner보다 빠르지만 문자열만 처리할 수 있고, 타입 변환은 직접 해야 해요.

A Scanner = 편리, BufferedReader = 빠름

입력 속도가 중요하면 BufferedReader, 간편한 사용은 Scanner를 추천해요.

 

Scanner와 System.out은 자바의 입출력 기초지만, 이걸 잘 다루면 진짜 쓸 수 있는 프로그램을 만들 수 있어요. 오늘 글에서 설명한 내용을 직접 입력해보고, println과 printf의 차이도 체험해보세요. 오타도 일부러 내보면서 오류 상황도 경험해보시길! 궁금한 점이나 더 알고 싶은 내용이 있다면 언제든 댓글 달아주세요. 함께 성장하는 블로그가 되었으면 좋겠습니다. 😊