자바 입출력 완전 정복: 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.print의 다양한 활용법
자바에서 출력을 담당하는 건 바로 System.out
이에요. 이건 자바 표준 출력 스트림이죠. 여기서 가장 자주 쓰는 메서드가 `println`, `print`, `printf`입니다.
- println(): 출력 후 줄바꿈까지 자동으로 처리
- print(): 줄바꿈 없이 출력
- 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으로 입력 전 줄바꿈 생김
- 입력값 타입 불일치 시 예외 발생
네, 프로그램 마지막에 `sc.close()`로 리소스를 정리해주는 게 좋습니다. 특히 파일 입력 등에서는 꼭 닫아야 해요.
작은 앱에서는 크게 티 안 나지만, 서버나 반복 실행 환경에선 꼭 닫아줘야 해요.
앞에 nextInt(), next() 등을 쓰면 줄바꿈 문자 때문에 nextLine()이 건너뛰는 문제가 생깁니다.
버퍼에 남아있는 줄바꿈을 처리하려면 중간에 dummy `sc.nextLine()`을 추가해주는 게 좋아요.
숫자를 입력받을 때 문자나 공백이 들어오면 예외가 발생합니다. try-catch 문을 사용하면 안전해요.
예: try { int n = sc.nextInt(); } catch (InputMismatchException e) { ... }
아니요. 정수, 실수, 문자, 문자열 모두 가능합니다. 다양한 포맷 코드만 익히면 끝!
%d, %f, %c, %s 등 다양한 출력 형식을 조합해보세요.
Scanner의 생성자에 File 객체를 넘기면 파일도 입력 소스로 사용할 수 있어요.
파일에서 한 줄씩 읽거나 숫자를 파싱하는 것도 Scanner로 충분히 가능해요.
BufferedReader는 Scanner보다 빠르지만 문자열만 처리할 수 있고, 타입 변환은 직접 해야 해요.
입력 속도가 중요하면 BufferedReader, 간편한 사용은 Scanner를 추천해요.
Scanner와 System.out은 자바의 입출력 기초지만, 이걸 잘 다루면 진짜 쓸 수 있는 프로그램을 만들 수 있어요. 오늘 글에서 설명한 내용을 직접 입력해보고, println과 printf의 차이도 체험해보세요. 오타도 일부러 내보면서 오류 상황도 경험해보시길! 궁금한 점이나 더 알고 싶은 내용이 있다면 언제든 댓글 달아주세요. 함께 성장하는 블로그가 되었으면 좋겠습니다. 😊
'프로그래밍 > 자바[JAVA]' 카테고리의 다른 글
9장. 생성자와 this 키워드, 헷갈릴 땐 이렇게 정리! (0) | 2025.05.06 |
---|---|
8장. 클래스와 객체 개념! 진짜 쉽게 설명해드립니다! (1) | 2025.05.06 |
6장. 자바 메서드 완전 정복: 정의, 호출, 매개변수, 반환값까지 (0) | 2025.05.05 |
5장. 자바의 배열과 ArrayList 기초 (2) | 2025.05.04 |
4장. 조건문과 반복문 (if, switch, while, for, break/continue) (1) | 2025.05.04 |