[학습목표]
💡 자바에서 입출력 처리를 할 수 있다
💡 자바 스캐너의 사용법을 알아본다
💡 next()와 nextLine()의 차이점을 알아본다
🚩여기서 잠깐 토막상식!
※ 필요한 사전지식? 표준 입출력, 스트림
1. Scanner란?
java.util.Scanner
- 파일, 입력 스트림 등에서 데이터를 읽어 구분자로 토큰화하고 다양한 타입으로 형변환하여 리턴해주는 클래스
- 같은 방법으로 파일, 문자열 등 다양하게 데이터를 읽어들일 수 있어 편리하다
- Scanner(File source)
- Scanner(InputStream source)
- Scanner(String source)
- 입력 스트림을 다루는 방법을 몰라도 손쉽게 입력처리 가능
- 데이터 형변환으로 인한 편리함
- 대량의 처리시 수행시간이 비효율적임 (느리다)
2. Scanner의 주요 메서드
메서드 명 | 특징 |
nextInt() | - int 타입 반환 - white space를 만나면 종료 |
nextDouble() | - double 타입 반환 - white space를 만나면 종료 |
next() | - String 타입 반환 - white space를 만나면 종료 |
nextLine() | - String 타입 반환 - 개행문자(Enter)를 만나면 종료 - next()와 달리 문자열 안에 띄어쓰기를 할 수 있음 (공백을 포함할 수 있음) |
nextInt(), nextDouble(), next()의 구분자는 공백문자 (space, tab, \n) 이고
nextLine()의 구분자는 개행문자(\n)이다.
따라서 "Hello World"라는 문자열이 주어졌을 때
next()는 Hello, World 이렇게 각각 단어만 받을 수 있고
nextLine()은 Hello World 이렇게 문장으로 띄어쓰기를 포함하여 받을 수 있다
2-1. next() 사용예제
import java.util.Scanner;
public class IO1_ScannerTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); //표준입력스트림을 스캐닝
System.out.println("정수, 실수, 문자열을 차례로 입력하세요.");
System.out.println("읽은 정수: " + sc.nextInt());
System.out.println("읽은 실수: " + sc.nextDouble());
System.out.println("읽은 문자열: " + sc.next()); //White space를 만나면 종료
}
}
출력결과
next() 사용시 띄어쓰기를 구분자로 인식하여 종료하기 때문에
- hello world 전체가 아닌 hello만 읽어들인다.
- 스페이스 여러번 누른게 반영되어있지 않다.
띄어쓰기까지도 유효한 문자로 인식하려면 nextLine()을 사용해야한다.
2-2. nextLine() 사용예제
import java.util.Scanner;
public class IO1_ScannerTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); //표준입력스트림을 스캐닝
System.out.println("정수, 실수, 문자열을 차례로 입력하세요.");
System.out.println("읽은 정수: " + sc.nextInt());
System.out.println("읽은 실수: " + sc.nextDouble());
System.out.println("읽은 문자열: " + sc.nextLine()); //개행(/n)을 만나면 종료
}
}
출력결과
입력에서 누른 띄어쓰기까지도 문자열 안에 포함되어있다.
두가지 예제를 통해 next()와 nextLine()이 구분자만 다를 뿐 아니라 처리하는 방법에서 차이가 있음을 알수있다
3. next()와 nextLine()의 차이점
차이점을 알아보기 위해 같은 문자열을 두개의 메서드로 출력해보도록 하자
import java.util.Scanner;
public class IO2_ScannerTest {
public static void main(String[] args) {
String s1 = "안 \n녕\n";
Scanner sc = new Scanner(s1);
System.out.print("next() 출력값 : \""+sc.next()); //읽은 그대로 출력하기 위해 print()사용
System.out.print(sc.next()+"\"");
System.out.println();
Scanner sc2 = new Scanner(s1);
System.out.print("nextLine() 출력값 : \""+sc2.nextLine()); //읽은 그대로 출력하기 위해 print()사용
System.out.print(sc2.nextLine()+"\"");
}
}
출력결과
next()는 "안녕" 두글자가,
nextLine()은 "안 녕" 세글자가 출력되었다
같은 문자열을 출력했는데 왜 결과값이 다를까?
2-1. next() 의 처리 방법
- next()는 커서의 시작부터 구분자(white space) 직전까지 읽어들인 후 유효문자만 출력한다.
이때 구분자는 남겨둔다. - 남아있는 구분자는 무시하고 다음 유효문자부터 구분자 직전까지 읽어들인 후 유효문자만 출력한다.
- 유효문자가 없으면 남아있는 구분자는 버리고 종료한다.
- 결과적으로 읽어들인 문자는 "안", "녕" 두글자이다.
2-2. nextLine() 의 처리 방법
- nextLine()은 커서의 시작부터 구분자(\n)가 나올때까지 읽어들인 후 유효문자를 출력한다
개행만 구분자로 취급하기 때문에 space는 유효문자로 처리한다.
이때 구분자는 삭제 후 다음 글자를 읽는다 - 다음 유효문자부터 구분자 직전까지 읽어들인 후 유효문자만 출력한다.
마찬가지로 구분자는 삭제 후 다음 글자를 읽는다 - 더이상 읽어들일 문자열이 없으면 종료한다
- 결과적으로 읽어들인 문자는 "안", " ", "녕" 세글자이다
이렇게 next()는 구분자를 남겨두고 nextLine()은 구분자를 떼고 넘겨주는 것을 알게 되었다
2-3. next()와 nextLine() 동시에 사용하기
같은 메서드끼리 쓸때는 상관없지만 성격이 다른 메서드를 함께쓸 때는 앞에 남겨둔 구분자를 유효문자로 처리해서 출력값에 문제가 생기지 않도록 주의해야 한다.
import java.util.Scanner;
public class IO3_ScannerTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("나이 : " + sc.nextInt());
sc.nextLine(); //남아있는 구분자 제거
System.out.println("이름 : " + sc.nextLine());
}
}
이렇게 구분자 제거용 nextLine()을 추가하면 정상적으로 출력할 수 있다.
'🎯 알고리즘 > 개념 & 예제' 카테고리의 다른 글
[Java/자바] 표준 입출력, InputStream/OutputStream (0) | 2023.01.11 |
---|---|
[Java/자바] 스택(Stack)의 개념과 사용 방법 (0) | 2022.07.18 |
댓글