본문 바로가기
JAVA/JAVA

사용자 입/출력과 버퍼(butter) - nextInt() 사용 시 주의 점

by 개미가되고싶은사람 2024. 3. 11.

사용자 입/출력을 받는 간단한 코드를 작성하고 있었는데 사용자 입력을 한 번더 받아야 되는데 스킵되는 뜻밖에 오류가 발생했다. 그래서 사용자 입/출력에 대해서 검색을 조금 해봤다.

 

이 문제를 해결하기 위해서는 일단 Butter에 대해서 알아야 한다.

 

버퍼(Butter)란

버퍼를 말하기 앞써 버퍼가 왜 존재하지는 알고가면 좋다고 생각해서 버퍼가 왜 존재하는지 알아보자

 

버퍼가 왜 존재할까?

컴퓨터의 성능에 다르겠지만 컴퓨터가 1초에 약 8천 ~ 1억 번 정도의 연산을 처리할 수 있다고 가정해보자

만약, 컴퓨터가 사용자에게 정보를 입력 받아야할 때, 우리가 정보를 모두 입력하기를 기다려야 한다면, 컴퓨터는 그동안 계속 대기하고 있어야 한다. 
컴퓨터 입장에서는 나는 1초에 엄청 많은 연산을 처리할 수 있는데 사용자가 입력을 하기 전까지 대기한다면 엄청 답답할 것이다. 그래서 "버퍼"라는 개념이 등장하게 되었다.

어떤 변수에 사용자 입력 값을 저장할 때, 하나하나 차례로 저장하는 것이 아닌 임시로 버퍼에 저장해 두었다가 모든 입력이 완료되면(사용자가 엔터키를 누름) 한 번에 변수에 저장시키는 것이다. 입력을 하는 그 사이사이 시간에 컴퓨터는 다른 일을 하고 있을 수 있다. 즉 다중 작업을 수행할 수 있게 된다.

'hello'라는 문자를 사용자에게 입력 받는다고 가정하자.

사용자가 입력할때 마다 버퍼에는 문자가 하나씩 쌓이기 시작한다.

 

버퍼의 상태 변화

'h'입력 h        
'e'입력 h e      
'l'입력 h e l    
'l'입력 h e l l  
'o'입력 h e l l o
사용자 입력 종료

사용자가 "hell"를 다 입력하기 전까지 컴퓨터는 다른 작업을 처리할 수 있다.

사용자가 엔터키를 누르는 순간, 입력이 끝난 것으로 간주하고 버퍼에는 엔터를 포함해서 차례로 "hello\n"가 남게 된다.

이때 사용자가 엔터키를 눌러 "\n"도 같이 저장되는 것이 중요한 포인트다

nextInt()와 nextLine() 메소드 비교

nextInt() 메서드는 버퍼에 남아있는 연속된 숫자만 리턴한다.

이러한 특징 때문에 nextInt()메소드를 사용할 때 주의해야 한다.

 

만약 사용자가 111를 입력한다고하면

버퍼에는 "111\n"이 저장된다. 앞써 말한대로 nextInt()메소드는 연속된 숫자만 가져오기 때문에 여기서 "\n"를 제외하고 "111"만 가져오게 된다.

이렇게 되면 버퍼에는 아직 "\n"이 남아있기 때문에 다음에 입출력 메소드를 사용할 때 문제가 발생한다.

 

정확한 이해를 위해 예시를 한 번 보자

int num = sc.nextInt();

String str = sc.nextLine();

 

만약 버퍼에 개념을 모르는 개발자가 해당 코드를 보면

아 사용자한테 숫자 입력을 한 번 받고 그 다음에 문자를 받겠구나 할 수 있겠지만

처음에 사용자가 숫자를 입력하고 버퍼에 아직 "\n"이 남아있기 때문에

str변수에는 아무것도 입력할 수가 없다.

 

nextInt()메소드를 사용할 때 버퍼에 "\n"이 남아있기 때문에 sc.nextLine()메소드를 사용해 버퍼를 비워줘야 된다.