Scanner 클래스

박영준·2023년 4월 16일
0

Java

목록 보기
67/112

1. 정의

  • 기본적인 데이터 타입들을 Scanner 의 메소드를 사용하여 입력받을 수 있다.

    • 100을 입력하고자 할 때,
      String(문자열)로 입력받고 싶으면, next() 나 nextLine() 을
      int(정수)로 입력받고 싶다면, nextInt() 를 사용하여 입력받으면 알아서 해당 타입으로 입력된다.
  • 공백(띄어쓰기) or 개행(줄 바꿈)을 기준으로 읽는다.

    • Scanner 의 입력 메소드들은 대부분 공백과 개행(' ', '\t', '\r', '\n' 등등..)을 기준으로 읽는다.
    • 사용자의 편의에 따라 쉽게 입력을 받을 수 있는 장점
  • 입출력 스트림 (X)
    보조 스트림 (X)
    문자 파일/바이트 기반 입력 스트림에서 라인 단위 문자열을 쉽게 읽기 위한 클래스 (O)

2. 사용법

1) Scanner 클래스 호출하기

import java.util.Scanner;
  • Scanner 를 사용할 시, java.util 패키지에서 Scanner 클래스를 호출해야 한다.
    • Java 에서 쓰이는 대부분의 클래스 : lang 패키지에 있다. (이 패키지에 없다면, import 을 통해 호출해주어야 함)
    • Scanner 의 경우 : java.util 패키지에 있다. → import 를 쓴 후, 해당 클래스 경로를 호출

2) Scanner 클래스의 객체 생성하기

// 문법
클래스_이름 객체_이름 = new 클래스_이름();

// 예시 : 생성된 Scanner 를 in 변수에 저장
Scanner in = new Scanner(System.in);
  • 바이트 기반 입력 스트림으로부터 scanner 를 생성

  • Scanner 라는 클래스를 사용할 것이기 때문에, 클래스 이름에는 Scanner 가 들어가야 한다.

  • 객체 이름은 편한 대로 지정하면 되나, 일반적으로 Scanner 의 경우 객체 이름은 in, input, sc, scan 4가지가 가장 많이 쓰인다.

  • Scanner 을 생성할 때는 System.in 이 들어간다.

    • System.in : 사용자로부터 입력을 받기 위한 입력 스트림
      → Scanner 뿐만 아니라 다른 입력 방식들도 사용자로부터 입력을 받기 위해서는 System.in 이 들어간다.

3) 메소드를 이용하여 입력 및 저장

문법

in.nextByte()		// byte 형 입력 및 리턴
in.nextShort()		// short 형 입력 및 리턴
in.nextInt()		// int 형 입력 및 리턴
in.nextLong()		// long 형 입력 및 리턴
 
in.nextFloat()		// float 형 입력 및 리턴
in.nextDouble()		// double 형 입력 및 리턴
 
in.nextBoolean()	// boolean 형 입력 및 리턴
 
in.next()			// String 형 입력 및 리턴	(공백을 기준으로 한 단어를 읽음)
in.nextLine()		// String 형 입력 및 리턴 (개행을 기준으로 한 줄을 읽음)

예시

import java.util.Scanner;	// Scanner 클래스 호출
 
public class Main {
	public static void main(String[] args) {
 
		Scanner in = new Scanner(System.in);	// Scanner 객체 생성
 
		byte a = in.nextByte(); 		// byte 형 입력 및 리턴
		short b = in.nextShort(); 		// short 형 입력 및 리턴
		int c = in.nextInt(); 			// int 형 입력 및 리턴
		long d = in.nextLong(); 		// long 형 입력 및 리턴
 
		float e = in.nextFloat(); 		// float 형 입력 및 리턴
		double f = in.nextDouble(); 	// double 형 입력 및 리턴
 
		boolean g = in.nextBoolean(); 	// boolean 형 입력 및 리턴
 
		String h = in.next(); 			// String 형 입력 및 리턴 (공백(띄어쓰기)을 기준으로 한 단어를 읽음)
		String i = in.nextLine(); 		// String 형 입력 및 리턴 (개행(줄 바꿈)을 기준으로 한 줄을 읽음)
	}
}
  • String i = in.nextLine()

    • 입력 받은 내용은 i 에 저장
  • Scanner 는 보조 스트림 없이, 쉽게 라인 단위 문자열을 읽기 위해 nextLine() 메소드를 제공함

  • 기본적으로 next + Type() 의 조합으로 사용된다. (nextInt(), nextDouble(), next(), nextLine() ...)

    • 단, char 형(문자)타입의 경우, 메소드가 따로 없으므로 String으로 받은 후 charAt() 메소드로 문자로 반환해야한다.

next()

예시 1 : Cat

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
    
    	Scanner in = new Scanner(System.in);
        
        String str = in.next();
        
        System.out.println(str);
   }
}

/* 입력 내용
Cat is perfect animal */

/* 출력 결과
Cat */

예시 2 : Cat is perfect animal

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
    
    	Scanner in = new Scanner(System.in);
        
        String str1 = in.next();
        String str2 = in.next();
        String str3 = in.next();
        String str4 = in.next();
        
        System.out.println(str1);
        System.out.println(str2);
        System.out.println(str3);
        System.out.println(str4);
   }
}

/* 입력 내용 1
Cat is perfect animal */

/* 출력 결과 1
Cat
is
perfect
animal */

/* 입력 내용 2 : 한 문장당 한 개행씩 입력하더라도, 출력 결과1 과 동일한 결과가 나온다
Cat
is
perfect
animal */

/* 출력 결과 2
Cat
is
perfect
animal */
  • '한 단어'

  • 공백을 기준으로 문장 한 개만 읽는다.
    → 예시 2 처럼 출력 하기 위해서(4개의 문장을 모두 읽기)는 next() 을 4번 써주어야 한다.

예시 3 : 특정 곱만 제외하는 구구단

import java.util.Scanner;

public class W01 {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int passNum = sc.nextInt();			// 출력 제외 할 구구단 값
        
        for (int i = 2; i <= 9; i++) {
            if (i == passNum) {
                continue;
            }
            
            for (int j = 2; j <= 9; j++) {
                System.out.println(i + "곱하기" + j + "는" + (i * j) + "입니다.");
            }
        }
    }
}

/* 입력
2
*/

/* 출력 결과 (2의 곱셈을 제외하고 모두 출력됨)
3곱하기2는6입니다.
...
7곱하기8는56입니다.
...
9곱하기8는72입니다.
9곱하기9는81입니다.
*/

예시 4 : 특정 곱만 출력하는 구구단

import java.util.Scanner;

public class W01 {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int passNum = sc.nextInt();             // 특정 구구단만 출력 할 값

        for (int i = 2; i <= 9; i++) {
            for (int j = 2; j <= 9; j++) {
                if (i == passNum) {
                    System.out.println(i + "곱하기" + j + "는" + (i * j) + "입니다.");
                }
            }
        }
    }
}

/* 입력
2
*/

/* 출력 결과 (2의 곱셈만 모두 출력됨)
2곱하기2는4입니다.
2곱하기3는6입니다.
2곱하기4는8입니다.
2곱하기5는10입니다.
2곱하기6는12입니다.
2곱하기7는14입니다.
2곱하기8는16입니다.
2곱하기9는18입니다.
*/

nextLine()

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
    
    	Scanner in = new Scanner(System.in);
    
    	String str = in.nextLine();
        
    	System.out.println(str);
	}
}

/* 입력 내용
Cat is perfect animal */

/* 출력 결과
Cat is perfect animal */    
  • '한 줄'

  • 한 줄에 입력된 여러 문장들을 읽는다.
    → nextLine() 에는 공백이 무의미하다!

next() & nextLine()

잘못된 코드

// 예시 1
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
    
    	Scanner in = new Scanner(System.in);
    
    	String str1 = in.next();
    	String str2 = in.nextLine();
        
    	System.out.println(str1);
        System.out.println(str2);
	}
}

/* 입력 내용
Cat is perfect animal */

/* 출력 결과
Cat
 is perfect animal */
  • next() 메소드 : Cat 까지 읽는다.
    → next() 에서 공백을 입력받으면, 공백 전 문자까지 읽어 들여 str1 에 저장

  • nextLine() 메소드 : 나머지 문자열을 읽는데, 두 번째 줄에 공백이 포함되어 나왔다.
    → nextLine() 을 쓰면, 남아있던 공백부터 한 줄을 읽기 때문에 str2 에는 공백부터 시작하여 한 줄을 읽어 들인 문자가 담긴다

// 예시 2
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
    
    	Scanner in = new Scanner(System.in);
    
    	String str1 = in.next();
        String str2 = in.next();
    	String str3 = in.nextLine();
        String str4 = in.nextLine();
        
    	System.out.println(str1);
        System.out.println(str2);
        System.out.println(str3);
        System.out.println(str4);
	}
}

/* 입력 내용
Cat is perfect animal */

/* 출력 결과
Cat
is
perfect
Cat
is

perfect */
  • next() 메소드 : st1 에는 "Cat" 이 저장되고, 다음 개행에서 "is" 를 읽어 str2 에 저장된다.

  • nextLine() 메소드

    • 한 줄을 읽는데, 앞선 is 다음에 입력한 개행(엔터)이 남아있던 것이 그대로 nextLine()에서 한 줄까지 읽는다는 메커니즘 때문에
      개행이 바로 str3 에 저장되고 다음 입력 줄로 넘어가 버린다.

올바른 코드

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
    
    	Scanner in = new Scanner(System.in);
    
    	String str1 = in.next();
        String str2 = in.next();
        in.nextLine();
    	String str3 = in.nextLine();
        String str4 = in.nextLine();
        
    	System.out.println(str1);
        System.out.println(str2);
        System.out.println(str3);
        System.out.println(str4);
	}
}

/* 입력 내용
Cat
is
perfect
animal */

/* 출력 결과
Cat
is
perfect
animal */
  • next() 다음 nextLine() 입력 사이에 nextLine() 을 추가한다.

참고: 자바 [JAVA] - 스캐너(Scanner) 클래스와 입력

profile
개발자로 거듭나기!

0개의 댓글