Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
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 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

[TypeConverter] Formatter 본문

인프런/[인프런] 스프링 MVC 2

[TypeConverter] Formatter

Seung__ 2021. 10. 2. 13:38
  • Converter 는 입력과 출력 타입에 제한이 없는, 범용 타입 변환 기능을 제공
  • 하지만 개발자는 문자를 다른 타입으로 변환하거나, 다른 타입을 문자로 변환하는 상황이 대부분이다.
  • 문자를 다른 객체로 변환하거나 객체를 문자로 변환하는 일이 많음.

 

1. Web Application에서 객체 -> 문자, 문자 -> 객체 변환 예


  • 화면에 숫자를 출력
    • Integer -> String 출력 시점에 숫자 1000 -> 문자 "1,000" 이렇게 1000 단위에 쉼표를 넣어서 출력하거나
    • 또는 "1,000" 라는 문자를 1000 이라는 숫자로 변경해야 한다.
    • 날짜 객체를 문자인 "2021-01-01 10:50:11" 와 같이 출력하거나 또는 그 반대의 상황
  • Locale
    • 여기에 추가로 날짜 숫자의 표현 방법은 Locale 현지화 정보가 사용될 수 있다.
  • 이렇게 객체를 특정한 포멧에 맞추어 문자로 출력하거나 
  • 또는 그 반대의 역할을 하는 것에 특화된 기능이 바로 포맷터( Formatter )이다. 
  • 포맷터는 컨버터의 특별한 버전으로 이해하면 된다. ->엑셀에서 서식 지정이랑 같음 ㅋㅋㅋㅋㅋ

 

 

2. Converter VS Formatter


  • Converter 는 범용(객체 객체)
  • Formatter 는 문자에 특화(객체 문자, 문자 객체) + 현지화(Locale)
    • Converter 의 특별한 버전

 

 

3. Formmater 만들기


  • 포맷터( Formatter )는 객체를 문자로 변경하고, 문자를 객체로 변경하는 두 가지 기능을 모두 수행
  • 따라서 아래 두 인터페이스를 가지고 있음
    • String print(T object, Locale locale) : 객체를 문자로 변경한다.
    • parse(String text, Locale locale) : 문자를 객체로 변경한다.
@Slf4j
public class MyNumberFormatter implements Formatter<Number> {

    @Override
    public Number parse(String text, Locale locale) throws ParseException {
        log.info("text={}, locale={}", text,locale);
        //"1,000" -> 1000
        return NumberFormat.getInstance(locale).parse(text);
    }

    @Override
    public String print(Number object, Locale locale) {
        log.info("object={}, locale={}", object, locale);
        return  NumberFormat.getInstance(locale).format(object);
    }
}
  • "1,000" 처럼 숫자 중간의 쉼표를 적용하려면 자바가 기본으로 제공하는 NumberFormat 객체를 사용
  •  Locale 정보를 활용해서 나라별로 포맷을 만듦.
  •  parse() 를 사용해서 문자를 숫자로 변환한다.
  • 참고로 Number 타입은 Integer , Long 과 같은 숫자 타입의 부모 클래스
  • print() 를 사용해서 객체를 문자로 변환한다.

4. Test


  • parse() 의 결과는 Long 타입.
class MyNumberFormatterTest {

    MyNumberFormatter formatter = new MyNumberFormatter();

    @Test
    void parse() throws ParseException {
        Number result = formatter.parse("1,000", Locale.KOREA);
        assertThat(result).isEqualTo(1000L); //Long타입
    }

    @Test
    void print(){
        String result = formatter.print(1000, Locale.KOREA);
        assertThat(result).isEqualTo("1,000");
    }


}

 

 

5. 참고


 

6. GitHub : 211002 Formatter


 

GitHub - bsh6463/TypeConverter

Contribute to bsh6463/TypeConverter development by creating an account on GitHub.

github.com

 

Comments