본문 바로가기

Java

[Java] System.out.printf() 메서드 사용법 (feat. String.format())

728x90

 

 

<'do ti! 자료구조와 함께 배우는 알고리즘 입문' 교재에 등장한 내용임>

 

연습문제 중 다음과 같은 표현으로 출력되는 예시가 있다.

 

 

 

 

내용에 따라 변하는 형태인데, 기존의 println()이나 print() 메서드로는 한계를 느꼈다.

위와 같이 출력하려면 어떻게 코드를 짜야할까?

 

정답은 printf()과 String.format() 메서드에 있다.

 

 

 

첫 번째 예시의 경우 특정 값을 변환하고자 하는 값으로 더 이상 나눌 수 없을 때까지 나누는 과정을 나타낸다.

출력하는 부분의 코드는 다음과 같다.

 

 

System.out.printf(String.format("%%2d | %%%dd\n", n), r, x);
        do {
            System.out.printf("   +");
            for (int i = 0; i < n + 2; i++)
                System.out.print('-');
            System.out.println();

            if (x / r != 0)
                System.out.printf(String.format("%%2d | %%%dd    ... %%d\n", n),
                        r, x / r, x % r);
            else
                System.out.printf(String.format("     %%%dd    ... %%d\n", n),
                        x / r, x % r);
            d[digits++] = dchar.charAt(x % r);   // r 로 나눈 나머지를 저장
            x /= r;
        } while (x != 0);
        
        /.....

 

 

여기서 주목해야 할 부분은 다음과 같은 내용이다. System.out.printf()의 매개변수로 String.format() 메서드가 들어가 있고, 매개변수 내용도 복잡하다. 이를 이해할 수 있어야 한다.

 

 

System.out.printf(String.format("%%2d | %%%dd\n", n), r, x);
System.out.printf(String.format("%%2d | %%%dd    ... %%d\n", n), r, x / r, x % r);
System.out.printf(String.format("     %%%dd    ... %%d\n", n), x / r, x % r);

 

 

먼저 String.format()에 대해 알아보자. String 클래스의 메서드로서 지정된 위치에 대입된 값을 '문자열'로 반환한다.

형식은 printf와 동일하기 때문에 %d는 10진수를, %s는 문자열을, %f는 소수를, %c는 문자 등을 나타낸다. 그리고 format() 메서드 내에서 %%는 '%' 문자를 의미한다. 따라서 format에서 '%'라는 문자를 사용하고 싶으면 %% 이라고 적으면 된다. 

 

format() 메서드 내부에서,

%%   =  ' % ' 와 같다.

 

위 코드에 %% 을 % 으로 치환하면 다음과 같다.

 

 

String.format("%2d | %%dd\n", n);
String.format("%2d | %%dd    ... %d\n", n);
String.format("     %%dd    ... %d\n", n);

 

 

String.format("%%2d  |  %%%dd\n",  n);

String.format("%%2d  |  %%%dd          ... %%d\n",  n);

String.format("          %%%dd           ... %%d\n",  n);

 

 

String.format("%2d  |  %%dd\n",  n);

String.format("%2d  |  %%dd          ... %d\n",  n);

String.format("          %%dd           ... %d\n",  n);

 

이후 녹색으로 표시된 %d자리에 n값을 대입한다. 그러면 코드는 다음처럼 변한다. (n은 3으로 정의함)

 

 

String.format("%2d  |  %3d\n");                              ☞     "%2d  |  %3d\n"  (String  형식이 됨)

String.format("%2d  |  %3d          ... %d\n");        ☞     "%2d  |  %3d          ... %d\n(String  형식이 됨)

String.format("          %3d           ... %d\n");            ☞     "          %3d           ... %d\n(String  형식이 됨)

 

String으로 변환된 코드를 System.out.printf()에 대입한다.

 

 

System.out.printf( "%2d  |  %3d\n" ,    r,    x);

System.out.printf( "%2d  |  %3d          ... %d\n",    r,    x  / r,    x  %  r);

System.out.printf( "          %3d           ... %d\n",    x  /  r,    x  %  r);

 

이 정도 되니 우리가 알고 있는 printf() 형식이 됐다.

 

 

하나 더 풀어보자.

아래와 같은 코드가 있다.

 

System.out.printf(String.format("%%%ds*\n",   (i * 4) + 3),  " ");

 

최종적으론 어떻게 바뀌겠는가?

 

먼저 String.format()부터 String으로 바꿔야 한다. 그래서 일단 String.format() 먼저 해결한다.

%% 를 %로 바꾸고, 해당 값을 계산해서 %d에 대입한다.

 

String.format("%%%ds*\n",   (i * 4) + 3);

 

 

String.format("%%ds*\n", (i * 4) + 3);

 

 

  String.format("%11s*\n");        ☞     "%11s*\n"  (String  형식이 됨)

 

 

System.out.printf( "%11s*\n" ,   " ");

 

해당 코드는 ' * ' 기호 앞에 총 10개의 빈칸을 넣으라는 코드가 된다.

 

 

이처럼 String.format()과 printf() 메서드를 통해서 자유자재로 변화하는 출력 창을 만들 수 있다.

많은 연습이 필요하지만 말이다.