티스토리 뷰

프로그램을 좀 해본 사람이라면 System.out.printf를 많이 써 봤을 것이다. 자바의 printf는 C 언어의 printf에 뿌리를 두고 있어 프로그래머들에게 익숙한 개념이다. printf는 특히 숫자를 길이나 형식에 맞게 출력하는데 유용하다. 그런데 잘 모르고 있는 사람이 많지만 System.out.format이라는 메소드도 printf와 똑같은 기능을 제공한다.

그런데 자바에서는 이러한 포매팅의 개념이 스트링에서 출발하고 있다. String.format() 메소드가 System.out.printf나 System.out.format에서 사용되는 것과 같다. 그럼 이 format 메소드에 대해 좀더 자세히 알아보자.

String.format(포매팅문자열, 인수, ...);

여기서 인수는 포매팅 문자열에 %가 나타나는 개수만큼 써주어야 한다. 그리고 %에서 요구한 타입과 일치하는 인수가 들어가야 한다. 그럼 포매팅의 비밀인 % 부분에 대해 살펴보자. % 뒤에는 두 부분으로 나뉘는데 앞에는 플래그, 뒤에는 컨버터라고 한다. 컨버터는 d(정수), f(실수), s(스트링) 등으로 인수를 어떤 타입으로 받을 것인지 지정한다. (%n은 줄바꿈 문자를 뜻한다. \n 대신 %n을 쓰는 것이 좋다.)

%와 컨버터 사이에는 플래그와 숫자가 올 수 있는데 숫자는 다음과 같은 역할을 한다.

  • 정수부는 전체 자리수를 의미한다. 인수로 들어온 값이 이 자리수를 넘어가면 그대로 빈칸없이 출력한다.

숫자 앞에 오는 플래그 부분에는 ,-+0가 올 수 있는데 이들이 의미하는 바는 다음과 같다. 

  • 숫자 앞에 0을 쓰면 숫자의 출력에서 앞에 빈칸이 아닌 0으로 채우라는 뜻이다. 
  • -는 왼쪽정렬 하라는 뜻이고 +는 양의 숫자에 대해서도 부호를 포함하여 찍으라는 뜻이다.
  • 콤마(,)는 숫자를 세 자리마다 콤마로 분리하라는 뜻이다.

예를 들어 ",+10.3"이 플래그 자리에 들어가면 소수점 수를 전체 10자리로 출력하되 소수점 이하를 세자리로 하라는 뜻이다. 또 +도 부호를 붙이고 정수 부분에 세 자리마다 콤마를 넣으라는 것이다.

숫자 이외의 타입은 비교적 간단한데, 스트링은 %s로 자리수(부호로 좌정렬)를 컨버터 앞에 넣을 수 있다. 

다음 예제는 캘린더 객체에 대해 년월일 시분 등을 포매팅하는 방법을 보여준다.

출처 : 오라클 자바 튜토리얼 - 포매팅 페이지

다음은 오라클 자바 튜토리얼 페이지의 String.format 예제 코드다. 각자 실행해 보기 바란다. (오류 수정 by ejlee)

import java.util.Calendar; 
import java.util.Locale; 
public class TestFormat { 
	public static void main(String[] args) { 
		long n = 461012; 
		System.out.format("%d%n", n); // --> "461012" 
		System.out.format("%08d%n", n); // --> "00461012" 
		System.out.format("%+8d%n", n); // --> " +461012" 
		System.out.format("%,8d%n", n); // --> " 461,012" 
		System.out.format("%+,8d%n%n", n); // --> "+461,012" 
		double pi = Math.PI; System.out.format("%f%n", pi); // --> "3.141593" 
		System.out.format("%.3f%n", pi); // --> "3.142" 
		System.out.format("%10.3f%n", pi); // --> " 3.142" 
		System.out.format("%-10.3f<-%n", pi); // --> "3.142 <-" 
		System.out.format(Locale.FRANCE, "%-10.4f<-%n%n", pi); // --> "3,1416 <-" 
		Calendar c = Calendar.getInstance(); // 캘린더 라이브러리에서 지금 시간을 받아온다. 
		System.out.format("%tB %te, %tY%n", c, c, c); // --> "May 29, 2006" 
		System.out.format("%tl:%tM %tp%n", c, c, c); // --> "2:34 am" 
		System.out.format("%tD%n", c); // --> "05/29/06" 
	} 
}

이런 String.format은 특히 객체의 toString 메소드에서 유용하게 쓰인다. toString은 필드값을 스트링으로 바꾸어 리턴해야 하는데, 예를 들어 학번, 이름, 학년, 학과 등을 가진 학생 클래스의 toString 이라면 다음과 같이 작성할 수 있다. 

class Student {
    @Override
    public String toString() {
        return String.format("[%d] %s (%s %d학년)", id, name, dept, year);
    }
}

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함