밀김 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