국비수업/수업정리
CSV
밀김
2023. 5. 26. 14:17
728x90
< 아침 예외처리 복습 >
예외처리를 하는 이유
1.익셉션
: 빨간줄띄움
2.런타임 익셉션
: 런타임(실행시간)
out of bound , index 초과
*런타임 익셉션이 중요한 이유: 실행
파이널리: 무조건 한번은 실행이 되는 예외
* 캐치 부분에서 메세지를 보낸다
* 트라이는 내가 원하는대로 코드를 실행하게 하는
* 파이널리는 생략 가능
* 프로젝트시 무조건 사용~~~
* 파이널리에는 rs.close() 같은구문들을 넣는다
- 문자열 합칠때 덧셈 연산자 쓰지마라
- 값+키 => 엔트리즈 라고 함
package ex10.refl_anno;
import java.lang.reflect.InvocationTargetException;
public class Program {
public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException, SecurityException, NoSuchFieldException {
//반환기 JSON/"CSV"/XML문자열 <-> 객체
//CSVParser
//String toCSV(Object obj) / Object fromCsv(String csv)
//List<Object> loadCSV(String file)
Notice n = new Notice(1,"어노테이션이란","newlec",0);
String csvNotice = CsvParser.toCSV(n);
// System.out.println(csvNotice);
//Notice n1 = (Notice)CsvParser.fromCSV("id:2,title:리플렉션이란,writerId:newlec,hit:0");
Exam exam = new Exam(50,80,90);
String csvExam = CsvParser.toCSV(exam);
// System.out.println(csvExam);
Exam exam1 = (Exam)CsvParser.fromCSV("kor:20,eng:39,math:40",Exam.class);
//class타입 반환
System.out.println(exam1);
//어떠한 객체도 csv 파일로 만들수 있다
//그리고 문자열을 객체로 반환할수도 있음
// Exam exam = (Exam)CsvParser.fromCSV("kor:20,eng:39,math:40");
//문자열을 exam 객체로 만들기
}
}
package ex10.refl_anno;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
public class CsvParser {
public static String toCSV(Object obj) throws IllegalArgumentException, IllegalAccessException {
String csv = "";
Class cls = obj.getClass();
// System.out.println("이름"+cls.getName());
//출력하면 class명이 나온다
Field[] fields = cls.getDeclaredFields();
//필드를 넘겨준다
StringBuilder builder = new StringBuilder();
builder.append("{");
int size = fields.length;
for(int i=0; i<size; i++) {
Field field = fields[i];
String fieldName = fields[i].getName();
field.setAccessible(true);
//프라이빗이라 이과정을 해주면 접근이 가능해짐
Object value = field.get(obj);
//field.get(객체) > 객체 값을 가져올수있음
//필드에 있는 오브젝트의 값을 가져온다
//예를들어 kor.get(exam) 이면, exam에 있는 kor의 값을 가져온다
System.out.printf("%s:%s\n",fieldName,value);
//csv에 추가를 해라
builder
.append(fieldName)
.append(":")
.append(value);
if(i < size-1)//마지막이 아니라면
builder.append(",");
// if(i<size-1) {
// csv+=fieldName+":"+value+", ";
// }else {
// csv+=fieldName+":"+value;
// }내가 한 방법
// System.out.println("fields의 값들 : "+fields[i].getName());
}
builder.append("}");
//obj.getClass();
//getClass: 객체에 대한 정보를 갖고 있는 클래스 obj.getClass()
//모든 객체는 자기자신을 설명하는 정보를 .class 라는 곳에 담고있다 Exam.class
return builder.toString();
}
public static Object fromCSV(String csv,Class type) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException, NoSuchFieldException {
Object obj = type.getDeclaredConstructor().newInstance();
{
String[] entries = csv.split(",");
int size = entries.length;
for(int i=0; i<size; i++) {
String[] entry = entries[i].split(":");
String key = entry[0];
String value = entry[1];
Field field = type.getDeclaredField(key);
String fieldType = field.getType().toString();
field.setAccessible(true);
if(fieldType.equals("int")) {
int intValue = Integer.parseInt(value);
field.set(obj, intValue);
} else if (fieldType.equals("String")) {
field.set(obj, value);
}
}
}
return obj;
}
1. type 클래스의 인스턴스 획득하기 getDeclaredConstructor().newInstance()
2. csv에 저장된 문자열을 잘라서 entries 배열에 담음
3. entries.length 를 단순화 하기 위해 size 변수에 길이 설정해주고
4. 구분자를 이용하여 entries 배열에 있는 문자열들을 자르고 entry 배열에 담아준다
*근데 이과정을 왜 또 하는지 모르겠음*
처음에 콤마로 자르고, 하나하나 저장하기 위해서 구분자를 사용해 또 자르고..
그럼 값이 어떻게 들어가는지? 출력해봤을때 인덱스 0,1부분만 나옴
(https://12bme.tistory.com/129)
5. Field[] getDeclaredFields(): 해당 클래스에서 정의된 변수 목록을 field 클래스 배열 타입으로 리턴한다.
Field getDeclaredField(String name): name과 동일한 이름으로 정의된 변수를 Field 클래스 타입으로 리턴한다.
type 클래스에서 'key'로 지정된 이름을 가진 필드에 접근하기 위해 field 객체를 얻는 식이다
6. field 타입의 타입을 getType()메서드로 얻는데 이 과정을 해줘야하는 이유는 필드의 정보를 알아야하거나,
유효성검사나,타입의 정보를 출력할때 필요하기 때문에 getType을 써주는것이다
타입을 얻어서 문자열로 변환하여 fieldType 변수에 담아주고
7.field.setAccessible(true);로 private 타입이었던 클래스에 접근가능하게 만들어준다
8. getClass()는 객체가 속한 클래스의 정보를 반환해주는 메서드다. 그러면서 simplename을 이용해 이름만
반환해주고 그걸 또 변수에 담는다..
9. 필드타입이 int와 동일한 문자열인지 비교하고 그 결과를 반환
10. Object value = field.get(obj); tocsv에서 필드에 있던 오브젝트의 값을 가져와서 value에 담음
그 value를 int형으로 형변환 하고 intvalue변수에 담는다
11. obj 객체에 있는 값을 invalue 값으로 세팅해준다(우리가 저장해준 csv파일에는 int형도,string 형도 담겨있기
때문에 if-esle 문을 사용하여 두번 해주는것)
12. obj 객체 반환
public static List<Object> loadCSV(String file) {
return null;
}
}
- StringBuilder는 Java에서 문자열을 동적으로 수정하기 위해 사용되는 클래스입니다.
- deleteCharAt() 메서드는 StringBuilder 객체에서 지정된 인덱스에 해당하는 문자를 삭제하는 역할을 합니다.
728x90