
<'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() 메서드를 통해서 자유자재로 변화하는 출력 창을 만들 수 있다.
많은 연습이 필요하지만 말이다.
'Java' 카테고리의 다른 글
| [Java] 배열과 리스트 사이의 변환 방법들 ( feat. Arrays.asList() ) (0) | 2022.09.01 |
|---|---|
| [Java] String 클래스의 .split() 메서드 사용하기 (0) | 2022.08.31 |
| [Java] 가변인자로 받은 원소들은 어디로 향할까? (feat. Arrays.asList()로 리스트화 하기) (0) | 2022.08.28 |
| [Java] '재귀 함수'를 사용해서 내부 객체를 탐색하기 (feat. 족보 구현) (0) | 2022.05.23 |
| [OOP] 객체지향 개발 5대 원칙, 'SOLID'란 무엇인가? (1) | 2022.04.13 |


