String은 String의 static method인 format()을 통하여 형식을 지정할 수 있다.
format 메서드:
format 메서드의 인자로 "String format"과 "Object... args"가 보인다.
이에 대한 설명을 읽어보자:
첫 번째 인자로 들어가는 format은 format string을 의미한다.
format string이라는 구문(Syntax)은, 문자열과 형식 지정자(format specifiers)의 구문이다.
흔히 보는 System.out.printf("안녕하세요 저는 %d살이고 %s에 살아요", age, region)에서 %d, %s가 형식 지정자이다.
이때, format의 두 번째 인자인 args는 위 예시에서 age, region에 해당한다.
즉, String.format()이라는 메서드를 만났을 때 그냥 흔히 봐왔던 것처럼 편하게 생각하면 된다.
이제 형식 지정자에 대한 간단한 정리만 하고 넘어가면 될 듯하다.
형식 지정자
https://blog.jiniworld.me/68#a03
ㄴ 이 블로그에서 정리를 잘 해 주셨다.
참고: 이 글을 정리하게 된 이유는 아래 코드 때문이다.
(참고: Doit 자료구조와 함께 배우는 알고리즘 입문 자바 편 학습 과정에 있는 코드다)
형식 지정자를 %%%ds라고 썼는데, 엥? 스러웠다.
검색해서 간단하게 찾아보니까 "format() 메서드 안에서는 %%가 %다"라고 하는 분도 있는데, 무작정 이렇게 알고 있는 건 음.. 이건 아닌 것 같다.
일단 알아보기 위해서 printf 없이 String.format()만으로 테스트를 직접 해봤다.
이렇게 format()함수 안에 %를 하나만 넣은 결과가
이렇게 정상적으로 나온다. 반면, %를 두개 넣어서 %%s라고 하면,
문자열 속에 %라는 문자열을 표시하려고 하는 것처럼 인식해서 (문자열 따옴표 안에서 %를 표시하려면 %%라고 써야 한다는 걸 알고 있어야 한다) 다음의 결과가 나온다.
참고: format이나 printf을 작성할 때 형식지정자보다 많은 인자를 입력하면 그것은 초과분이 되어 없는 셈 친다. (공식 문서에 나와있는 설명이다.) 그래서 "나는 %%s"라는 문자열에서 형식 지정자는 0개고, 입력한 arguments는 "냥냥이"하나이므로 초과되는 1개분인 "냥냥이"는 그냥 사라지는 셈이다.
그럼 이제 System.out.printf()안에서 String.format()메서드를 사용해보자.
>> 옳은 예:
이렇게 printf에 대한 형식 지정자를 format함수 안에 %%d라고 써주면 옳게 작동했다.
String.format()의 결과에 %d가 들어있고, 이 형식지정자 %d는 printf문에서 적용되기 때문이다.
>> 나쁜 예:
그럼 왜 이건 안될까?
형식이 잘못되었다고 뜬다.
formatter 클래스에서 다음과 같은 예외를 발생시킨다.
MissingFormatArgumentException!!
당연하다. String.foramt()에서 %d에 해당하는 인자가 없기 때문이다.
결론:
String.format의 결과로서 %s 따위의 형식지정자 표현이 있기 때문에 printf에서 먹히는 것이다.
'JAVA' 카테고리의 다른 글
열거 타입, 열거 상수란? | 열거타입(enum) 변수 | enum, enumeration type (0) | 2021.07.03 |
---|---|
클래스의 정렬(대소판정)기준 | comparable, compareTo, comparator, compare | 자연정렬(natural ordering) (0) | 2021.06.28 |
Spring 학습 1일차 - 자바 웹 개발 첫경험을 위해 (0) | 2021.02.07 |
안드로이드 - 챕터10, 지도와 GPS (0) | 2021.01.28 |
안드로이드 생존코딩(오준석) - 챕터9 전자액자 Fragment 상세설명 - 안드로이드 스튜디오 4.1 (0) | 2021.01.25 |