String 변수에 값을 추가하며 출력 형식을 작성해야 하는 경우가 많은데 이를 String객체로 생성하면 값을 추가할 때 마다 새로운 객체가 생성되고 기존 데이터는 GarbageCollector로 들어간다.
이러한 데이터가 쌓일수록 메모리를 비효율적으로 사용하는 것이기 때문에 문자열을 더해서 출력 형식을 만드는 경우 StringBuilder를 사용해 주어야 한다.
StringBuilder 의 사용법은 다음과 같다.
public class stringbuilder_ex {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
for(int i=1;i<11;i++){
sb.append(String.format("%d 번째 줄입니다.\n",i));
}
System.out.print(sb.toString());
}
}
//출력결과
1 번째 줄입니다.
2 번째 줄입니다.
.
.
.
10 번째 줄입니다.
이렇게 StringBuilder를 사용하면 메모리 공간을 보다 효율적으로 사용할 수 있다.
자바에서는 클래스의 정보를 불러올 수 있는 패키지가 있다. 이를 통해 클래스의 이름과 선언된 변수 목록 등을 불러올 수 있다.
다음은 Reflection을 활용하여 클래스의 정보를 읽어오는 간단한 예제이다.
ReflectionUtility class
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
public class ReflectionUtility {
public static List<String> getAttributes(Object obj){
List<String> list = new ArrayList<>();
Field[] fields = obj.getClass().getDeclaredFields();
for(Field field: fields){
list.add(field.getName());
}
return list;
}
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
Book book = new Book("스카치가 있어 즐거운 세상","조승원",2023);
StringBuilder sb = new StringBuilder();
List<String> list = getAttributes(book);
for(String fieldvalues : list){
Field field = book.getClass().getDeclaredField(fieldvalues);
field.setAccessible(true);
Object value = field.get(book);
sb.append(String.format("%s : %s\n",fieldvalues,value));
}
System.out.println(sb);
}
}
Book class
public class Book {
private String title;
private String author;
private int yearPublished;
public Book(String title, String author, int yearPublished) {
this.title = title;
this.author = author;
this.yearPublished = yearPublished;
}
}
출력값
title : 스카치가 있어 즐거운 세상
author : 조승원
yearPublished : 2023
클래스가 한두개일때에는 직접 getter,setter 등을 통해서 불러올 수 있다. 하지만 수많은 클래스를 다루어야할 상황에서는 형식만 갖춰두면 여러 클래스의 정보를 매소드를 통해 읽어올 수 있는 Reflection을 사용하도록 연습해 보아야 겠다.