Dico

[Java] Class Choice, MessageFormat

형식화 클래스

원하는 형식으로 표현 또는 변환하기 위해서 패턴을 정의한다.

형식화된 데이터에서 원래의 데이터를 얻을 수 있다.

package java.text에 포함되어 있다.

숫자, 날짜, 텍스트 데이터를 일정한 형식에 맞게 표현할 수 있는 방법을 객체지향적으로 설계하여 표준화했다.

Class ChoiceFormat

특정 범위에 속하는 값을 문자열로 변환한다.

if문, switch문을 대신해서 연속적/불연속적인 범위의 값들을 간단하고 직관적으로 처리할 수 있다.

사용법

범위의 경계값은 double형으로 반드시 모두 오름차순으로 정렬되어야 한다.

범위에 포함된 값을 치환할 문자열의 개수는 경계값에 의해 정의된 범위의 개수와 일치해야 한다.

double[] limits = {60, 70, 80, 90};             // 경계값
String[] grades = {"D", "C", "B", "A"};         // 치환할 문자열

int[] scores = {52, 60, 77, 80, 92, 100};

ChoiceFormat cf = new ChoiceFormat(limits, grades);

for (int i = 0; i < scores.length; i++) {
    System.out.println(scores[i] + " : " + cf.format(scores[i]));
}
52 : D
60 : D
77 : C
80 : B
92 : A
100 : A

경계값(limits)에 의해 '60~69', '70~79', '80~89', '90~'의 범위가 정의되었다.

정의된 범위의 개수와 치환 될 문자열의 개수가 일치하지 않으면 IllegalArgumentException이 발생한다.

패턴

배열 대신 패턴을 사용할 경우, 구분자로 '#'와 '<' 두 가지를 제공한다.

  • # :  경계값을 범위에 포함시킨다. limit#value
  • < :  경계값을 범위에 포함시키지 않는다. limit<value
String pattern = "60#D|70<C|80#B|90#A";
int[] scores = {58, 66, 70, 80, 92, 97};

ChoiceFormat cf = new ChoiceFormat(pattern);

for (int i = 0; i < scores.length; i++) {
    System.out.println(scores[i] + " : " + cf.format(scores[i]));
}
58 : D
66 : D
70 : D
80 : B
92 : A
97 : A

Class MessageFormat

데이터를 정해진 양식에 맞게 출력할 수 있도록 한다.

데이터가 들어갈 자리를 마련해 놓은 양식을 미리 작성하고 프로그램을 이용해서 다수의 데이터를 같은 양식으로 출력할 때 사용하면 좋다.

사용법

사용할 양식(문자열)을 작성할 때 데이터가 출력될 자리를 '{숫자}'로 표시한다.

양식에 들어갈 데이터를 객체 배열에 정의한다.

String msg = "Name: {0} \nAge: {1} \nBirthday: {2} \nTel: {3}";
Object[] arguments = {"홍길동", "25", "11-17", "010-1111-2222"};

System.out.println(MessageFormat.format(msg, arguments));
D/TAG_TEST: Name: 홍길동 
            Age: 25 
            Birthday: 11-17 
            Tel: 010-1111-2222

숫자는 배열처럼 index가 0부터 시작하며, 객체 배열(arguments)의 index와 매칭된다.

String msg = "''{0}'',''{2}'',''{1}'',''{3}''";
Object[][] arguments = {
        {"홍길동", "25", "11-17", "010-1111-2222"},
        {"자바다", "27", "07-22", "010-9999-4444"}
};

for (int i = 0; i < arguments.length; i++) {
    System.out.println(MessageFormat.format(msg, arguments[i]));
}
'홍길동','11-17','25','010-1111-2222'
'자바다','07-22','27','010-9999-4444'

홑따옴표(')는 MessageFormat의 양식에 escape문자로 사용되기 때문에 문자열 내에서 사용하려면 연속으로 두 번 써주어야 한다.

위의 예제들처럼 데이터를 객체 배열로 직접 초기화 할 경우, 데이터가 바뀔 때마다 매번 배열을 변경한 후 다시 컴파일 해줘야 해서 불편하다.

파일로부터 데이터를 제공받으면 데이터가 변경되어도 다시 컴파일 하지 않아도 된다.

EditText로 입력 받아 보기

  • activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    ...
    android:orientation="vertical">

    <EditText
        android:id="@+id/edit_name"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:background="@null"
        android:gravity="center"
        android:hint="name"
        android:inputType="text"/>

    <EditText
        android:id="@+id/edit_age"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:background="@null"
        android:gravity="center"
        android:hint="age"
        android:inputType="number"/>

    <EditText
        android:id="@+id/edit_tel"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:background="@null"
        android:gravity="center"
        android:hint="tel"
        android:inputType="number"/>

    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="hi"
        android:textSize="30dp"/>

</LinearLayout>
  • MainActivity.java
public class MainActivity extends AppCompatActivity {

    int[] editId = {R.id.edit_name, R.id.edit_age, R.id.edit_tel};
    int size = editId.length;
    EditText[] edit = new EditText[size];

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        for (int i = 0; i < size; i++) {
            edit[i] = (EditText) findViewById(editId[i]);
        }
        final TextView tv = (TextView) findViewById(R.id.tv);

        edit[2].setOnEditorActionListener(new EditText.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if (actionId == EditorInfo.IME_ACTION_DONE) {

                    Object[] obj = new Object[size];
                    for (int i = 0; i < size; i++) {
                        obj[i] = edit[i].getText().toString();
                    }

                    String msg = "values ({0}, {1}, {2})";
                    tv.setText(MessageFormat.format(msg, obj));
                }
                return false;
            }
        });
    }
}

ChoiceFormat API

MessageFormat API

참고 서적: 자바의 정석 3판 2