[Java] 형식 지정자(format specifier)

박제욱·2024년 3월 8일
0

Java

목록 보기
10/30
post-thumbnail

형식 지정자란

형식 지정자(format specifier)는 다른 말로 서식 지정자(format specifier) 혹은 포맷 스트링(format string)라고 한다. 형식 지정자(format specifier)는 printf 함수에서 데이터를 원하는 형식으로 출력하게 하는 역할을 한다.

형식 지정자의 역할

형식 지정자는 컴퓨터에게 어떤 정보를 어떻게 화면에 보여줄지 알려주는 표시이며 프로그래밍에서 출력 형식을 제어하기 위해 사용된다. 즉, 우리가 그림을 그릴 때 색칠북에 있는 그림 안에 색을 칠하듯이, 컴퓨터는 형식 지정자를 보고 정보를 어떤 모양으로 화면에 그려야 하는지 알게 된다. 이를 통해 컴퓨터 정수, 실수, 문자, 문자열 등 다양한 타입의 데이터를 특정 형식에 맞게 출력할 수 있게 된다. 예를 들어, %d는 정수를 10진수 형식으로, %f는 실수를 10진수 형식으로, %s는 문자열을 그대로 출력하라는 의미이다. 이 외에도 여러 형식 지정자가 있다. 이처럼 형식 지정자는 다양한 데이터 타입을 원하는 형식으로 출력하는 데 유용한 도구이다.

형식 지정자 사용 시 주의 사항 및 장단점

  • 형식 지정자와 일치하는 타입의 데이터를 제공해야 한다. 예를 들어, %d는 정수를, %f는 실수를, %s는 문자열을, %t는 날짜/시간 정보를 가진 객체를 필요로 한다. 일치하지 않는 타입의 데이터를 제공하면 런타임 에러가 발생할 수 있다.

  • 형식 지정자의 경우 사용자의 로케일 설정에 따라 출력 결과가 달라질 수 있다. 특히, 날짜와 시간을 출력하는 %t와 관련된 형식 지정자의 경우, 요일이나 월 등의 이름은 사용자의 로케일 설정에 따라 다르게 출력될 수 있다.

참고) 로케일 설정이란?
로케일 설정은 사용자의 기기나 소프트웨어에서 시간, 날짜, 숫자, 통화 등과 같은 형식을 표시하는 방식이다.

  • 형식 지정자를 사용하여 출력할 데이터가 없는 경우, 적절한 기본값이 출력될 수 있다. 예를 들어, %d 형식 지정자를 사용하여 정수를 출력하는데 해당 변수에 값이 할당되지 않았다면 0이 출력될 수 있다.

  • 형식 지정자는 일반 텍스트와 섞여서 사용될 수 있다. 따라서 형식 지정자와 일반 텍스트를 적절하게 조합하여 원하는 형식의 출력을 생성할 수 있다.

  • 형식 지정자를 사용하는 코드는 가독성이 떨어질 수 있으므로, 주석을 통해 코드의 의미를 명확하게 표현하는 것이 좋다.

형식 지정자의 종류

자바에서 사용되는 형식 지정자들은 여러 가지가 존재한다.

  • %d : 10진수 형태의 정수를 출력하고 싶을 때 사용한다.

  • %o : 8진수 형태의 값을 출력하고 싶을 때 사용한다.

  • %x : 16진수 형태의 값을 출력하고 싶을 때 사용한다.

  • %X : %x와 같은 역할을 한다.

  • %f : 부동소수점 수. 즉, 실수를 출력하고 싶을 때 사용하며 소수점 7번째 자리 이전까지 출력한다.

  • %g: 실수를 더 짧은 형태(소수점 뒤에 불필요한 0이 없는 형태)로 출력하고 싶을 때 사용한다.

  • %e : 지수 형태의 값을 출력하고 싶을 때 사용한다.

  • %E : %e와 같은 역할을 한다.

  • %c : 데이터의 형태가 하나의 문자로 된 값을 출력할 때 사용한다.

  • %s : 데이터의 형태가 문자열로 된 값을 출력할 때 사용된다.

  • %b: 불리언 값을 출력하고 싶을 때 사용한다.

  • %h: 해시코드를 출력하고 싶을 때 사용한다. %h를 통해 해시코드를 출력하려면 object 클래스가 필요하다.

  • %n : 출력되는 코드의 줄(라인)을 한 줄 띄우고 출력하고 싶을 때 사용한다.

  • 아래의 코드는 위에 형식 지정자들의 예시 코드이다.

public class Main {
    public static void main(String[] args) {
        int integer = 15;
        double floatingPoint = 12.345678;
        char character = 'A';
        String string = "안녕하세요";
        boolean bool = true;
        Object object = new Object();

        System.out.printf("%%d: %d%n", integer); // 정수를 10진수로 출력한다.
        System.out.printf("%%o: %o%n", integer); // 정수를 8진수로 출력한다.
        System.out.printf("%%x: %x%n", integer); // 정수를 16진수로 출력한다.
        System.out.printf("%%X: %X%n", integer); // 정수를 대문자를 사용한 16진수로 출력한다.
        System.out.printf("%%f: %f%n", floatingPoint); // 실수를 10진수로 출력한다.
        System.out.printf("%%g: %g%n", floatingPoint); // 실수를 축약된 10진수 또는 지수 표현으로 출력한다.
        System.out.printf("%%e: %e%n", floatingPoint); // 실수를 지수 표현으로 출력한다.
        System.out.printf("%%E: %E%n", floatingPoint); // 실수를 대문자를 사용한 지수 표현으로 출력한다.
        System.out.printf("%%c: %c%n", character); // 문자를 출력한다.
        System.out.printf("%%s: %s%n", string); // 문자열을 출력한다.
        System.out.printf("%%b: %b%n", bool); // 불리언 값을 출력한다.
        System.out.printf("%%h: %h%n", object); // 객체의 해시 코드를 16진수로 출력한다.
        System.out.printf("%%n: "); // 줄바꿈 문자를 출력한다.
    }
}
  • %t : 날짜나 시간을 출력하고 싶을 때 사용한다. %t는 t 뒤에 문자를 적어서 사용해야 하며 자바에서는 %t 뒤에 다른 문자가 없으면 오류가 발생한다. 그래서 %t를 활용하여 나타내는 형식 지정자의 종류는 약간 많은 편이다. %t와 과련된 형식 지정자를 사용하려면 java.util.Date 가 기본적으로 필요하며 이 외에도 java.util.Calendar 등의 다른 클래스를 사용한다.

1) %tA: 요일을 전체 이름으로 출력한다.

2) %ta: 요일을 축약된 이름으로 출력한다.

3) %tB: 월을 전체 이름으로 출력한다.

4) %tb: 월을 축약된 이름으로 출력한다.

5) %tC: 세기를 출력한다.

6) %tD: 날짜를 MM/DD/YY 형식으로 출력한다.

7) %td: 일을 2자리 숫자로 출력한다.

8) %te: 일을 1자리 숫자로 출력한다.

9) %tF: 날짜를 YYYY-MM-DD 형식으로 출력한다.

10) %tH: 시간을 24시간 형식으로 출력한다.

11) %th: 시간을 12시간 형식으로 출력한다.

12) %tI: 시간을 12시간 형식으로 출력한다.

13) %tj: 연중 일자를 출력한다.

14) %tM: 분을 출력한다.

15) %tN: 나노초를 출력한다.

16) %tp: 오전이나 오후 표시를 출력한다.

17) %tQ: 밀리초를 출력한다.

18) %tR: 시간과 분을 HH:MM 형식으로 출력한다.

19) %tS: 초를 출력한다.

20) %tT: 시간, 분, 초를 HH:MM:SS 형식으로 출력한다.

21) %tY: 4자리 연도를 출력한다.

22) %ty: 2자리 연도를 출력한다.

23) %tZ: 시간대를 출력한다.

24) %tz: 시간대를 RFC 822 형식으로 출력한다.

참고) RFC 822 형식이란?
RFC 822는 이메일 보내는 형식의 표준을 정의해둔 것이고 하나의 구조다.

25) %t%: '%' 문자를 출력한다.

아래 코드는 %t와 관련된 예시 코드이다.

import java.util.Date;

public class Main {
    public static void main(String[] args) {
        Date date = new Date();
		
        System.out.printf("%%tA: %tA%n", date); // 요일을 전체 이름으로 출력한다.
        System.out.printf("%%ta: %ta%n", date); // 요일을 축약된 이름으로 출력한다.
        System.out.printf("%%tB: %tB%n", date); // 월을 전체 이름으로 출력한다.
        System.out.printf("%%tb: %tb%n", date); // 월을 축약된 이름으로 출력한다.
        System.out.printf("%%tC: %tC%n", date); // 세기를 출력한다.
        System.out.printf("%%tD: %tD%n", date); // 날짜를 MM/DD/YY 형식으로 출력한다.
        System.out.printf("%%td: %td%n", date); // 일을 2자리 숫자로 출력한다.
        System.out.printf("%%te: %te%n", date); // 일을 1자리 숫자로 출력한다.
        System.out.printf("%%tF: %tF%n", date); // 날짜를 YYYY-MM-DD 형식으로 출력한다.
        System.out.printf("%%tH: %tH%n", date); // 시간을 24시간 형식으로 출력한다.
        System.out.printf("%%th: %th%n", date); // 시간을 12시간 형식으로 출력한다.
        System.out.printf("%%tI: %tI%n", date); // 시간을 12시간 형식으로 출력한다.
        System.out.printf("%%tj: %tj%n", date); // 연중 일자를 출력한다.
        System.out.printf("%%tM: %tM%n", date); // 분을 출력한다.
        System.out.printf("%%tN: %tN%n", date); // 나노초를 출력한다.
        System.out.printf("%%tp: %tp%n", date); // 오전/오후 표시를 출력한다.
        System.out.printf("%%tQ: %tQ%n", date); // 밀리초를 출력한다.
        System.out.printf("%%tR: %tR%n", date); // 시간과 분을 HH:MM 형식으로 출력한다.
        System.out.printf("%%tS: %tS%n", date); // 초를 출력한다.
        System.out.printf("%%tT: %tT%n", date); // 시간, 분, 초를 HH:MM:SS 형식으로 출력한다.
        System.out.printf("%%tY: %tY%n", date); // 4자리 연도를 출력한다.
        System.out.printf("%%ty: %ty%n", date); // 2자리 연도를 출력한다.
        System.out.printf("%%tZ: %tZ%n", date); // 시간대를 RFC 822 형식으로출력한다.
        System.out.printf("%%tz: %tz%n", date); // 시간대를 RFC 822 형식으로 출력한다.
        System.out.printf("%%t%%: %%"); // '%' 문자를 출력한다.
    }
}

0개의 댓글