티스토리 뷰

저를 포함한 초보자 분들에게 도움이 됐으면 좋겠습니다.
초보자 분들은 수박 겉핥기 식으로 알고 넘어가지 마시고, 조금이라도 왜 이렇게 프로그램이 돌아가는지알고 가시는 시간이 됐으면 좋겠습니다.

1. 자바 뜯어보기 - 출력편 다들 보고 오셨는지요? 안보고 오셨다면 한번 보고 오시는 것도 좋습니다.
http://sims-solve.tistory.com/1?category=747624

오늘은 출력편에 이어서 간단하게 사용되는 입력(Scanner)에 대해서 낱낱히 살펴보겠습니다.

2. 입력 뜯어보기
가장 손쉽게 할 수 있는 입력은 Scanner() 클래스를 사용 하는 것입니다.

(1)public static void main(String[] args) {	
		Scanner k = new Scanner(System.in);
		int age = k.nextInt();
		System.out.println(age);
		k.close();
		}

(1) 번 소스와 같이 Scanner를 선언해 주고, System.in을 하게 됩니다. 왜 System.in을 해주는 걸까요?
혹시 "입력은 그렇게 사용하니까!"라고 생각하셨어도 문제는 없습니다. 하지만 단순 암기로 코딩을 한다는 건 별로 좋지 않은 방법이죠. 왜 그런지 이유를 아는 것이 포스팅의 목적이므로 설명드리겠습니다.

바로 전편 < 1. 자바 뜯어보기 - 출력 편 >을 보신 분이라면 비슷한 것을 출력 편에서 보셨을 것입니다.
바로 System.out이라는 놈과 유사하지 않습니까? 네! 똑같습니다.

 (2)public static final InputStream in = null;

(2)소스와 같이 System 클래스에 선언돼있죠. 출력에서 설명했 듯이 시스템 내부에서 표준입력인 키보드를 나타냅니다. 반대로 System.out은 표준 출력인 콘솔을 나타내죠.
즉 키보드로 입력을 받겠다는 겁니다.

그럼 .nextInt()를 살펴봅시다.

 (3)public int nextInt(int radix) { 
      try {
            String s = next(integerPattern());
            if (matcher.group(SIMPLE_GROUP_INDEX) == null)
                s = processIntegerToken(s);
            return Integer.parseInt(s, radix);
          } catch (NumberFormatException nfe) {
            position = matcher.start(); // don't skip bad token
            throw new InputMismatchException(nfe.getMessage());
          }
}

이런식으로 정의되어있습니다.
next(integerPattern()) 내부적 실행을 거쳐 키보드로 입력을 받아 String s에다 저장을 합니다.
그 후로도 복잡한 과정을 통하여 결국엔 Integer.parseInt(값, 10진수); 이런식으로 
return을 해주네요. Integer.parseInt 는 단순히 글자를 숫자로 바꿔주는 역할을 합니다. 
아직까진 몰라도 상관없습니다!

마지막으로 (1)소스에 있는 .close()입니다! 

(4)
 private boolean closed = false;
 private Readable source;
public void close() {
        if (closed)
            return;
        if (source instanceof Closeable) {
            try {
                ((Closeable)source).close();
            } catch (IOException ioe) {
                lastException = ioe;
            }
        }
        sourceClosed = true;
        source = null;
        closed = true;
    } 

간단하게 코딩 되있네요.
soruce도 정의되어 있지 않지만, 시스템 내부적으로 source를 InputStreamReader로 만들어 주고 있습니다. InputStreamReader는 상위로 따라가다보면 Closeable을 implements 하고 있네요. 지금은 당연히 모르셔도 됩니다! 나중에 상속을 배우고 보시길 바랍니다.

소스에서 보듯, 사용을 다한 Scanner을 close하는 것입니다. 
Closeable.close는 스트림을 닫아주는 것입니다. 입력과 출력은 스트림을 통하여 진행되거든요.
더 이상 쓸모없는  Scanner의 스트림을 없애겠다는 소리죠!

지금까지 입력하기 위해 Scanner가 어떤식으로 돌아가는지 자세히 뜯어보았습니다.
어떠신가요? 혹시 지금까지 암기해서 사용하고 있으셨지 않으셨나요?
이번기회에 Scanner가 어떻게 돌아가는지 이해하고 넘어가시죠!

감사합니다.
다음은 입력편(InputStreamReader) 올리도록 하겠습니다!

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함