-
오버플로우, Scanner개발/자바JAVA 2024. 1. 17. 11:28
▶오버플로우
오버플로우란?? 물이 흘러 넘치다 라는 사전적 의미를 가지고 있다.
프로그래밍 언어에 적용해 보자면, 하나의 변수에 담을 수 있는 용량을 초과해 넘쳤다고 생각하면 된다!!
127까지 표현할 수 있는 byte를 사용해서 예시를 들어보자면
127에서 1을 더했더니 128이 되어 용량을 초과해버렸다.
그래서
이렇게 초과한 용량은 -128, 음수로 표현되는 것을 볼 수 있다.
▶Scanner
스캐너는 하나의 클래스이다
사용자로 부터 입력되는 정수, 실수, 문자열을 처리하는 자바에서 제공하는 클래스인데...
> 키보드로 입력받고 싶다면 자바에서 이미 제공하는 Scanner 클래스를 이용해야함.
> 나와다른 비범한 사람들이 미리 만들어둔 클래스를 그대로 import하기만 하면 된다.
> Scanner클래스 안에 작성되어 있는 유용한 메서드들을 호출해서 사용 가능하다.
import java.util.Scanner;
이렇게! 패키지와 클래스 선언부 사이에 코드를 넣으면 된다!
혹은
이렇게 풀 네임으로 객체를 생성해도 되는데,,, 추천하는 방법은 아니다.
java.util.Scanner sc = new java.util.Scanner();
아무튼 나는 위 방법대로 import했는데.
이렇게 빨간줄이 뜬다.
왜냐?
비범하신 선배님들이 ( ) 안에 System.in 이거 넣도록 만들었기 때문!
// System.in은 입력받은 값을 바이트 단위로 받아들이겠다 라는 의미이다.
이제 스캐너를 사용할 준비가 되었다.
●키보드 입력값 받기
스캐너를 받아오기 위해서는 정수, 실수, 문자열은 다르게 메서드를 만들어야한다.
> 정수 : sc.nextInt();
> 실수 : sc.nextFloat(); 또는 sc.nextDouble();
> 문자열 : sc.next(); 또는 sc.nextLine();
> next()는 띄어쓰기 입력불가, 띄어쓰기를 구분인자로 생각하여 각각 저장, 줄 구분까지 저장하지 않음
nextLine()은 문자열에 띄어쓰기 가능, 줄 구분까지 저장이렇게 콘솔창에 입력을 할 수 있게 되었다.
>하지만 얘만 작성하면 입력만 받고 끝남. 즉 변수에 입력받아 대입해야 사용할 수 있음.
그래서 변수를 만들어서 담아 보겠다.
Scanner sc = new Scanner(System.in); System.out.println("나마에와? : "); String name = sc.nextLine(); System.out.println("이름은? " + name);
이렇게 name 이라는 변수를 String 타입으로 만들어서 입력받은 값을 담아주었다.
systemput으로 잘 받아졌나 확인을 해보겠다.
잘 담아졌다.
※참고로 next();를 사용하면 띄어쓰기 뒤는 날라간다!!
그러니까 그냥 nextLine(); 쓰자.
▶다중 Scanner 씹힘 / Scanner 입력 오류/ 버퍼 이슈
이렇게 했다면
이름 : (입력)
나이 : (입력)
주소 : (입력)
이렇게 되야하지만,
이렇게 씹혀버린다 ㅠㅠ
왜그런가 하니
Scanner.nextInt()메소드가 사용자가 입력한 개행문자(엔터)를 제거하지 않기 때문!!
남겨진 앤터(개행문자)가 nextLine(_)의 입력으로 처리되어 위와같이 처리되는 것이다!
좀 더 자세히 알아보면
키보드에 입력을 하면 버퍼에 일단 입력이 된다.
String타입 변수는 stack영역에 공간을 만들어 두었다가 입력을 받으면 heap영역으로 최종적으로 저장을 한다.
그러면 버퍼에는 엔터가(입력받은 문자) 남게된다. (예를들면, 뉴비 를 쳤다가 앤터를 치니까 그 앤터까지 저장이 되는것)
근데 nextLine() 메서드에는 버퍼를 자동으로 비우는 기능이 기본적으로 있다.
하지만 nextInt() 메서드에는 그 기능이 없다.
그래서 nextLine()메서드를 실행할 때는 정상적으로 출력되지만, nextInt()메서드는 이렇게 오류가 나는 것이다.
그럼
해결법
방법1. nextLine() 메서드를 한번 더 실행시켜 준다.
잘 나온다.
방법 2.
Integer.parseInt()를 써준다.
끝!!
참고로 Integer.parseInt() 얘는 int 를 String 으로 바꿔주는 역할을 한다고 쉽게 생각하면 된다.
▶ChatAt() 메서드 활용
> 문자열로부터 x 번째 인덱스 글자만 추출해주는 메서드
>문자열 변수명.CharAt(뽑을인덱스값);
"문자열리터럴".CharAt(뽑을인덱스값);
char gender = sc.nextLine().charAt(0);
이렇게 뽑아 내었다!
참고로
※ 인덱스는 0부터 읽는다.
a p p l e
01 2 3 4 이렇게
'개발 > 자바JAVA' 카테고리의 다른 글
연산자 (1) 2024.01.18 출력메소드(printf) (0) 2024.01.18 변수(variable) (0) 2024.01.16 메인 메서드 호출 (0) 2024.01.16 코드의 흐름 (0) 2024.01.16