개발공부

JAVA쪼렙탈출기: Scanner Class

Yuniverse. 2023. 5. 14. 11:05
Python과 SQL만 써본 주니어 분석가. '개발공부를 해보고 싶다', '개발도 공부하긴 해야하는데...'는 말만 한지 어연 1년이 넘어가는 중, 이대로는 안되겠다 싶어 냅다 JAVA 수업 수강에 카드를 긁었다. 쪼렙 중의 쪼렙이 JAVA를 배워나가는 여정을 "JAVA 쪼렙 탈출기"라는 시리즈로 남길 예정이다.

 

Scanner Class

입력하는 데이터를 원하는 자료형으로 선택해서 처리할 수 있는 클래스. Scanner 객체를 생성하고 변수에 해당 객체를 저장하여 사용한다.

  • 객체(Instance) : Class로부터 만들어져 Class의 기능을 가지고 있는 것 (실체)
  • 변수(Variable) : 참조타입으로 객체를 저장하는 공간. 실제값을 가지고 있는 게 아닌, 실제값을 가지고 있는 객체의 위치를 가지고 있다.

Scanner scan = new Scanner(System.in);

이런식으로 scan 이라는 변수에 Scanner 객체를 저장한다.

 

Scanner도 클래스이기 때문에 import를 해야 사용할 수 있다.

import java.util.Scanner;

위의 객체를 생성할 때 new Scanner(System.in) 자동 import키(Ctrl + Shift + o)를 누르면 보다 간편하게 import할 수 있다.

 

문자열 : next( )

import java.util.Scanner;

public class Ex02Scanner {
	
	public static void main(String[] args) {
		
		Scanner scan = new Scanner(System.in); 
		
		System.out.print("단어 입력 >> ");
		String word = scan.next(); 
		System.out.println("word : " + word);
		System.out.println();
		
	}

}

next( )는 문자열을 입출력할 때 사용하는 메서드이다. 공백(띄어쓰기, 엔터) 전까지 입력된 1개의 단어를 처리한다.

문자열 중 한 개의 문자만 출력하고 싶으면 next( ).charAt(index) 메서드를 사용하면 된다.

System.out.print("문자 입력 >> ");
char ch = scan.next().charAt(0);
System.out.println("ch : " + ch);
System.out.println();

위와 같이 작성하면 입력한 단어의 첫 번째 문자를 출력한다. index의 시작이 1이 아닌 0이라는 것을 기억하자.

*charAt( )은 Scanner class의 메서드가 아니라 String class의 메서드

 

정수형 : nextInt( )

import java.util.Scanner;

public class Ex02Scanner {
	
	public static void main(String[] args) {
		
		Scanner scan = new Scanner(System.in); 
		
		System.out.print("숫자 입력 >> ");
		int ia = scan.nextInt(); 
		System.out.println("ia : " + ia);
		System.out.println();
		
	}

}

nextInt( )는 정수형을 입출력할 때 사용하는 메서드이다. 공백(띄어쓰기, 엔터) 전까지 입력된 1개의 단어가 int 타입에 맞으면 정수로 처리한다. next( )에서는 숫자를 입력해도 에러 없이 숫자를 출력해주지만, nextInt( )에서는 정수형이 아닌 문자열이나 실수형을 입력하면 에러가 발생한다.

 

실수형 : nextDouble( )

import java.util.Scanner;

public class Ex02Scanner {
	
	public static void main(String[] args) {
		
		Scanner scan = new Scanner(System.in); 
		
		System.out.print("실수 입력 >> ");
		double da = scan.nextDouble();
		System.out.println("da : " + da);
		System.out.println();
		
	}

}

nextDouble( )은 실수형을 입출력할 때 사용하는 메서드이다. 공백(띄어쓰기, 엔터) 전까지 입력된 1개의 단어가 숫자 타입에 맞으면 실수로 처리한다. nextInt()와 마찬가지로 문자열을 입력하면 에러가 발생한다. 하지만 정수형 값을 입력하면 에러가 뜨지않고 실수형으로 반환한다. ex) 3 입력시 3.0으로 출력

 

문장 : nextLine( )

import java.util.Scanner;

public class Ex02Scanner {
	
	public static void main(String[] args) {
		
		Scanner scan = new Scanner(System.in); 
		
		System.out.print("문장 입력 >> ");
		String stn = scan.nextLine();
		System.out.println("stn : " + stn);
		
	}

}

nextLine( )은 띄어쓰기를 포함한 문장을 입출력할 때 사용하는 메서드이다. 엔터 전까지 입력된 문장을 처리한다.

 

next( ), nextInt( ), nextDouble( )은 엔터를 사용하지 않는 메서드라 연달아 써도 상관없지만, nextLine( )은 앞의 메서드들과 달리 엔터를 명백히 구분하고 있기 때문에 연달아 쓸 경우 원하는대로 값을 입력할 수 없다.

import java.util.Scanner;

public class Ex02Scanner {
	
	public static void main(String[] args) {
		
		Scanner scan = new Scanner(System.in); 
		
		System.out.print("단어 입력 >> ");
		String word = scan.next();
		System.out.println("word : " + word);
		System.out.println();
		
		System.out.print("숫자 입력 >> ");
		int ia = scan.nextInt();
		System.out.println("ia : " + ia);
		System.out.println();
		
		System.out.print("실수 입력 >> ");
		double da = scan.nextDouble();
		System.out.println("da : " + da);
		System.out.println();
		
	}

}

-> 무리없이 원하는대로 작동

 

import java.util.Scanner;

public class Ex02Scanner {
	
	public static void main(String[] args) {
		
		Scanner scan = new Scanner(System.in); 
		
		System.out.print("단어 입력 >> ");
		String word = scan.next();
		System.out.println("word : " + word);
		System.out.println();
		
		System.out.print("문장 입력 >> ");
		String stn = scan.nextLine();
		System.out.println("stn : " + stn);
		
	}

}

-> 엔터값(\r\n)이 이미 버퍼에 들어가있어서 "문장 입력 >> "에 대한 입력값을 작성할 수 없음

 

지난 시간에 배웠던 read( ) 메서드와 동일한 경우라고 생각하면 된다. read( ) 메서드는 이런 상황을 해결하기 위해 skip( ) 메서드를 사용했다. 하지만 nextLine( )에서는 skip( ) 메서드를 사용할 수 없다. 그렇다면 어떻게 해야 할까? 정답은 nextLine( )을 한 번 더 사용함으로써 버퍼를 비워주는 것이다.

 

import java.util.Scanner;

public class Ex02Scanner {
	
	public static void main(String[] args) {
		
		Scanner scan = new Scanner(System.in); 
		
		System.out.print("단어 입력 >> ");
		String word = scan.next();
		System.out.println("word : " + word);
		System.out.println();
		
		System.out.print("문장 입력 >> ");
 		scan.nextLine();
		String stn = scan.nextLine();
		System.out.println("stn : " + stn);
		
	}

}

scan.nextLine( ) 코드를 넣어서 버퍼를 비워준 후에 String stn 변수를 생성하면 원하는대로 문장 입력을 할 수 있게 된다.