자바에서 여러 자료형을 JSON형태로 만드는 과제가 있었다.
그 중 배열과 Map 자료형에서 JSON형태로 만들 때, StringBuilder에 "["(배열), "{"(Map) 를 붙이고서, 각 요소들을 붙여주는 식으로 구현했다. 그러다보니 마지막 요소 뒤에도 붙는 ","를 처리해주는 과정이 한 번 더 들어갔다.
근데 배열과 map 클래스에서 overriding된 toString()을 이용하는 풀이를 보고 몰랐던 부분을 정리하고자 한다.
Arrays.toString(배열)
int[] arr = {1, 2, 3, 4, 5};
String result = Arrays.toString(arr); // result : "[1, 2, 3, 4, 5]"
//arr.toString(); (x) -> Object클래스의 toString()이 그대로 호출!
Arrays클래스에서 toString()을 실제로 overriding한 코드를 보면 다음과 같다.
//in Arrays class
public static String toString(int[] a) {
if (a == null)
return "null";
int iMax = a.length - 1;
if (iMax == -1)
return "[]";
StringBuilder b = new StringBuilder();
b.append('[');
for (int i = 0; ; i++) {
b.append(a[i]);
if (i == iMax)
return b.append(']').toString();
b.append(", ");
}
}
map.toString()
Map<String, String> map = new HashMap<>();
map.put("이름", "홍길동");
map.put("나이", "23");
map.put("학교", "자바중학교");
String result = map.toString(); // result : "{이름=홍길동, 나이=23, 학교=자바중학교}"
Map 인터페이스를 구현한 AbstractMap 추상클래스에 toString()이 overiding 되어 있다.
이 AbstractMap 추상클래스는 HashMap이나 TreeMap 클래스의 상위 클래스이다.
//in AbstractMap class
public String toString() {
Iterator<Entry<K,V>> i = entrySet().iterator();
if (! i.hasNext())
return "{}";
StringBuilder sb = new StringBuilder();
sb.append('{');
for (;;) {
Entry<K,V> e = i.next();
K key = e.getKey();
V value = e.getValue();
sb.append(key == this ? "(this Map)" : key);
sb.append('=');
sb.append(value == this ? "(this Map)" : value);
if (! i.hasNext())
return sb.append('}').toString();
sb.append(',').append(' ');
}
}
'언어 > Java' 카테고리의 다른 글
예외 (Exception) (0) | 2022.06.28 |
---|---|
Arrays.asList() (0) | 2022.05.30 |
OOP의 특성 - 2. 다형성 (0) | 2022.05.13 |
OOP의 특성 - 1. 상속 (0) | 2022.05.12 |
생성자 (1) | 2022.05.11 |
댓글