Media Log


1. 콘솔 출력(Console output)


우리가 알고있는 대표적인 출력 메소드는 System.out.println, System.out.print가 있습니다. 이미 두 메소드의 차이점을 알고 계실듯 한데, 두 메소드의 차이는 개행이 되느냐 마느냐에 있습니다. 


이번에는 System.out.printf 메소드에 대해 알아보려고 합니다. 아래 예제는 문자열을 구성하여 출력하는 System.out.printf의 예제입니다.


class printlnex {

  public static void main(String args[]) {

    int num1 = 60;

    int num2 = 70;


    System.out.printf("num1의 값은 %d, num2의 값은 %d입니다.", num1, num2);

  }

}


결과:

num1의 값은 60, num2의 값은 70입니다.


유심히 보셔야 할 부분은 6행 마지막의 num1, num2에 있습니다. System.out.printf는 문자열을 서로 조합하여 출력해주는 메소드인데, 문자열 뒤에 따라오는 데이터를 순서대로 배치합니다. 


위 그림같이, 첫번째의 %d에는 문자열 뒤에 따라오는 첫번째 데이터가 들어옵니다. 두번째 %d에는 두번째 데이터가요. 여기서 %d는 '서식문자'라는 것으로, 서식문자의 종류에는 %d를 포함한 여러가지의 서식문자가 존재합니다.


 서식문자

출력 형태 

%d 

부호 있는 10진수 정수

%o

부호 없는 8진수 정수 

%x

부호 없는 16진수 정수

%f

부호 있는 10진수 실수

%e

e 표기법 기반의 실수

%g

값에 따라 %e 또는 %i 선택 

%s

문자열 

%c

문자 

<서식문자 표>


그리고 문자열 내에서 특별한 의미로 해석되는 문자들을 가리켜 이스케이프 시퀀스(Escape Sequence)라고 합니다. 아래는 이스케이프 시퀀스를 정리한 표입니다. (이스케이프 시퀀스는 모두 \로 시작함.)


이스케이프 시퀀스

기능

\n

다음 줄로 넘어간다.

\t

수평 탭을 입력한다. 

\r 

캐리지 리턴 문자를 입력한다.

\f

용지 공급 문자를 입력한다. 

\b 

백스페이스를 입력한다.

\"

큰 따옴표를 입력한다. 

\\ 

역 슬래시를 입력한다. 

<이스케이프 시퀀스 표>


이번에는 이스케이프 시퀀스와 서식문자를 활용하여 예제를 작성해 보았습니다.


class Tutorial {

  public static void main(String args[]) {

    String name = "김철수";

    int age = 14;


    System.out.printf("안녕하세요. 제 이름은 %s 입니다.\n", name);

    System.out.printf("나나\b이는 \"%d\"살 입니다.", age);

  }

}


결과:

안녕하세요. 제 이름은 김철수 입니다.

나이는 "14"살 입니다.


코드를 보시면, 2행에서 문자열 변수 name이 선언되었고, 3행에서 10진수 정수형 변수 age가 선언되었으며 그 값들은 각각 김철수, 14로 초기화 되었습니다. 4행을 보시면 문자열 서식문자와 개행문자가 쓰였는데, name에 담긴 '김철수'라는 데이터를 앞의 문자열 서식문자 위치에 가져다 놓습니다. 그리고 개행문자(newline, \n)에 의해 다음 줄로 넘어갑니다. 5행에서는 백스페이스(backspace, \b)로 인해 앞의 '나'가 지워지고 \"로 인해 큰 따옴표가 출력되게 됩니다. 주의하실 점은 큰따옴표는 그냥 적으시면 에러가 발생합니다. 만약에 \을 지우게 된다면 "나이는"14"살 입니다."로 인식하여 컴파일 에러가 발생하게 됩니다.


2. 콘솔 입력(Console input)


이제 출력에 대해 알았으니, 사용자가 입력한 데이터를 받을때 사용되는 Scanner 클래스에 대해 알아보도록 하겠습니다. Scanner 클래스는 C언어의 scanf와 비슷한 형태의 입력을 지원합니다. 우선 Scanner의 예제를 보겠습니다.


import java.util.Scanner;


class scantutorial {

  public static void main(String args[]) {

    Scanner sc = new Scanner(System.in);

    int data = sc.nextInt();


    System.out.println("사용자가 입력한 데이터: " + data);

  }

}


결과:

500

사용자가 입력한 데이터: 500


코드를 보시면, 1행에서 java.util 패키지를 import 하여 Scanner 클래스를 사용합니다. 그리고 5~6행을 보시면 Scanner 객체가 생성되었고 사용자에게 입력값을 받은 뒤에 데이터가 nextInt 메소드로 인해 Int형으로 반환되어 data에 저장됩니다. 그리고 8행에서 그 data의 값을 출력시킵니다. 만약 입력받는 데이터의 형태가 실수라면 nextDouble 메소드를 사용하면 되고, 문자열이라면 nextLine이나 next 메소드를 사용하시면 됩니다. 여기서 nextLine 메소드는 한 줄 단위로 입력받고, next 메소드는 공백을 기준으로 한 글자 단위로 입력받는다고 생각하시면 됩니다. (nextFloat, nextLong, nextShort, nextByte, nextBoolean도 있습니다. 정리하자면 nextOO 같이 뒤에 데이터 형태가 붙습니다.)


아래는 Scanner 클래스를 이용해 사용자로부터 이름, 나이, 몸무게를 받아오는 예제 입니다.

import java.util.Scanner;


class scantutorial {

  public static void main(String args[]) {

    Scanner sc = new Scanner(System.in);


    System.out.print("당신의 이름은? ");

    String name = sc.nextLine();

    System.out.print("당신의 나이는? ");

    int age = sc.nextInt();

    System.out.print("당신의 몸무게는? ");

    Double weight = sc.nextDouble();


    System.out.println("당신의 이름은 " + name + "이고, 당신의 나이는 " + age + "살이며, 당신의 몸무게는 " + weight + "kg 입니다.");

  }

}


결과:

당신의 이름은? 김철수

당신의 나이는? 17

당신의 몸무게는? 46.77

당신의 이름은 김철수이고, 당신의 나이는 17살이며, 당신의 몸무게는 46.77kg 입니다.


코드 그대로, 7~8행에서 nextLine 메소드를 사용하여 데이터를 처리하고, 9~10행은 nextInt 메소드를, 11~12행은 nextDouble 메소드로 처리합니다. 14행에서는 사용자에게 입력받은 이름(name), 나이(age), 몸무게(weight)의 값을 출력시킵니다. 


지금까지는 Scanner 클래스를 사용하여 사용자가 입력하는 값을 받아왔습니다. 이번에는 InputStreamReader, BufferedReader, 예외 처리를 이용해서 코드를 작성해 보았습니다.


import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;


class inputtutorial {

  public static void main(String args[]) {


    InputStreamReader isr = new InputStreamReader(System.in);

    BufferedReader br = new BufferedReader(isr);

    String str;


    try {

    System.out.print("당신의 이름은? ");

    String name = br.readLine();

    System.out.print("당신의 나이는? ");

    str = br.readLine();

    int age = Integer.parseInt(str);

    System.out.print("당신의 몸무게는? ");

    str = br.readLine();

    double weight = Double.parseDouble(str);


    System.out.println("당신의 이름은 " + name + "이고, 당신의 나이는 " + age + "살이며, 당신의 몸무게는 " + weight + "kg 입니다.");

    } catch (Exception ex) {

       ex.printStackTrace();

    }

  }

}


결과:

당신의 이름은? 김철수

당신의 나이는? 17

당신의 몸무게는? 46.77

당신의 이름은 김철수이고, 당신의 나이는 17살이며, 당신의 몸무게는 46.77kg 입니다.


Scanner 클래스를 사용해서 입력받았을 때보다 코드가 많이 복잡해졌습니다. InputStreamReader를 사용하여 한 글자씩 문자들을 읽어들이고 참조변수 isr에 넣고, isr에 있는 데이터를 BufferedReader로 보낸 뒤에 참조변수 br에 넣습니다. 그리고 readLine 메소드를 사용하여 한 줄을 입력받는거죠. 그리고 InputStreamReader, BufferedReader 말고도 예외 처리가 사용되었습니다. 아직 예외 처리까지 강좌가 안나갔으므로, 잠시 묻어두고 다음 강좌에서 예외 처리에 대해 설명하도록 하겠습니다.


이번 강좌는 여기서 마치겠습니다. 수고하셨습니다.


다음 강좌는 예외 처리(Exception Handling)에 대해서 배워보도록 하겠습니다.

저작자 표시
신고
  1. 김승현 at 2012.10.08 20:22 신고 [edit/del]

    감사합니다~

    Reply

submit

티스토리 툴바