Java Scanner 클래스는 System.in을 통한 사용자 입력 처리에 필수적인 도구로, next()와 nextLine()의 차이점을 정확히 이해하고 공백 구분자 처리 방법을 숙지하면 입력 관련 오류를 크게 줄일 수 있습니다.
Scanner 클래스 기본 개념과 import
Scanner 클래스는 java.util 패키지에 속한 클래스로, 다양한 입력 소스에서 데이터를 읽어올 수 있는 강력한 도구입니다.
java.util.Scanner import가 필요하며, 기본 구문은 다음과 같습니다.
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Scanner 사용
scanner.close(); // 리소스 해제 필수
}
}
Scanner는 입력 스트림을 토큰 단위로 분석하며, 기본 구분자(whitespace)인 공백, 탭, 개행 문자를 사용해 토큰을 구분합니다.
Oracle Java Documentation에서 더 자세한 내용을 확인할 수 있습니다.
Scanner (Java Platform SE 8 )
Scans the next token of the input as a float. This method will throw InputMismatchException if the next token cannot be translated into a valid float value as described below. If the translation is successful, the scanner advances past the input that match
docs.oracle.com
next() vs nextLine() 핵심 차이점
Java Scanner 사용법에서 가장 많은 개발자들이 실수하는 부분이 바로 next()와 nextLine()의 차이점입니다.
next() 메서드 특징
- 토큰 기반 읽기: 공백, 탭, 개행을 만나면 입력을 종료
- 개행 문자 소비하지 않음: 입력 버퍼에 개행 문자가 남아있음
- 한 단어씩 처리: 공백이 포함된 문자열은 첫 번째 단어만 읽음
Scanner scanner = new Scanner(System.in);
System.out.print("이름을 입력하세요: ");
String name = scanner.next(); // "홍길동 김철수" 입력시 "홍길동"만 읽음
nextLine() 메서드 특징
- 라인 기반 읽기: 개행 문자(\n)까지 전체 라인을 읽음
- 개행 문자 소비함: 버퍼에서 개행 문자를 제거
- 공백 포함 처리: 문자열 한 줄 입력에 적합
Scanner scanner = new Scanner(System.in);
System.out.print("주소를 입력하세요: ");
String address = scanner.nextLine(); // "서울시 강남구 역삼동"까지 모두 읽음
메서드별 비교표
메서드 | 읽는 단위 | 공백 처리 | 개행 문자 소비 | 사용 사례 |
---|---|---|---|---|
next() | 토큰 | 구분자로 인식 | 소비 안함 | 단일 단어 |
nextLine() | 전체 라인 | 포함해서 읽음 | 소비함 | 문장, 주소 |
Scanner 메서드 모음과 활용법
Scanner 클래스는 다양한 데이터 타입을 처리할 수 있는 메서드들을 제공합니다.
숫자 입력 메서드
Scanner scanner = new Scanner(System.in);
int intValue = scanner.nextInt();
long longValue = scanner.nextLong();
float floatValue = scanner.nextFloat();
double doubleValue = scanner.nextDouble();
숫자 입력 후 개행 처리가 중요한 포인트입니다.
nextInt() 등의 숫자 메서드는 개행 문자를 소비하지 않아, 이후 nextLine() 호출 시 빈 문자열이 반환될 수 있습니다.
Scanner scanner = new Scanner(System.in);
System.out.print("나이: ");
int age = scanner.nextInt();
scanner.nextLine(); // 개행 문자 소비
System.out.print("이름: ");
String name = scanner.nextLine();
입력 검증 메서드
hasNext() 계열 메서드를 사용하면 안전한 입력 처리가 가능합니다.
Scanner scanner = new Scanner(System.in);
if (scanner.hasNextInt()) {
int number = scanner.nextInt();
} else {
System.out.println("정수가 아닙니다.");
scanner.next(); // 잘못된 입력 소비
}
Java Tutorial - Scanner에서 추가적인 활용법을 확인해보세요.
공백과 개행 처리 완벽 가이드
Scanner에서 공백/개행 처리는 입력 패턴을 이해하는 핵심입니다.
기본 구분자 동작 원리
입력: "Hello World\n"
next() 호출 결과: "Hello" (공백에서 중단, 개행 문자 남음)
다음 next() 호출 결과: "World" (개행 문자는 여전히 남음)
혼합 입력 패턴 처리
실무에서 자주 발생하는 상황입니다.
Scanner scanner = new Scanner(System.in);
System.out.print("학번: ");
int studentId = scanner.nextInt();
System.out.print("학과: ");
scanner.nextLine(); // 개행 문자 제거
String department = scanner.nextLine();
System.out.print("학년: ");
int grade = scanner.nextInt();
입력 플로우 다이어그램
사용자 입력: "123\nComputer Science\n2\n"
nextInt() → 123 읽음, "\n" 버퍼에 남음
nextLine() → "\n" 소비, 빈 문자열 반환
nextLine() → "Computer Science" 읽음
nextInt() → 2 읽음
Scanner 예외 처리와 안전한 입력
InputMismatchException은 Scanner 사용 시 가장 흔히 발생하는 예외입니다.
InputMismatchException 처리
Scanner scanner = new Scanner(System.in);
try {
System.out.print("숫자 입력: ");
int number = scanner.nextInt();
System.out.println("입력된 숫자: " + number);
} catch (InputMismatchException e) {
System.out.println("올바른 숫자 형식이 아닙니다.");
scanner.next(); // 잘못된 토큰 제거
}
루프를 통한 재입력 처리
Scanner scanner = new Scanner(System.in);
int validInput = 0;
boolean isValid = false;
while (!isValid) {
try {
System.out.print("1-100 사이 숫자: ");
validInput = scanner.nextInt();
if (validInput >= 1 && validInput <= 100) {
isValid = true;
} else {
System.out.println("범위를 벗어났습니다.");
}
} catch (InputMismatchException e) {
System.out.println("숫자만 입력하세요.");
scanner.next();
}
}
고급 Scanner 활용 - useDelimiter와 useLocale
Scanner의 고급 기능을 활용하면 더욱 유연한 입력 처리가 가능합니다.
useDelimiter 활용
기본 구분자를 변경하여 특별한 형태의 입력을 처리할 수 있습니다.
Scanner scanner = new Scanner("apple,banana,cherry");
scanner.useDelimiter(",");
while (scanner.hasNext()) {
System.out.println(scanner.next().trim());
}
정규식을 이용한 구분자 설정
Scanner scanner = new Scanner("name:John|age:25|city:Seoul");
scanner.useDelimiter("\\|");
while (scanner.hasNext()) {
String pair = scanner.next();
String[] keyValue = pair.split(":");
System.out.println(keyValue[0] + " = " + keyValue[1]);
}
useLocale 설정
Locale 설정을 통해 지역별 숫자 형식을 처리할 수 있습니다.
import java.util.Locale;
Scanner scanner = new Scanner("3.14");
scanner.useLocale(Locale.US);
double value = scanner.nextDouble(); // 미국식 소수점 처리
파일 입력 Scanner 활용법
Scanner는 System.in뿐만 아니라 파일 입력에도 활용할 수 있습니다.
파일에서 읽기
import java.io.File;
import java.io.FileNotFoundException;
try {
File file = new File("data.txt");
Scanner fileScanner = new Scanner(file);
while (fileScanner.hasNextLine()) {
String line = fileScanner.nextLine();
System.out.println(line);
}
fileScanner.close();
} catch (FileNotFoundException e) {
System.out.println("파일을 찾을 수 없습니다.");
}
Charset 지정
한글 파일을 읽을 때는 Charset 설정이 중요합니다.
import java.nio.charset.StandardCharsets;
Scanner fileScanner = new Scanner(file, StandardCharsets.UTF_8);
Java NIO Charset에서 더 많은 문자 인코딩 정보를 확인할 수 있습니다.
Scanner 실무 활용 패턴과 베스트 프랙티스
실제 개발 환경에서 Scanner를 효율적으로 사용하는 방법들을 알아보겠습니다.
메뉴 시스템 구현
Scanner scanner = new Scanner(System.in);
boolean running = true;
while (running) {
System.out.println("\n=== 메뉴 ===");
System.out.println("1. 데이터 입력");
System.out.println("2. 데이터 조회");
System.out.println("3. 종료");
System.out.print("선택: ");
if (scanner.hasNextInt()) {
int choice = scanner.nextInt();
scanner.nextLine(); // 개행 문자 처리
switch (choice) {
case 1:
inputData(scanner);
break;
case 2:
viewData();
break;
case 3:
running = false;
System.out.println("프로그램을 종료합니다.");
break;
default:
System.out.println("올바른 번호를 선택하세요.");
}
} else {
System.out.println("숫자를 입력하세요.");
scanner.next();
}
}
데이터 검증과 재입력 처리
public static String getValidEmail(Scanner scanner) {
String email;
String emailPattern = "^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$";
while (true) {
System.out.print("이메일 주소: ");
email = scanner.nextLine().trim();
if (email.matches(emailPattern)) {
break;
} else {
System.out.println("올바른 이메일 형식이 아닙니다.");
}
}
return email;
}
Scanner 성능 최적화와 주의사항
Scanner 사용 시 고려해야 할 성능적 측면과 주의사항들입니다.
리소스 관리
// try-with-resources 사용 권장
try (Scanner scanner = new Scanner(System.in)) {
String input = scanner.nextLine();
// 사용 로직
} // 자동으로 close() 호출
대용량 데이터 처리
대용량 파일을 처리할 때는 BufferedReader가 더 효율적일 수 있습니다.
import java.io.BufferedReader;
import java.io.FileReader;
// 대용량 파일은 BufferedReader 고려
try (BufferedReader reader = new BufferedReader(new FileReader("largefile.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
// 처리 로직
}
}
Scanner vs BufferedReader 비교
특징 | Scanner | BufferedReader |
---|---|---|
편의성 | 높음 | 중간 |
성능 | 중간 | 높음 |
타입 변환 | 자동 | 수동 |
파싱 기능 | 풍부 | 기본적 |
Java I/O Tutorial에서 다양한 입출력 방법을 비교해보세요.
실전 예제와 트러블슈팅
자주 발생하는 Scanner 관련 문제들과 해결책을 정리했습니다.
문제 1: 숫자 입력 후 문자열 입력 시 빈 값
// 문제가 있는 코드
Scanner scanner = new Scanner(System.in);
System.out.print("나이: ");
int age = scanner.nextInt(); // 개행 문자 남음
System.out.print("이름: ");
String name = scanner.nextLine(); // 빈 문자열 반환
// 해결책
Scanner scanner = new Scanner(System.in);
System.out.print("나이: ");
int age = scanner.nextInt();
scanner.nextLine(); // 개행 문자 소비
System.out.print("이름: ");
String name = scanner.nextLine();
문제 2: 공백이 포함된 문자열 처리
// 문제: next() 사용 시 공백 이후 문자열 손실
Scanner scanner = new Scanner(System.in);
System.out.print("전체 이름: ");
String fullName = scanner.next(); // "김철수 박영희" 입력 시 "김철수"만 저장
// 해결책: nextLine() 사용
String fullName = scanner.nextLine(); // 전체 문자열 읽기
문제 3: 반복적인 예외 발생
// 개선된 입력 처리 함수
public static int getIntInput(Scanner scanner, String prompt, int min, int max) {
int value;
while (true) {
try {
System.out.print(prompt);
value = scanner.nextInt();
scanner.nextLine(); // 개행 문자 처리
if (value >= min && value <= max) {
return value;
} else {
System.out.printf("범위: %d ~ %d\n", min, max);
}
} catch (InputMismatchException e) {
System.out.println("숫자만 입력하세요.");
scanner.nextLine(); // 잘못된 입력 제거
}
}
}
Scanner 대안 기술과 현대적 접근법
Java 8 이후 추가된 기능들과 Scanner의 대안을 살펴보겠습니다.
Java 8 이후의 입력 처리
import java.io.Console;
// Console 클래스 활용 (IDE에서는 제한적)
Console console = System.console();
if (console != null) {
String input = console.readLine("입력하세요: ");
char[] password = console.readPassword("비밀번호: ");
}
Stream API와의 조합
Scanner scanner = new Scanner(System.in);
List<Integer> numbers = new ArrayList<>();
System.out.println("숫자들을 입력하세요 (q로 종료):");
while (scanner.hasNext()) {
if (scanner.hasNextInt()) {
numbers.add(scanner.nextInt());
} else {
String input = scanner.next();
if ("q".equals(input)) break;
}
}
// Stream API로 처리
double average = numbers.stream()
.mapToInt(Integer::intValue)
.average()
.orElse(0.0);
마무리
Java Scanner 사용법을 완벽하게 마스터하기 위해서는 next()와 nextLine()의 차이점을 명확히 이해하고, 개행 문자 처리 패턴을 숙지하는 것이 핵심입니다.
특히 숫자 입력 후 개행 처리, InputMismatchException 예외 처리, 그리고 적절한 리소스 관리를 통해 안정적인 입력 시스템을 구축할 수 있습니다.
실무에서는 Scanner의 기본 기능 외에도 useDelimiter, useLocale, 파일 입력 기능을 활용하여 더욱 유연한 데이터 처리가 가능합니다.
Scanner 공백 구분과 토큰 처리 메커니즘을 정확히 이해하고, 상황에 따라 적절한 메서드를 선택하여 사용하시기 바랍니다.
Oracle Java SE Documentation에서 최신 Java 버전의 Scanner 기능을 확인해보세요.
같이 보면 좋은 글
Java 모듈 시스템 완벽 이해: Java 9 이후 모던 자바 개발의 핵심
Java 9에서 도입된 모듈 시스템(JPMS, Java Platform Module System)은 자바 개발에 혁명적인 변화를 가져왔습니다.기존의 클래스패스(classpath) 기반 시스템의 한계를 극복하고, 더 안전하고 효율적인 애플
notavoid.tistory.com
JSON 완벽 가이드: 실무에서 바로 써먹는 자바 JSON 처리 기법
JSON 처리 성능을 최대 300% 향상시키고 메모리 사용량을 50% 절약하는 실무 검증된 자바 JSON 최적화 기법을 상세히 다룹니다.JSON의 핵심 개념과 실무 활용JSON(JavaScript Object Notation)은 단순한 데이터
notavoid.tistory.com
자바 Try-with-resources 완전 가이드: 메모리 누수 방지와 안전한 자원 관리
자바 프로그래밍에서 자원 관리는 애플리케이션의 안정성과 성능을 결정하는 핵심 요소입니다.2011년 자바 7과 함께 도입된 Try-with-resources는 전통적인 try-catch-finally 패턴의 복잡성을 해결하고,
notavoid.tistory.com
[자바] 문자열 관리: 언제 String, StringBuilder, StringBuffer를 사용해야 할까?
Java 애플리케이션에서 문자열 처리 성능을 최적화하려면String, StringBuilder, StringBuffer의 특성을 정확히 이해하고 상황에 맞는 선택이 필요하며,잘못된 사용은 메모리 누수와 성능 저하를 야기할
notavoid.tistory.com
JVM , 아파치, 아파치 톰캣 튜닝
추석 시즌 200% 트래픽 증가로 겪은 실제 장애 경험을 바탕으로, 서버 성능을 즉시 개선할 수 있는 실무 중심의 JVM 및 웹서버 튜닝 전략을 제시합니다. 추석 복지몰 운영 중 사용자가 급증하면서
notavoid.tistory.com
웹 개발의 핵심: AJP와 HTTP를 활용한 WEB-WAS 연동 전략(feat. 아파치, 톰캣)
AJP와 HTTP 프로토콜을 활용한 Apache-Tomcat 연동으로 50% 이상의 성능 향상과 운영 비용 절감을 달성하는 실무 가이드를 제공합니다.현대 웹 애플리케이션 아키텍처에서 Web Server와 WAS 간의 효율적인
notavoid.tistory.com
'자바(Java) 실무와 이론' 카테고리의 다른 글
Comparable vs Comparator 한방에 끝내기 - 자바 정렬·비교 원리와 실무 패턴 총정리 (0) | 2025.09.17 |
---|---|
Java 리액티브 프로그래밍 실무 완전 가이드: 네이버 쇼핑 10배 성능 개선 사례로 배우는 Project Reactor (0) | 2025.05.28 |
Java로 메모리 캐시 직접 구현해보기: 성능 최적화를 위한 실무 가이드 (0) | 2025.05.28 |
Java 패턴 매칭 기능 완벽 가이드: 모던 자바 개발자를 위한 실무 활용법 (0) | 2025.05.28 |
Java 모듈 시스템 완벽 이해: Java 9 이후 모던 자바 개발의 핵심 (0) | 2025.05.27 |