본문 바로가기

JAVA

[JAVA] 4. Scanner

1. next(); 또는 nextInt(); 사용 후 nextLine(); 에서 개행문자 무시 문제가 발생하는 경우

 

해결책 : nextInt(); 후에 nextLine(); 을 하나 더 호출 후 본래 호출하고자 했던 next~~(); 를 작성

이유 : nextInt(); 에서 입력 버퍼에 남겨둔 엔터를 제거해야하기 때문임.

 

* nextLine 과 다른 next~~ 의 차이

- nextLine 은 [엔터] 앞에 [값]을 가져오면서 입력 버퍼에서 [값 + 엔터] 를 모두 비우는 반면

- next~~ 은 [엔터]를 무시하고 [값]을 가져오면서 입력 버퍼에서 [값] 만 비우고 [엔터]를 그대로 남겨둔다. 그로 입력 버퍼에는 [엔터] 가 남아있게 된다.

 

* nextInt 다음 또 nextInt 가 올 경우

- nextInt 를 호출하고 나면 입력 버퍼에 [엔터]를 남기지만

- 다음 nextInt 에서 [값]을 가져올 때 [엔터]를 무시하기 때문에 입력 버퍼에서 [엔터]를 비울 필요가 없다.

 

원리와 해결책 : https://blog.naver.com/pjhkim0408/222764958316

 

sc.nextInt( ) 후 sc.nextLine( ) 입력

nextLine은 분리자(여기선 enter, space, tab 등을 칭한다고 하겠다.)을 모두 읽어오고 거기서 개행문자(e...

blog.naver.com

 

2. next(); 에서 문자열이 아닌 문자를 사용하고 싶은 경우

 

우선 next 메소드에서 char 는 없다! 즉, nextChar(); 는 존재하지 않는다는 것

그렇다면 스캐너 클래스를 이용해 하나의 글자만 추출하고 싶은 경우는 어떻게 해야할까?

 

해결책 : nextLine().charAt(인덱스 번호); 를 사용한다. 여기서 인덱스 번호란 글자의 자릿 수를 의미한다.

이유 : charAt(); 은 앞 서 제시된 글자의 자릿수를 추출하는 역할을 한다.

 

 

'코딩을 배우다 보면 새로운 정보가 들어오는 만큼 오래된 정보들이 기억속에서 흐릿해지거나 새로운 정보와 이상하게 결합해서 왜곡되는 일이 발생하는 것 같다. 새로운 개념을 암기하는 걸 넘어서 이해하는게 필요하다. 원리나 방식 등을 최대한 탐색해보겠다!'

 

그런 의미에서 곧바로 복습

package com.br.variable;

import java.util.Scanner;
// 자바에 기본적으로 탑재되어 있는 클래스다. 어디에 있는진 모르겠지만..
// 임폴트 선언문으로 
// 자바 패키지. 유틸 패키지. 스캐너 클래스의 위치를 선언.

public class B_KeyboardInput {
// 클래스 위치는 키보드인풋

	public void inputScanner1() {
    일반 메소드 인풋스캐너1 선언
		
		/*
		 * 자바에서 제공하고 있는 java.util.Scanner 클래스
		 * 사용자가 키보드로 입력하 값을 읽어들일 수 있음
		 * 
		 * 다른 클래스에 있는 메소드 호출시에는
		 * 1) 클래스 생성
		 * 2) 메소드 호출
		 */
		Scanner sc = new Scanner(System.in);
        //클래스 스캐너를 변수 sc로 선언 = 스캐너 클래스를 생성
        //곧 생성된 스캐너 클래스가 변수 sc의 값이 된다.
        //스캐너를 사용할 때 System.in 이 사용된다
		
		System.out.print("당신의 이름은 무엇입니까 : ");
        //출력문 이건 익숙
		
		// 사용자가 입력한 값을 문자열로 읽어들이는 메소드 (next(), nextLine())
		//String name = sc.next(); // 공백 이전까지의 값만 읽어들임
		String name = sc.nextLine(); // 사용자가 입력한 한 줄 전체를 읽어들임
		//참조자료형(string) 변수(name) = sc(앞서 생성한 스캐너 클래스).넥스트라인(문자열 읽어드림) 
        
        
		System.out.print("당신의 나이는 몇살입니까(숫자만 입력) : ");
		int age = sc.nextInt(); // 오직 정수 값만 입력 가능하기 때문에 10'살' 같은 것은 입력 불가함.
		
		System.out.print("당신의 키는 몇입니까(cm단위, 소수점 첫째 자리까지만) : ");
		double height = sc.nextDouble(); // 사용자가 입력한 값을 실수 값으로 읽어들임
		
		// 000님은 00살이며, 키는 000.0cm입니다.
		System.out.print(name + "님은 " + age + "살이며, 키는 " + height + "입니다.");
	
	}
	
	public void inputScanner2() {
		
		Scanner sc = new Scanner(System.in);
		
		System.out.print("이름 : ");	
		String name = sc.nextLine();
		
		System.out.print("나이 : ");
		int age = sc.nextInt();

		sc.nextLine();
		
		System.out.print("주소 : ");
		String address = sc.nextLine();
		
		System.out.print("키 : ");
		double height = sc.nextDouble();
		
		System.out.print(name + "님은 " + age + "살이며, " + "사는 곳은 " 
							+ address + "이고, " + "키는 " + height + "cm입니다.");
		
		/*
		 * sc.nextLine() : 값을 가져온 후 '엔터'를 비워주는 역할
		 * 그 외 메소드(next, nextInt, ..) : 값을 가져온 후 '엔터'를 남겨놓는다
		 * 
		 * 그 외에 메소드 뒤에 next()이 오게 될 경우
		 * 버퍼에 남아있는 '엔터'를 nextLine()이 인식해서 사용자가 값을 입력했다고 인지
		 * => 곧바로 읽어들임
		 * 
		 * 해결방법 : 그 외의 메소드 뒤에 sc.nextLine()이 오게 될 경우 버퍼에 남아있는 '엔터'를
		 * 비워줘야함.
		 */
		
	}
	
	public void inputScanner3() {
		
		Scanner sc = new Scanner(System.in);
		
		// 문자열을 입력 받을 때 => sc.nextLine()
		// 정수 값을 입력 받을 때 => sc.nextInt()
		// 실수 값을 입력 받을 때 => sc.nextDouble()
		
		System.out.print("이름 : ");
		String name = sc.nextLine();
		
		System.out.print("성별(M/F) : ");
		// char gender = sc.nextChar(); nextChar 는 없다!
		// 문자값을 읽어들이고자 할 경우
		// 먼저 문자열로 읽어들인 후 특정 인덱스의 문자 하나만 추출
		char gender = sc.nextLine().charAt(0);
		// 문자열.charAt(뽑고자 하는 인덱스); => 해당 문자열로부터 해당 인덱스의 문자 하나를 추출
		
		System.out.print("나이 : ");
		int age = sc.nextInt();
		
		System.out.print("키(cm 단위, 소수점 첫번째 자리까지) : ");
		double height = sc.nextDouble();
		
		System.out.println(name + "님의 개인정보");
		System.out.println("성별 : " + gender);
		System.out.println("나이 : " + age + "살");
		System.out.println("키 : " + height + "cm");
		
	}
	
	public void charAtTest() {
		String fruit = "apple"; // 5글자 (0~4 5개의 인덱스)
		char ch = fruit.charAt(2); // apple 에서 3번째 문자
		System.out.println(ch);
		System.out.println(fruit.charAt(4)); 
		// 범위에 벗어난 인덱스에 접근시
		// => StringIndexOutOfBoundException
		
	}

	public void practice() {
		// 사용자에게 상품명(String), 브랜드명(String), 가격(int), 
		// 제조국가(String), 할인율(double), 등급(A~D)(char)
		
		Scanner sc = new Scanner(System.in);
		
		System.out.print("상품명 : ");
		String item = sc.nextLine();
		
		System.out.print("브랜드명 : ");
		String brandName = sc.nextLine();
		
		System.out.print("가격 : ");
		int price = sc.nextInt();
		
		sc.nextLine(); // 입력 버퍼에서 엔터 제거
		
		System.out.print("제조국가 : ");
		String national = sc.nextLine();
					
		System.out.print("할인율 : ");
		double discount = sc.nextDouble();
		
		sc.nextLine();
		
		System.out.print("등급(A~D) : ");
		char grade = sc.nextLine().charAt(0);
				
		System.out.print("상품명은 " + item + "이고 " + brandName + "제품이며 가격은 " + price + "원 입니다. 제조국가는 " + national + "이고 " + discount*100 + "% 할인하는 제품입니다. 등급은 " + grade + "등급 제품입니다.");
	}
	
}

'JAVA' 카테고리의 다른 글

[JAVA] 06. 연산자  (0) 2022.10.17
[JAVA] 05. 형변환  (0) 2022.10.17
[JAVA] 3. 변수  (1) 2022.10.13
[JAVA] 2. 다른 클래스에 있는 메소드 호출하기  (0) 2022.10.13
[JAVA] 1. Package&Class 생성  (0) 2022.10.13