ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 오버플로우, 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
Designed by Tistory.