1. next(); 또는 nextInt(); 사용 후 nextLine(); 에서 개행문자 무시 문제가 발생하는 경우
해결책 : nextInt(); 후에 nextLine(); 을 하나 더 호출 후 본래 호출하고자 했던 next~~(); 를 작성
이유 : nextInt(); 에서 입력 버퍼에 남겨둔 엔터를 제거해야하기 때문임.
* nextLine 과 다른 next~~ 의 차이
- nextLine 은 [엔터] 앞에 [값]을 가져오면서 입력 버퍼에서 [값 + 엔터] 를 모두 비우는 반면
- next~~ 은 [엔터]를 무시하고 [값]을 가져오면서 입력 버퍼에서 [값] 만 비우고 [엔터]를 그대로 남겨둔다. 그로 입력 버퍼에는 [엔터] 가 남아있게 된다.
* nextInt 다음 또 nextInt 가 올 경우
- nextInt 를 호출하고 나면 입력 버퍼에 [엔터]를 남기지만
- 다음 nextInt 에서 [값]을 가져올 때 [엔터]를 무시하기 때문에 입력 버퍼에서 [엔터]를 비울 필요가 없다.
원리와 해결책 : https://blog.naver.com/pjhkim0408/222764958316
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 |