이건 내 코드 중 일부인데,
public void update() {
String forBugFix;
System.out.print("수정할 글번호를 입력해 주세요.");
Long id = scanner.nextLong();
BoardDTO searchBoard = boardRepository.read(id);
if (searchBoard == null) {
System.out.println("해당 게시글이 존재하지 않습니다.");
} else {
forBugFix = scanner.nextLine();
System.out.print("비밀번호를 입력해 주세요.");
String boardPassword = scanner.nextLine();
if (boardPassword.equals(searchBoard.getBoardPass())) {
System.out.println(searchBoard);
System.out.print("수정할 제목을 입력해 주세요.>");
String boardHead = scanner.nextLine();
System.out.print("수정할 내용을 입력해 주세요.");
String boardContents = scanner.nextLine();
boolean result = boardRepository.update(id, boardHead, boardContents);
if (result) {
System.out.println("수정이 완료되었습니다.");
} else {
System.out.println("수정 실패!");
}
}
}
}
여기 보면 nextLong() 다음에 nextLine()이 나오는 것을 볼 수 있다.
nextLong은 공백을 제외한 숫자를 Long타입으로 입력받는데, 예를들어 1을 입력하고 Enter를 입력하게 되면, 1\n으로 입력받게 된다. 그렇다면 id에는 1만 입력되고 \n은 버퍼에 남게 되는데, 이는 다음에 나오는 nextLine()에 반영되어 boardPassword에 \n이 입력되버리는 현상이 생긴다. 이를 막기 위해 String forBugFix;를 설정하고, nextLong 다음에 입력받는 공백을 처리했다. 사실 모든 입력을 nextLine으로 받아 필요할 때마다 형변환을 해주는방법이 편할지도 모르겠다. 하지만 전부 nextLine으로 사용한다면, next(),nextInt,nextLong이 필요한 상황에서 못 쓸 상황이 나올 수도 있으므로, 개념 자체를 이해해 두는 편이 좋겠다.