컴퓨터 언어에서 가장 기본적인 내용 중 하나는 많은 사람들이 알고 있듯 print문을 통해 Hello World를 출력해보는 것이다.
그래서 바로 이전 글에서 사용은 했지만 소개하지 않았던 print문을 사용하는 방법과
C언어에서의 scanf와 같은 기능을 사용하는 방법에 대해 소개해보려 한다.
저번 글에서 마지막에 객체만 생성해봤던 클래스가 있었다.
Scanner라는 클래스이다. 이 클래스를 이용하면 사용자의 키보드 입력을 받을 수 있다.
하지만, 그 전에 먼저 알아야할 내용이 있다.
충격적인 사실을 말하자면 Scanner클래스는 사실 사용자의 키보드 입력을 받을 수 있는 자체적인 기능이 없다.
그럼 이 녀석은 대체 어떻게 키보드 입력을 받을 수 있는 것일까??
내가 첫 글에서부터 사용했던 출력 기능을 다시 떠올려보자.
System.out.println();
위 코드와 같이 생긴 함수였다.
그럼, 반대로 생각해보면 System.in.~~~ 라는 형식의 함수도 있을 것이라고 추측해 볼 수 있다.
그래서 실제로 아래와 같은 함수가 존재한다.
System.in.read();
그런데 이 함수는 상당히 특이한 점이 있다.
바로 짧은 예를 통해 알아보자.
가령 아래와 같은 코드를 실행해봤다고 가정해보자.
int a;
a = System.in.read();
System.out.println(a);
나는 여기서 a에 123이라는 숫자를 넣고 싶다.
이 코드는 분명 123이라는 입력을 받아서 화면에 123이라는 숫자가 출력되어야 한다.
먼저, 이 코드는 try - catch라는 문법을 사용해야만 실행할 수 있는 코드인 것도 있지만(이는 지금 설명할 계획이 없으므로 잠시 미뤄두자)
내가 123을 넣든 134를 넣든 156을 넣든 같은 48이라는 숫자가 출력된다.
왜 이럴까? System.in.read()는 무조건 입력된 데이터를 한 문자(char)로 보고 하나씩 읽어온다.
그럼 위의 코드는 어떻게 동작되었던 걸까??
나는 123, 134, 156... 앞 자리가 1인 세 자리수를 입력했지만 사실 컴퓨터는 맨 앞자리의 수인 1만 입력으로 인식한 것이다.
여기서 다시금 이상한 점이 있다. 아 그럼 맨 처음 한 글자만 인식하는 건 알겠는데 왜 1이 안나오고 48이 나오냐고 할 것이다.
이 함수는 무조건 char형으로 입력을 받기 때문에 그에 해당하는 아스키 코드값이 출력되는 것이다.
자 그럼 만약 우리가 세자리 수를 입력받으려 한다면 어떻게 해야할까
int a;
int num;
a = System.in.read();
num = num + (a-48)*100;
a = System.in.read();
num = num + (a-48)*10;
a = System.in.read();
num = num + (a-48);
이런 코드가 필요할 것이다.
그런데 이는 3자리수만 받을 수 있다. 그럼 4자리 5자리... n자리수는 어떻게 받아야될까 이 복잡한 코드가 훨씬 길어질 것이다.
그래서 System.in을 통해 입력한 한 문자들을 원하는 자료형으로 변환해주는 기능을 가진 객체를 사용하면 훨씬 편할 것이다.
드디어 Scanner클래스를 소개해보려고 한다.
저번 글에서는 설명하지 않았던 Scanner 객체를 생성할 때 왜 이렇게 생성하는 지에 대해 드디어 설명할 수 있게 되었다.
Scanner sc = new Scanner(System.in);
이 글의 도입부에서 내가 Scanner는 직접적으로 입력을 받을 수 있는 기능이 없다고 얘기했는데
바로 위의 코드를 보면 이해할 수 있을 것이다.
Scanner는 System.in이라는 녀석을 가지고 있어야 키보드 입력을 받을 수 있다.
Scanner는 내가 System.in을 통해 입력받은 데이터를 형변환해주는 객체라고 생각하면 편할 것이다.
그럼 여러 자료형으로 입력받는 예를 보도록 하자.
Scanner sc = new Scanner(System.in);
int a;
a = sc.nextInt();
System.out.println(" a : " + a);
double b;
b = sc.nextDouble();
System.out.println(" b : " + b);
boolean c;
c = sc.nextBoolean();
System.out.println(" c : " + c);
원하는 자료형을 입력받을 때는 해당 자료형에 맞는 함수를 사용하면 된다.
그런데 sc.nextInt()같은 문법은 뭔지 모를 사람도 있을 것이다.
단순하게 sc라는 참조변수를 통해 Scanner객체를 제어하니까 그 안에 정의된 함수까지 내가 .연산자를 통해 사용한다고 생각하면 된다.
여기서 왜 한 문자(char)를 입력받는 함수는 안 썼냐. 그런 기능이 없는 거냐고 물어볼 사람도 있을 것이다.
없다. 그래서 문자열로 입력을 받아 그 중 한 글자를 빼오는 방식을 사용한다.(이 내용은 나중에 다룰 것이다)
이제 순서가 조금 뒤바뀐 것 같지만 print에 대해서도 설명해보려 한다.
C언어와 비교해 크게 바뀐 것은 없을 것이다.
System.out.println();
System.out.print();
System.out.printf();
첫 문장부터 소개해보겠다.
println은 한 문장 단위로 출력하는 함수이다. 쉽게 생각하면 뒤에 \n을 해준다고 보면 된다.
print는 \n을 자동으로 해주지 않고 출력해주는 함수이다.
printf는 가장 익숙할 것이다. 알다시피 서식문자를 통해 출력이 가능하다. 하지만, 실수형은 모두 %f로 사용한다.
'Language > Java' 카테고리의 다른 글
Java에서의 String 소개 - 2 (0) | 2022.02.11 |
---|---|
Java에서의 String 소개 - 1 (0) | 2022.02.09 |
짧은 객체지향 프로그래밍 소개 (0) | 2022.02.01 |
Java 참조 자료형과 출력 예제 (0) | 2022.01.29 |
Java 기본 자료형 - 2 (0) | 2022.01.28 |