본문 바로가기

Java/Chapter 12. 콘솔 입력과 출력

[Java] 12.01 - 콘솔 출력(Console Output)

들어가며

 콘솔은 컴퓨터를 대상으로
데이터를 입력 및 출력하는
장치를 총칭하는 단어다.

 따라서 키보드와 모니터도
콘솔 입출력 장치에 해당한다.

 

System.out.println & System.out.print

 자바의 대표적인 콘솔 출력
메소드는 System.out.println이다.

 이 메소드는 문자열을 출력하고
나서 행을 바꾸는 특징이 있다.

 반면 문자열 출력 후에 행을
바꾸지 않는 System.out.print
메소드도 존재한다.

 이 두 메소드는 사용하기도
쉽고 예제를 통해서 호출해
본 경험도 있다.

 따라서 출력 방법에 대한
설명은 생략하고,

 대신에 지금까지 소개하지
않은 이 두 메소드의 특징을
소개하고자 한다.

 이와 관련하여 다음 예제를
보자.

class Box{
    private String conts;

    Box(String cont){
        this.conts = cont;
    }

    public String toString(){
        return conts;   // 문자열 반환
    }
}

class AutoCallToString{
    public static void main(String[] args){
        StringBuilder stb = new StringBuilder("12");
        stb.append(34);
        System.out.println(stb.toString());
        System.out.println(stb);

        Box box = new Box("Camera");
        System.out.println(box.toString());
        System.out.println(box);
    }
}

/*
실행 결과
1234
1234
Camera
Camera
*/

 위의 예제에서 정의한 Box
클래스, 그리고 앞서 소개한
StringBuilder 클래스에는

 다음의 공통점이 있다.

문자열을 반환하는 public String toString() 메소드가 정의되어 있다.

 따라서 예제에서는 인스턴스가
지니는 문자열의 출력을 위해

 다음과 같이 문장을 구성하였다.

System.out.println(stb.toString());    // toString이 반환하는 문자열 출력
System.out.println(box.toString());    // toString이 반환하는 문자열 출력

 그러나 예제에서 보였듯이
다음과 같이 인스턴스의
참조 값을 넘겨도

 동일한 출력 결과를 확인할
수 있다.

System.out.println(stb);
System.out.println(box);

 그리고 이를 통해 짐작할 수
있는 내용은 다음과 같다.

System.out.println은 참조 값이 전달되면,
이 값의 인스턴스를 대상으로 toString 메소드를 호출한다.
그리고 이때 반환되는 문자열을 출력한다.

 물론 이는 단순한 추측이 아닌
사실에 기반한다.

 그리고 예제에서 보이지는
않았지만,

 System.out.print 메소드도
동일하게 동작한다.

 다만 문자열 출력 후에 개행은
하지 않는 다는 차이점만 있을
뿐이다.

 

문자열을 조합해서 출력하는 System.out.print 메소드

 println과 print는 문자열을
있는 그대로 출력하는
메소드이다.

 반면에 이번에 소개하는
메소드는

 문자열의 내용을 조합하여
출력하는 기능을 제공한다.

 이 메소드의 사용 방법은
다음과 같다.

System.out.printf("정수는 %d, 실수는 %f, 문자는 %c", 12, 24.5, 'A');

 위의 호출문에서 printf
메소드로 전달되는 인자는

 다음과 같이 두 부류로 나뉜다.

  • 출력의 기본 구성을 담은 문자열 → "정수는 %d, 실수는 %f, 문자는 %c"
  • 문자열을 채우기 위한 값 → 12, 24.5, 'A'

 '출력의 기본 구성을 담은
문자열'은 출력할 문자열의
기본 형태를 담고 있다.

 그런데 이 문자열의 중간에
보면 %로 시작하는 것이 3번
등장한다.

 그중 하나는 %d인데 이는
다음의 의미를 갖는다.

저 값을 10진수 정수 형태로 이 위치에 출력하기를 원한다.

 그리고 이어서 등장하는
%f와 %c도 각각 다음의
의미를 갖는다.

저 값을 10진수 실수 형태로 이 위치에 출력하기를 원한다.

저 값을 문자의 문자 형태로 이 위치에 출력하기를 원한다.

 그렇다면 이들 문장에서 말하는
'저 값'은 어디에 있는 값을 의미할까?

 이는 문자열에 이어서 등장하는
'문자열을 채우기위한 값'을 의미한다.

 따라서 이들의 관계는 다음과
같이 정리할 수 있다.

그림 56 - System.out.printf 메소드 호출의 구성과 의미

 이로써 System.out.printf 메소드의
구별된 기능을 이해했을 것이다.

 그리고 %d와 같은 것을 가리켜
'서식 지정자(Format Spercifier)'
라 하는데,

 대표적인 서식 지정자들을
정리하면 다음과 같다.

그림 57 - 대표적인 서식 지정자

 그럼 다음 예제를 통해서
다양한 서식 지정자 사용의
예를 보이고

 이와 관련해서 필요한 내용을
보충 설명하겠다.

class FormatString{
    public static void main(String[] args){
        int level = 18;
        double stat_DEF = 108.2;
        String chp_name = "Leona";

        System.out.printf("Name: %s\n", chp_name);
        System.out.printf("Level: %d\nDefence: %e\n\n", level, stat_DEF);

        System.out.printf("%d - %o - %x\n\n", 77, 77, 77);
        System.out.printf("%g \n", 0.00014);
        System.out.printf("%g \n", 0.000014);
    }
}

/*
실행 결과
Name: Leona
Level: 18
Defence: 1.082000e+02

77 - 115 - 4d

0.000140000 
1.40000e-05
*/

 printf 메소드는 줄 바꿈을
자동으로 하지 않는다.

 따라서 위 예제에서 구성한
문자열에 '\n'이 많이 사용되었다.

 그리고 %e의 출력을 이해하기
위해서는 e표기법을 알아야 한다.

 이와 관련하여 다음 실수를
관찰하자.

 이는 다음과 같이 지수의
형태로 간단히 표현할 수
있다.

 그런데 코드상에서는 지수를
표현할 수 없기 때문에,

 이를 다음과 같이 표현하기로
약속하였다.

 이 둘의 관계가 이해되는가?

 10^-20을 e-20으로 표현한
것이다.

 마찬가지로 10^20은
e+20으로 표현한다.

 그리고 이것이 바로 'e표기법'이다.

 e표기법의 예를 몇 가지
들면 다음과 같다.

 예제에서도 실수 108.2를 %e를
이용해서 출력했더니

 다음과 같이 출력이 되었다.

1.082000e+02

 물론 코드상에서도 다음과 같이
e표기법을 이용해서 실수를
표현할 수 있다.

double stat_DEF = 1.082e+2;

 이렇듯 실수를 출력하는
방법에는,

 %f를 이용하는 방법과 %e를
이용하는 방법이 있다.

 3.14와 같이 간단한 수라면
%f로 출력하는 것이 수의
파악에 용이하다.

 반면 0.00000002와 같은 수는
%e로 출력하는 것이 수의 파악에
용이하다.

중간에 0이 몇 개인지 셀 필요가 없으니

 값을 %f로 출력할 것인지
%e로 출력할 것인지에 대한
결정을 위임하는 방법도 있다.

 서식 지정자 %g를 이용하는
것이다.

 위의 예제에서는 %g에 의한
두 실수의 출력 결과를 보여주고
있으니

 이를 참고하길 바란다.

 

참고 - System.out.format

 System.out.printf 메소드는 자바
5에서 제공되었다.

 그리고 이때 System.out.format
메소드도 함께 제공되었는데,

 사실 이 두 메소드는 동일한
메소드이다.

 때문에, 이 두 메소드의 호출문은
전달인자의 수정 없이 완전히
교체가 가능하고,

 그로 인한 출력 결과도 동일하다.


참고 및 출처

윤성우의 열혈 Java 프로그래밍
국내도서
저자 : 윤성우
출판 : 오렌지미디어 2017.07.05
상세보기